Runbook: Sağlayıcı kesintisi (APNs / FCM / Web Push / SES / Resend / Twilio / Netgsm)
Geçici olarak tek kanalı durdurmak gerekirse (örn. sağlayıcı yanlış pozitif/tekrar gönderiyor): worker-dispatch servisinin WORKER_QUEUES değerinden ilgili kuyruğu çıkar…
Belirtiler
- Alarm
DispatchFailureRateHigh(dispatch iş başarısızlığı > %5) ya daDeliveryFailureRateHigh(teslimat failed/(sent+failed) > %5). - Alarm
ProviderCredentialsInvalid/ProviderCredentialFailuresSpike: kanalinvalid(auth reddi), teslimaterror_code = CREDENTIALS. - Grafana Sağlayıcılar ve teslimat panosu: tek kanalda (
dispatch-ios,dispatch-email…) başarısızlık;queue_depth{state="delayed"}artışı (rate_limited ertelemeleri). - Loglarda
providerhata kodları (apns:ServiceUnavailable,fcm:UNAVAILABLE,ses:Throttling,twilio:30003).
1. Teşhis (5 dk)
- Sağlayıcı durum sayfası: APNs https://developer.apple.com/system-status/ · FCM https://status.firebase.google.com/ · SES https://health.aws.amazon.com/ · Resend https://resend-status.com · Twilio https://status.twilio.com · Netgsm destek hattı.
- Tek kiracı mı, yaygın mı? Loki:
{service=~"worker-.*"} | json | queue="dispatch-ios" | level="error"→app_iddağılımı.- Tek app → kimlik bilgisi sorunu: dashboard Kanallar → Doğrula; org sahibi zaten
channel invalide-postası aldı (dispatchnotifyChannelInvalid). - Tüm app'ler → sağlayıcı kesintisi ya da ağ/IP engeli (sunucudan
curl -v https://api.push.apple.com/https://fcm.googleapis.com).
- Tek app → kimlik bilgisi sorunu: dashboard Kanallar → Doğrula; org sahibi zaten
- Yeniden deneme planı çalışıyor mu? Geçici hatalar (5xx, timeout, rate_limited) 30 sn → 2 dk → 10 dk → 30 dk → 2 sa aralıklarla
en fazla 6 deneme (docs/plan/05 §5.6);
rate_limiteddeneme sayılmaz (en fazla 10 erteleme). Kuyrukdelayedsayısı bunu gösterir.
2. Müdahale
| Durum | Aksiyon |
|---|---|
| Kısa süreli sağlayıcı kesintisi (< 2 sa) | Hiçbir şey; retry planı taşır. Status page'e degraded olay aç (bileşen delivery), kanalı belirt. |
| Uzun kesinti (> 2 sa) | Son deneme de başarısız olur ve teslimatlar failed olur. Kampanya sahiplerine bildir; kesinti bitince yeniden gönderim için failed teslimatları yeniden kuyruklama kararı ürün ekibine ait (aynı mesaj ikinci kez gidebilir). |
Sağlayıcı hız sınırı (rate_limited, 429) | PROVIDER_RATE_PER_SECOND (apps/worker/src/delivery/types.ts) ve app başına eşzamanlılık (APP_DISPATCH_CONCURRENCY) düşürülmez; sağlayıcıdan kota artışı istenir. Büyük kampanyalar send_at ile yayılır. |
| Kimlik bilgisi reddi (auth) | Kanal invalid: müşteri yeni p8/servis hesabı/VAPID girer → Doğrula. Bizim tarafımızda MASTER_KEY/DEK sorunu varsa key-rotation.md. |
| Webhook/geri bildirim gelmiyor (SES/Twilio) | Sağlayıcıdaki webhook adresi (/hooks/...) ve imza doğrulama loglarını kontrol et (HS_WEBHOOK_SIGNATURE_INVALID). Netgsm sorgulama işi (netgsm-poll) 1 dk'da bir çalışır. |
Geçici olarak tek kanalı durdurmak gerekirse (örn. sağlayıcı yanlış pozitif/tekrar gönderiyor): worker-dispatch servisinin
WORKER_QUEUES değerinden ilgili kuyruğu çıkar (scheduler,audience,dispatch-android,dispatch-hms,dispatch-web,dispatch-email,dispatch-sms)
ve docker compose up -d worker-dispatch; iOS teslimatları kuyrukta bekler, veri kaybı olmaz.
3. Kesinti sonrası
queue_depth{state="delayed"}vefailednormale dönene kadar izle;DeadLetterQueueHighvarsa Bull failed set'ini incele (queue-backlog.md).- Status page olayını kapat; etkilenen kiracı sayısı ve süreyi post-mortem'e yaz.
- Sağlayıcı değişikliği gerekiyorsa (ör. Resend → SES) kanal yapılandırması dashboard'dan değiştirilir; şablon/gönderici alan adı DNS
(SPF/DKIM/DMARC) yeniden doğrulanır (
dns-checkişi 6 saatte bir).
Runbook: Olay yönetimi ve status page
Kaynaklar: Alertmanager (#pushizo-alerts, #pushizo-oncall, e-posta), Grafana panoları (infra/monitoring/grafana/dashboards), Loki logları (request_id ile izleme), Sentry. Status page: https://status.<alan adı> →…
Runbook: Kuyruk birikmesi (queue backlog) ve DLQ
Alarmlar: QueueDepthHigh (waiting + prioritized > 50k, 10 dk; öncelikli işler BullMQ'da prioritized kümesindedir), DeadLetterQueueHigh (failed > 100), WorkerJobsStalled (iş var, tamamlanan yok), WorkerDown. Pano:…