1. Black Friday'de Çöken Sitelerin Ortak 3 Günahı
Her yıl Black Friday ve Efsane Cuma dönemlerinde Türkiye'nin ve dünyanın en büyük markalarının siteleri bile saatlerce erişilemez hale gelir. Bunun arkasında 3 teknik ihmal yatar:
- Yük Testi Yapılmaması: Sistemin gerçekte kaç eşzamanlı kullanıcıda (Concurrency) nefesinin tükendiği önceden test edilmemiştir. İlk 5.000 kişide sunucu kilitlenir.
- Veritabanı Bağlantı Patlaması: Her gelen kullanıcı için veritabanına yeni bir bağlantı açılmaya çalışılır; PostgreSQL 2.000 bağlantıda RAM'i tüketip çöker.
- Soğuk Önbellek (Cold Cache): Kampanya başlamadan önce popüler ürünlerin sayfaları ve fiyatları önbelleğe ısıtılmamıştır (Cache Warming yapılmamıştır).
2. Gerçekçi k6 Stres Testi Senaryosu
Stilmerce altyapısı, kampanya gününden 2 hafta önce açık kaynaklı k6 motoruyla gerçek kullanıcı davranışlarını taklit eden bir simülasyona sokulur:
// k6-black-friday-simulation.js
import http from 'k6/http';
import { check, group, sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 1000 }, // 1. Isınma aşaması (1.000 VU)
{ duration: '5m', target: 15000 }, // 2. Flaş İndirim Başlangıcı (15.000 Eşzamanlı Kullanıcı)
{ duration: '3m', target: 25000 }, // 3. Zirve Yük (Peak Surge: 25.000 VU)
{ duration: '2m', target: 0 }, // 4. Soğuma
],
thresholds: {
http_req_duration: ['p(95)<300'], // %95'lik dilim 300ms altında kalmalı!
http_req_failed: ['rate<0.001'], // Hata oranı binde 1'i aşmamalı!
},
};
export default function () {
group('Kullanıcı Alışveriş Yolculuğu', () => {
// 1. Anasayfa ve Vitrini Gez
const home = http.get('https://api.stilmerce.com/v1/public/home');
check(home, { 'Anasayfa 200': (r) => r.status === 200 });
// 2. Flaş Ürün Detayına Gir
const product = http.get('https://api.stilmerce.com/v1/products/macbook-pro-m4');
check(product, { 'Ürün 200': (r) => r.status === 200 });
// 3. Sepete Ekle ve Rezervasyon Al
const cart = http.post('https://api.stilmerce.com/v1/cart/items', JSON.stringify({
sku: 'MBP-M4-16GB',
qty: 1,
}), { headers: { 'Content-Type': 'application/json' } });
check(cart, { 'Sepet Başarılı': (r) => r.status === 201 });
});
sleep(Math.random() * 2 + 1);
}3. PgBouncer: 10.000 Kullanıcıyı 40 Fiziksel Bağlantıyla Karşılamak
PostgreSQL'in en büyük kısıtlaması, her bağlantı için işletim sisteminde ayrı bir süreç (Process) açmasıdır. 2.000 doğrudan bağlantı yaklaşık 20 GB RAM tüketir ve CPU Context Switching nedeniyle veritabanı kilitlenir.
Stilmerce mimarisinde uygulama ile veritabanı arasına PgBouncer yerleştirilir:
[10.000 Aktif İstemci İsteği]
│
▼ (Hafif TCP Soketleri)
[PgBouncer Havuzu]
│
▼ (Transaction Pooling Modu)
[Yalnızca 40 Fiziksel PostgreSQL Bağlantısı] ──► [PostgreSQL Motoru (CPU %15, RAM Sabit)]
PgBouncer sayesinde bir sorgu bittiği mikrosaniyede o veritabanı bağlantısı sıradaki diğer müşteriye devredilir. 10.000 eşzamanlı istek sanki 40 kişi alışveriş yapıyormuş gibi pürüzsüzce işlenir.
Sanal Bekleme Odası (Virtual Waiting Room)
Trafik öngörülen 50 kat sınırını da aşarsa, Cloudflare Edge üzerinde çalışan Sanal Bekleme Odası devreye girer. Kullanıcılara nazik bir sıra numarası ve tahmini bekleme süresi gösterilir; mağaza asla çökmez ve siparişler sırayla alınır.