PushizoDocs
OperasyonRunbook'lar

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 da DeliveryFailureRateHigh (teslimat failed/(sent+failed) > %5).
  • Alarm ProviderCredentialsInvalid / ProviderCredentialFailuresSpike: kanal invalid (auth reddi), teslimat error_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 provider hata kodları (apns:ServiceUnavailable, fcm:UNAVAILABLE, ses:Throttling, twilio:30003).

1. Teşhis (5 dk)

  1. 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ı.
  2. Tek kiracı mı, yaygın mı? Loki: {service=~"worker-.*"} | json | queue="dispatch-ios" | level="error" → app_id dağılımı.
    • Tek app → kimlik bilgisi sorunu: dashboard Kanallar → Doğrula; org sahibi zaten channel invalid e-postası aldı (dispatch notifyChannelInvalid).
    • 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).
  3. 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_limited deneme sayılmaz (en fazla 10 erteleme). Kuyruk delayed sayısı bunu gösterir.

2. Müdahale

DurumAksiyon
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"} ve failed normale dönene kadar izle; DeadLetterQueueHigh varsa 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-check işi 6 saatte bir).

Bu sayfada