Ölçekleme
Referans sayılar
bun run load-test ile ölçüldü (100 000 abone, mock transport, %2 hata, dizüstü sınıfı M serisi donanım):
| Yol | 100K push | Hız |
|---|---|---|
Yalnızca işlemciler (--mode=direct) | ~27 sn | 3,7K msg/sn |
Gerçek BullMQ + Redis üzerinden (--mode=queue) | ~29 sn | 3,4K msg/sn |
Darboğaz transport'lar değil, Mongo yazımlarıdır (push başına bir olay ve bir lastNotifiedAt güncellemesi). 4 vCPU'lu bir VPS 84K abonelik bir kampanyayı bir dakikanın epey altında bitirir.
| Kitle | Kurulum | Kaba maliyet |
|---|---|---|
| < 50K | 2 vCPU / 4 GB VPS, her şey Compose'da | ~8 $/ay |
| 50K – 500K | 4 vCPU / 8 GB + ayrı Mongo | ~25 $/ay |
| 500K – 5M | 3 worker node + Mongo replica set | ~120 $/ay |
Bir gönderim nasıl akar
POST /send → segment sayımı → subscriptions üzerinde cursor
→ 1000'lik parçalar → push-ios / push-android / push-web'e push başına bir iş
→ worker: teslimat kuralları → transport → olay + sayaçlar
Platform başına ayrı üç kuyruk, bilerek: APNs, FCM ve web push'un rate limit'leri ve hata karakterleri farklıdır; birinin tıkanması diğerlerini durdurmamalı.
Belirtiye göre düğmeler
| Belirti | Çevir |
|---|---|
| Kampanya uzun sürüyor, worker'lar boşta | Worker kopyası ekleyin (--scale worker=3). Kuyruklar paylaşımlıdır. |
| Kampanya uzun sürüyor, worker'lar meşgul, Mongo CPU yüksek | Mongo'yu kendi host'una / replica set'e taşıyın; WiredTiger'a daha çok önbellek verin (MONGO_CACHE_GB). |
APNs'ten 429 TooManyRequests | APNS_CONCURRENCY ya da PUSH_RATE_LIMIT_MAX'ı düşürün. |
FCM'den QUOTA_EXCEEDED | FCM_CONCURRENCY'yi düşürün. OAuth token'ı Redis'te paylaşılır; kopyalar token isteklerini çoğaltmaz. |
| Web push yavaş | Endpoint host başına gecikme (Apple, Mozilla, Google) baskındır. WEBPUSH_CONCURRENCY'yi yükseltin; I/O'ya bağlıdır. |
Subscribe patlamasında API 503 | API'yi ölçekleyin; trafik meşruysa SUBSCRIBE_RATE_LIMIT'i yükseltin. |
| Redis belleği büyüyor | Tamamlanan işler kırpılır (removeOnComplete/removeOnFail). Yine büyüyorsa worker'ın çalıştığından emin olun — boşta kuyruk, dolu kuyruktur. |
Beklediğiniz gibi ölçeklenmeyenler
- Saatleri farklı birden fazla APNs JWT imzalayıcı çalıştırmayın. Token en fazla 20 dakikada bir yenilenir; daha sık yenileme
TooManyProviderTokenUpdatesgetirir. Worker JWT'yi uygulama başına önbellekler. - "Bellek tasarrufu" için Redis'i
allkeys-lru'ya almayın. BullMQ job hash'leri sessizce silinir. - Uygulama başına shard yapmayın. Her sorgu zaten
appIdile kapsanmış ve indexlidir; bir küme çok kiracıya hizmet eder. - Rate limit'ler API süreci başınadır. Kötüye kullanım koruması için yeterli; tam küresel limit gerekiyorsa API'nin önüne bunu yapan bir proxy koyun.
Bun ve HTTP/2
APNs HTTP/2 ister; transport yalnızca node:http2 ile yazıldı — Bun.* API'si yok. Bun'ın HTTP/2 istemcisi yük altında sürüme duyarlıdır. Yüksek eşzamanlılıkta iOS kuyruğunda takılma görürseniz yalnızca worker'ın Dockerfile'ını Node.js tabanlı bir imaja çevirin; kod değişmez.