Alışveriş Sepeti

Sepetiniz boş

Güvenlik & Altyapı · 16 dk

Black Friday & Flaş Kampanyalara Hazırlık: k6 Yük Testi, PgBouncer ve Sanal Bekleme Odası Mimarisi

Normal günün 50 katı anlık trafik geldiğinde sunucuların kilitlenmesini engelleyen k6 stres testleri, 10.000 isteği 40 bağlantıyla karşılayan PgBouncer ve Sanal Bekleme Odası mimarimiz.

Yazar: Stilgen Infrastructure & QA

Black Friday & Flaş Kampanyalara Hazırlık: k6 Yük Testi, PgBouncer ve Sanal Bekleme Odası Mimarisi

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:

  1. 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.
  2. 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.
  3. 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.