Ana içeriğe geç

Ö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):

Yol100K pushHız
Yalnızca işlemciler (--mode=direct)~27 sn3,7K msg/sn
Gerçek BullMQ + Redis üzerinden (--mode=queue)~29 sn3,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.

KitleKurulumKaba maliyet
< 50K2 vCPU / 4 GB VPS, her şey Compose'da~8 $/ay
50K – 500K4 vCPU / 8 GB + ayrı Mongo~25 $/ay
500K – 5M3 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ştaWorker kopyası ekleyin (--scale worker=3). Kuyruklar paylaşımlıdır.
Kampanya uzun sürüyor, worker'lar meşgul, Mongo CPU yüksekMongo'yu kendi host'una / replica set'e taşıyın; WiredTiger'a daha çok önbellek verin (MONGO_CACHE_GB).
APNs'ten 429 TooManyRequestsAPNS_CONCURRENCY ya da PUSH_RATE_LIMIT_MAX'ı düşürün.
FCM'den QUOTA_EXCEEDEDFCM_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 503API'yi ölçekleyin; trafik meşruysa SUBSCRIBE_RATE_LIMIT'i yükseltin.
Redis belleği büyüyorTamamlanan 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 TooManyProviderTokenUpdates getirir. 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 appId ile 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.