Bir bildirim (notification) sistemi nasıl tasarlanır?
Cevap
Gereksinimler
- Kanallar: uygulama içi, e-posta, SMS, mobil push.
- Kullanıcı tercihleri (hangi kanaldan, hangi tür bildirim), sessiz saatler.
- Yüksek hacim, yeniden deneme, aynı bildirimin iki kez gitmemesi.
Mimari
Servisler -> Notification API -> Kuyruk -> Kanal worker'ları -> Sağlayıcılar
(sipariş, (doğrulama, (Kafka/ (email, sms, (SES, Twilio,
yorum...) tercih, şablon) SQS) push, in-app) FCM, APNs)- Olay üreten servis
{userId, type, data, idempotencyKey}gönderir. - Notification servisi tercihleri ve sessiz saatleri kontrol eder, şablonu doldurur, kanal başına iş üretir.
- Her kanal ayrı kuyruk ve worker'a sahiptir; SMS sağlayıcısının yavaşlaması e-postayı etkilemez.
- Worker sağlayıcıyı çağırır; hata olursa üstel geri çekilme (exponential backoff) ile yeniden dener, kalıcı hatalar dead-letter queue'ya gider.
- Durum (
queued,sent,delivered,failed) veritabanına yazılır.
Kritik noktalar
- Idempotency: kuyruklar genelde "en az bir kez" teslim eder;
idempotencyKeyile tekrarlar elenir. - Uygulama içi bildirim: veritabanına yazılır, kullanıcı çevrim içiyse WebSocket/SSE ile anında itilir, okunmamış sayısı cache'lenir.
- Önceliklendirme: şifre sıfırlama kodu ile pazarlama e-postası aynı kuyrukta beklememeli.
- Toplama (batching): "5 kişi gönderini beğendi" gibi birleştirme spam'i azaltır.
- Sağlayıcı kotaları için kanal bazında rate limit.
İlgili Sistem Tasarımı soruları
- Dikey ve yatay ölçekleme arasındaki fark nedir?
- Hangi cache stratejilerini biliyorsunuz?
- REST ile GraphQL arasındaki farklar nelerdir?
- Bit.ly benzeri bir URL kısaltma servisi tasarlayın.
- Google Docs benzeri gerçek zamanlı ortak düzenleme yüksek seviyede nasıl tasarlanır?
- CDN nedir, nasıl çalışır ve hangi durumlarda kullanılır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.