Projetando um Sistema Global de Notificações: Guia Completo de System Design

Software Architect
Pós-graduado em arquitetura de software e soluções. Conecto profundidade técnica com resultados de negócio para entregar produtos que as pessoas realmente usam. Também mentoro desenvolvedores e criadores em programas ao vivo, podcasts e iniciativas de comunidade focadas em tecnologia inclusiva.
Productos gratuitos y de pago para convertir ideas en una base que puedas lanzar.
13 productos disponiblesContinúa explorando temas similares

A production-grade system design for building distributed rate limiting across APIs and microservices, covering algorithms, token state storage, global consistency trade-offs, per-tenant quotas, adapt

# Projetando um URL Shortener em Escala: Guia Definitivo de System Design Resumo: Um guia completo para projetar um encurtador de URL como bit.ly e TinyURL, cobrindo geração de c

# Projetando o Uber em Escala: Um Guia Completo de System Design Resumo: Um guia completo de system design para construir uma plataforma de compartilhamento de corridas lidando c
Una lista de 47 puntos para encontrar errores, riesgos de seguridad y problemas de rendimiento antes del lanzamiento.
Templates probados en producción, usados por desarrolladores. Ahorra semanas de setup en tu próximo proyecto.

Resumo: Um guia de arquitetura em nível de produção para plataformas de notificação multicanal (push, email, SMS e in-app), cobrindo ingestão de eventos, preferências e consentimento, roteamento, templates, entrega, deduplicação, retries, confiabilidade e observabilidade.
Publicado: Fevereiro 2026 Tempo de leitura: 85 minutos Palavras-chave: #SystemDesign #NotificationSystem #Push #Email #SMS #InApp #SistemasDistribuídos #Escalabilidade #EntrevistaTécnica
Um usuário conclui um pedido. Em segundos, o sistema precisa enviar:
E precisa evitar:
Esse é o desafio real: enviar é fácil; enviar certo, no canal certo e no tempo certo, em escala global, é difícil.
| Requisito | Meta | Motivo |
|---|---|---|
| Latência fim-a-fim push transacional | < 5s p95 | eventos críticos de negócio |
| Disponibilidade | 99,99% no caminho transacional | confiança do usuário |
| Throughput | milhões/min | plataformas de grande escala |
| Correção de dedupe | muito alta | duplicata destrói UX |
| Compliance de preferência | estrito | risco legal e reputacional |
| Custo | monitorado por canal | SMS/email escalam custo rápido |
Premissas:
DAU: 300 milhões
Eventos/dia que disparam notificação: 15 bilhões
Fanout médio por evento: 1,4
Notificações/dia: 21 bilhões
Mix:
- Push 70%
- Email 20%
- SMS 5%
- In-app 5%
Pico: 6x
Notificações/s média ~= 243.055
Pico ~= 1.458.330/s
Push ~= 1.020.831/s
Email ~= 291.666/s
SMS ~= 72.916/s
In-app ~= 72.916/s
Com 450 bytes de metadata por notificação:
21B * 450B ~= 9,45TB/dia
A complexidade maior está em policy, dedupe e confiabilidade por canal, não na serialização da mensagem.
RECEIVED -> ELIGIBLE -> SCHEDULED -> DISPATCHED -> PROVIDER_ACCEPTED -> DELIVERED/FAILED
POST /v1/notifications/emit
{
"event_id": "evt_441",
"event_type": "ORDER_CONFIRMED",
"tenant_id": "t_22",
"user_id": "u_77",
"priority": "HIGH",
"payload": {
"order_id": "ord_991",
"amount": "129.99",
"currency": "USD"
},
"idempotency_key": "3f9d63d6-8dd0-4a4e-96a2-5cf5ae5f9f12"
}
{
"notification_id": "n_991",
"channel": "PUSH",
"provider": "FCM",
"attempt": 1,
"state": "PROVIDER_ACCEPTED",
"provider_message_id": "fcm_abc",
"occurred_at": "2026-02-22T23:22:01Z"
}
{
"user_id": "u_77",
"eligible_channels": ["PUSH", "IN_APP"],
"suppressed_channels": [
{ "channel": "SMS", "reason": "NO_CONSENT" },
{ "channel": "EMAIL", "reason": "QUIET_HOURS" }
]
}
Consentimento precisa histórico auditável (quem, quando, como).
{
"template_id": "order_confirmed_v5",
"channel": "EMAIL",
"locale": "pt-BR",
"subject": "Seu pedido {{order_id}} foi confirmado",
"body": "Oi {{first_name}}, total {{amount}} {{currency}}.",
"version": 5,
"status": "ACTIVE"
}
pt-BR -> pt -> en-US),ORDER_CONFIRMED:
- primário: PUSH
- fallback: EMAIL
- SMS apenas para casos críticos
{
"notification_id": "n_991",
"selected_channels": ["PUSH", "IN_APP"],
"deferred_channels": ["EMAIL"],
"deferred_until": "2026-02-23T08:00:00-03:00",
"policy_version": "route_policy_v12"
}
Batch melhora throughput e custo, mas aumenta latência. Ajustar janela por canal.
Conectores por canal devem ter isolamento de falha.
(tenant_id, user_id, event_type, business_object_id, channel, dedupe_window)
CREATE TABLE notification_dedupe (
dedupe_key VARCHAR(256) PRIMARY KEY,
notification_id VARCHAR(64) NOT NULL,
created_at TIMESTAMP NOT NULL,
expire_at TIMESTAMP NOT NULL
);
Exemplo:
imediato, +5s, +30s, +2m, +10m, depois DLQ
pref:user:{user_id}
consent:user:{user_id}:{channel}
template:{template_id}:{locale}:{version}
dedupe:{dedupe_key}
schedule:{notification_id}
| Evento | Primário | Fallback |
|---|---|---|
| pagamento confirmado | push | |
| login suspeito | push | SMS + email |
| campanha | opcional push |
| Domínio | SLI | SLO |
|---|---|---|
| push transacional | p95 e2e | < 5s |
| disponibilidade pipeline | sucesso | > 99,99% |
| dedupe visível | taxa de duplicata | abaixo da meta |
| compliance de preferência | violação | próximo de zero |
| fila | lag p95 | dentro da meta por canal |
x-request-id
x-notification-id
x-user-id
x-channel
x-template-version
x-policy-version
Problema: violação de compliance e dano de marca.
Correção: gate de preferência antes do envio.
Problema: campanha atrasa notificação crítica.
Correção: filas por prioridade.
Problema: usuário recebe duplicatas em retries/eventos repetidos.
Correção: dedupe multi-camada.
Problema: falha de email derruba push.
Correção: isolamento por canal.
Problema: sem debug de falha real.
Correção: state machine + logs de attempt.
Problema: UX ruim e risco regulatório.
Correção: scheduler timezone-aware.
Problema: risco de privacidade.
Correção: minimização e tokenização.
Sistema de notificação em escala é plataforma de decisão, não apenas "sender".
Arquitetura madura exige:
Esse tema é recorrente em entrevistas porque testa design distribuído, produto e operação ao mesmo tempo.
| Componente | Responsabilidade |
|---|---|
| Ingest API | receber intents/eventos |
| Preference Service | elegibilidade por canal/tópico |
| Template Service | renderização localizada |
| Routing Engine | decisão de canal |
| Scheduler | prioridade e horário |
| Delivery Orchestrator | envio e controle de attempts |
| Channel Connectors | integração com provedores |
| Dedupe Service | evitar duplicatas |
| Retry/DLQ | resiliência e recuperação |
1) Classes de notificação.
2) Ingest + normalize.
3) Preference/consent gate.
4) Route + render + dedupe.
5) Schedule por prioridade/timezone.
6) Dispatch com retry e DLQ.
7) Observabilidade + compliance.
Você agora tem um blueprint completo para sistema de notificações multicanal em escala global.