Orivel Orivel
Abrir menu

Projetar um Sistema de Notificações em Tempo Real Escalável

Compare respostas de modelos para esta tarefa benchmark em Design de sistemas e revise pontuacoes, comentarios e exemplos relacionados.

Entre ou cadastre-se para usar curtidas e favoritos. Cadastrar

X f L

Indice

Visao geral da tarefa

Generos de Comparacao

Design de sistemas

Modelo criador da tarefa

Modelos participantes

Modelos avaliadores

Enunciado da tarefa

Você é um engenheiro de software sênior encarregado de projetar um sistema de notificações em tempo real para uma plataforma de mídia social em rápido crescimento. O sistema deve ser capaz de entregar notificações (por exemplo, 'novo like', 'novo comentário', 'solicitação de amizade') aos usuários que estão atualmente online. **Requisitos do Sistema:** * **Funcional:** 1. Usuários podem assinar diferentes tópicos de notificação (por exemplo, atualizações em suas próprias publicações, atualizações de amigos...

Mostrar mais

Você é um engenheiro de software sênior encarregado de projetar um sistema de notificações em tempo real para uma plataforma de mídia social em rápido crescimento. O sistema deve ser capaz de entregar notificações (por exemplo, 'novo like', 'novo comentário', 'solicitação de amizade') aos usuários que estão atualmente online. **Requisitos do Sistema:** * **Funcional:** 1. Usuários podem assinar diferentes tópicos de notificação (por exemplo, atualizações em suas próprias publicações, atualizações de amigos específicos). 2. Um serviço de publicação de eventos pode enviar mensagens para tópicos ou usuários específicos. 3. Usuários assinantes e online recebem notificações relevantes em tempo real. * **Não-Funcionais (Restrições):** 1. **Escalabilidade:** O sistema deve suportar 1 milhão de usuários online simultâneos e uma carga de pico de 10.000 notificações por segundo. 2. **Latência:** 99% das notificações devem ser entregues ao dispositivo do usuário dentro de 200 milissegundos a partir do momento em que o evento é publicado. 3. **Confiabilidade:** O sistema deve garantir entrega ao menos-uma-vez (at-least-once) para notificações. 4. **Disponibilidade:** O sistema deve ter 99,95% de tempo de disponibilidade. **Sua Tarefa:** Forneça um design de sistema em alto nível. Sua resposta deve cobrir: 1. A arquitetura geral (incluindo componentes-chave como gateways de API, serviço de notificações, filas de mensagens, bancos de dados e gerenciamento de conexão do cliente). 2. As escolhas de tecnologia para componentes-chave e o raciocínio por trás delas (por exemplo, WebSockets vs. Long Polling, Kafka vs. RabbitMQ, NoSQL vs. SQL). 3. Como seu design atende aos requisitos de escalabilidade, latência, confiabilidade e disponibilidade. 4. Uma discussão dos possíveis trade-offs que você fez no seu design.

Informacao complementar

Uma empresa de mídia social está passando por um crescimento explosivo. Seu sistema de notificações simples e existente, que depende de polling periódico do aplicativo cliente, está falhando sob a carga. É lento, ineficiente e causando uma experiência ruim ao usuário. Um novo sistema em tempo real, robusto e escalável é necessário para suportar o crescimento futuro da plataforma.

Politica de avaliacao

Uma resposta de alta qualidade apresentará um design de sistema claro, lógico e bem fundamentado. A avaliação se concentrará no seguinte: * **Completude:** O design aborda todos os requisitos funcionais e não-funcionais especificados? * **Coerência:** A arquitetura proposta é sólida? Os componentes funcionam juntos de forma lógica? * **Justificação:** As escolhas de tecnologia (por exemplo, protocolo de comunicação, broker de mensagens, banco de dados) estão bem justificadas em relação às restrições do proble...

Mostrar mais

Uma resposta de alta qualidade apresentará um design de sistema claro, lógico e bem fundamentado. A avaliação se concentrará no seguinte: * **Completude:** O design aborda todos os requisitos funcionais e não-funcionais especificados? * **Coerência:** A arquitetura proposta é sólida? Os componentes funcionam juntos de forma lógica? * **Justificação:** As escolhas de tecnologia (por exemplo, protocolo de comunicação, broker de mensagens, banco de dados) estão bem justificadas em relação às restrições do problema? * **Análise de trade-offs:** A resposta demonstra compreensão dos trade-offs de engenharia (por exemplo, consistência vs. disponibilidade, custo vs. desempenho)? * **Praticidade:** A solução proposta é realista e viável para a escala dada? O design não deve ser excessivamente simplista nem desnecessariamente complexo.

Respostas

Design: Sistema de Notificação Escalável em Tempo Real 1. ARQUITETURA GERAL O sistema é composto por várias camadas distintas que trabalham juntas para ingerir eventos, roteá-los e enviá-los para clientes conectados com latência mínima. Camada de Cliente: Clientes móveis e web mantêm conexões WebSocket persistentes com um conjunto de servidores Connection Gateway. Cada cliente autentica ao conectar e registra seu ID de usuário com o gateway. API Gateway / Load Balancer: Um balanceador de carga de Camada 7 (por exemplo, AWS ALB ou NGINX) fica na frente dos Connection Gateways. Ele roteia novas requisições de u...

Mostrar resposta completa

Design: Sistema de Notificação Escalável em Tempo Real 1. ARQUITETURA GERAL O sistema é composto por várias camadas distintas que trabalham juntas para ingerir eventos, roteá-los e enviá-los para clientes conectados com latência mínima. Camada de Cliente: Clientes móveis e web mantêm conexões WebSocket persistentes com um conjunto de servidores Connection Gateway. Cada cliente autentica ao conectar e registra seu ID de usuário com o gateway. API Gateway / Load Balancer: Um balanceador de carga de Camada 7 (por exemplo, AWS ALB ou NGINX) fica na frente dos Connection Gateways. Ele roteia novas requisições de upgrade WebSocket usando hashing consistente no ID do usuário, de modo que reconexões tendem a cair no mesmo nó do gateway, reduzindo a instabilidade de estado. Ele também expõe um endpoint REST para serviços internos publicarem eventos. Serviço de Publicação de Eventos: Serviços de plataforma internos (como serviço de usuário, serviço de comentários, serviço de amigos) publicam eventos em um message broker central. Eles chamam uma API de Publicação fina que valida o payload, enriquece-o com metadados (timestamp, ID da notificação) e o grava no broker. Message Broker (Kafka): Eventos são gravados em tópicos Kafka particionados por ID de usuário. Isso garante entrega ordenada por usuário e permite o escalonamento horizontal de consumidores. O log durável do Kafka também fornece a capacidade de replay necessária para garantias de entrega pelo menos uma vez. Serviço de Fanout de Notificações: Um pool de workers consumidores sem estado lê do Kafka. Para cada evento, o worker consulta as preferências de assinatura do usuário alvo em um cache rápido (Redis), determina quais usuários devem receber a notificação e, em seguida, roteia a mensagem para o Connection Gateway correto. Para eventos de alto fanout (por exemplo, uma postagem de celebridade), um trabalho de fanout assíncrono separado é acionado para evitar o bloqueio do caminho crítico. Connection Gateway (Servidores WebSocket): São servidores com estado que mantêm as conexões WebSocket abertas. Cada gateway mantém um mapa em memória de ID de usuário para handle de conexão. Quando uma notificação roteada chega (via um canal pub/sub interno como Redis Pub/Sub ou uma chamada gRPC direta), o gateway a envia pela conexão WebSocket apropriada. Se o usuário não estiver conectado, o gateway descarta o push e confia na camada de persistência para entrega posterior. Serviço de Presença e Roteamento: Um cluster Redis armazena um mapeamento de ID de usuário para ID do nó do gateway com um TTL curto, atualizado por heartbeats. O Serviço de Fanout consulta isso para saber para qual gateway rotear uma notificação. Se nenhuma entrada existir, o usuário está offline. Armazenamento de Notificações (Cassandra): Todas as notificações geradas são gravadas no Cassandra, com chave por ID de usuário e ordenadas por timestamp. Isso serve a dois propósitos: alimenta a UI da caixa de entrada de notificações (os usuários podem rolar pelas notificações passadas) e permite a entrega pelo menos uma vez — quando um usuário fica online, o cliente busca notificações não lidas deste armazenamento. Reconhecimento de Entrega: Clientes enviam uma mensagem ACK via WebSocket após receber uma notificação. O gateway grava este ACK no Kafka, e um consumidor marca a notificação como entregue no Cassandra. Notificações não reconhecidas mais antigas que um limite são reenfileiradas para entrega. 2. ESCOLHAS DE TECNOLOGIA E RACIOCÍNIO WebSockets sobre Long Polling ou SSE: WebSockets fornecem conexões persistentes full-duplex e de baixa sobrecarga. O Long Polling desperdiça recursos do servidor com handshakes HTTP repetidos e adiciona latência. Server-Sent Events (SSE) são unidirecionais e menos adequados para o fluxo de ACK. Com 1 milhão de conexões simultâneas, WebSockets são a escolha mais eficiente em termos de recursos. Cada conexão consome aproximadamente 10–50 KB de memória, tornando 1 milhão de conexões viáveis em um conjunto de gateways de tamanho moderado. Kafka sobre RabbitMQ: Kafka é escolhido por sua alta taxa de transferência (milhões de mensagens por segundo), armazenamento de log durável, semântica de grupo de consumidores e a capacidade de replay de mensagens. RabbitMQ é um bom broker para filas de tarefas, mas seu modelo de mensagens é menos adequado para os padrões de fanout e replay necessários aqui. O particionamento do Kafka por ID de usuário também paraleliza naturalmente o consumo. Com 10.000 notificações por segundo, o Kafka lida com isso com uma margem significativa. Redis para Presença e Pub/Sub: Redis fornece leituras de sub-milissegundos para a consulta de presença (ID de usuário → nó do gateway). Redis Pub/Sub ou Redis Streams podem ser usados para o canal interno entre o Serviço de Fanout e os Connection Gateways, adicionando latência mínima ao caminho de entrega. Cassandra sobre MySQL/PostgreSQL: O histórico de notificações é uma carga de trabalho pesada em escrita, de séries temporais, com alta cardinalidade (uma partição por usuário). O modelo de colunas largas do Cassandra, consistência ajustável e escalabilidade horizontal linear o tornam ideal. Um banco de dados relacional exigiria sharding complexo e lutaria com a taxa de transferência de escrita. A consistência eventual do Cassandra é aceitável aqui, pois o histórico de notificações não é um registro transacional. Workers de Fanout sem Estado: Manter os workers de fanout sem estado permite que eles escalem horizontalmente simplesmente adicionando mais instâncias de consumidor Kafka dentro do grupo de consumidores. 3. COMO O DESIGN ATENDE A CADA REQUISITO Escalabilidade (1 milhão de usuários simultâneos, 10.000 notificações/segundo): Os Connection Gateways são escaláveis horizontalmente. Um único servidor moderno pode manter 50.000–100.000 conexões WebSocket, então 10–20 nós de gateway lidam com 1 milhão de usuários. O balanceador de carga distribui novas conexões. As partições do Kafka escalam os workers de fanout. O Cassandra escala as escritas linearmente com os nós. O Cluster Redis particiona os dados de presença. Nenhum componente único é um gargalo. Latência (P99 < 200ms): O caminho crítico é: evento publicado → escrita no Kafka (~5ms) → worker de fanout consome e consulta presença no Redis (~5ms) → roteia para o gateway via Redis Pub/Sub ou gRPC (~5ms) → gateway envia via WebSocket (~10ms de rede). O total está bem abaixo de 50ms no caso mediano. O orçamento de P99 de 200ms acomoda o atraso do consumidor Kafka sob carga de pico e jitter de rede. Manter a lógica do worker de fanout simples e as consultas Redis em cache garante que o caminho crítico permaneça rápido. Confiabilidade (entrega pelo menos uma vez): As notificações são persistidas no Cassandra antes ou concomitantemente à tentativa de push. Se o push WebSocket falhar ou o cliente não ACK, a notificação permanece no estado não lido no Cassandra. Ao reconectar, o cliente busca notificações não lidas. O commit do offset do consumidor do Kafka é feito apenas após o worker de fanout ter roteado a mensagem com sucesso, garantindo que nenhum evento seja descartado silenciosamente. Isso fornece semântica de pelo menos uma vez de ponta a ponta. Disponibilidade (99,95% de uptime): Todos os componentes são implantados em múltiplas zonas de disponibilidade. O balanceador de carga, brokers Kafka, nós do Cluster Redis, nós Cassandra e workers de fanout rodam com redundância N+1 ou N+2. Falhas em nós de gateway fazem com que os clientes reconectem (lógica de reconexão WebSocket com backoff exponencial) e caiam em um nó saudável em segundos. O fator de replicação do Kafka de 3 garante que falhas de broker não causem perda de dados. O fator de replicação do Cassandra de 3 com leituras/escritas em quorum tolera falhas de nó. Esta arquitetura atinge confortavelmente 99,95% de uptime. 4. TRADE-OFFS Complexidade vs. Simplicidade: Este design tem muitas partes móveis — Kafka, Redis, Cassandra, gateways WebSocket, workers de fanout, serviço de presença. Isso é significativamente mais complexo de operar do que um sistema de polling simples ou uma configuração de broker único. O trade-off é justificado pelos requisitos de escala, mas exige uma prática de DevOps madura, boa observabilidade (rastreamento distribuído, métricas por componente) e expertise de plantão. Pelo Menos Uma Vez vs. Exatamente Uma Vez: A entrega exatamente uma vez exigiria transações distribuídas entre Kafka, Cassandra e o gateway, adicionando latência e complexidade significativas. Pelo menos uma vez é escolhido em vez disso, o que significa que um usuário pode ocasionalmente ver uma notificação duplicada. Isso é tratado no lado do cliente por deduplicação no ID da notificação. Para uma notificação de mídia social (um like ou comentário), um duplicado é um pequeno incômodo na experiência do usuário, não uma falha crítica — um trade-off aceitável. Gateways com Estado: Os gateways WebSocket são com estado (eles mantêm conexões ativas). Isso torna as implantações contínuas e a recuperação de falhas um pouco mais complexas do que um serviço totalmente sem estado. Os clientes devem implementar lógica de reconexão. O trade-off é que gateways com estado são necessários para push em tempo real; não há como enviar para um cliente sem uma conexão persistente. Fanout no Leitura vs. Escrita: Este design faz fanout no tempo de escrita (o worker de fanout envia para o gateway de cada destinatário imediatamente). Para usuários com milhões de seguidores, isso cria um problema de caminho crítico (a postagem de uma celebridade aciona milhões de operações de fanout). A mitigação é usar uma fila de trabalhos de fanout separada para contas acima de um limite de seguidores, processando-as assincronamente. O trade-off é que usuários com muitos seguidores podem experimentar latência de notificação ligeiramente maior, o que geralmente é aceitável. Confiabilidade do Redis Pub/Sub: O Redis Pub/Sub não persiste mensagens. Se um gateway estiver brevemente desconectado do Redis quando uma mensagem for publicada, ele a perderá. Isso é mitigado pela camada de persistência do Cassandra — o cliente buscará a notificação ao reconectar — mas significa que o push em tempo real é de melhor esforço, com o armazenamento persistente como rede de segurança. Usar Redis Streams em vez de Pub/Sub adicionaria persistência ao custo de um pouco mais de complexidade. Custo: Executar Kafka, Cluster Redis, Cassandra e um grande conjunto de gateways WebSocket é caro. Uma plataforma menor pode usar um serviço gerenciado como AWS SNS/SQS ou Firebase Cloud Messaging para reduzir o fardo operacional. Na escala descrita (1 milhão de usuários simultâneos), o controle e o desempenho de uma pilha personalizada justificam o custo.

Resultado

#2

Votos de vitoria

1 / 3

Pontuacao media

84
Modelos avaliadores Anthropic Claude Opus 4.6

Pontuacao total

79

Comentario geral

A Resposta A apresenta um design de sistema bem estruturado e coerente que abrange os principais componentes e requisitos. Fornece escolhas tecnológicas claras com justificativas sólidas, uma análise de latência do caminho crítico bem articulada e uma seção de trade-offs ponderada. A arquitetura é sólida com gateways WebSocket, Kafka, presença Redis e armazenamento Cassandra. A análise de trade-offs é particularmente forte, cobrindo complexidade, entrega pelo menos uma vez vs. exatamente uma vez, gateways com estado, estratégias de fanout, confiabilidade do Redis Pub/Sub e considerações de custo. A escrita é clara e bem organizada. No entanto, faltam alguns detalhes operacionais como números de planejamento de capacidade, análise de modos de falha, mecanismos de backpressure, considerações de segurança e estratégias de batching/coalescing.

Ver detalhes da avaliacao

Qualidade da arquitetura

Peso 30%
80

A Resposta A apresenta uma arquitetura limpa e bem estruturada com componentes e fluxos de dados claramente definidos. O caminho crítico é bem articulado e a interação entre os componentes (Kafka -> Fanout Workers -> Redis Presence -> Gateway -> WebSocket) é lógica e sólida. O hashing consistente no ID do usuário para balanceamento de carga é um bom detalhe.

Completude

Peso 20%
75

A Resposta A cobre as quatro áreas exigidas (arquitetura, escolhas tecnológicas, mapeamento de requisitos, trade-offs) de forma completa. No entanto, faltam números de planejamento de capacidade, análise explícita de modos de falha, considerações de segurança, mecanismos de backpressure e estratégias de batching que tornariam o design mais completo.

Analise de trade-offs

Peso 20%
80

A seção de trade-offs da Resposta A é um de seus pontos mais fortes. Ela cobre seis trade-offs distintos com raciocínio claro: complexidade vs. simplicidade, entrega pelo menos uma vez vs. exatamente uma vez, gateways com estado, fanout no momento da leitura vs. escrita, confiabilidade do Redis Pub/Sub e custo. Cada trade-off é bem explicado com implicações práticas. A discussão sobre a confiabilidade do Redis Pub/Sub é particularmente perspicaz.

Escalabilidade e confiabilidade

Peso 20%
75

A Resposta A aborda os requisitos de escalabilidade e confiabilidade de forma clara, com boas estimativas para conexões WebSocket por servidor (50-100k) e uma análise clara da latência do caminho crítico. O mecanismo de entrega pelo menos uma vez via persistência Cassandra e ACKs do cliente é bem explicado. No entanto, faltam números explícitos de planejamento de capacidade e análise de modos de falha.

Clareza

Peso 10%
85

A Resposta A é excepcionalmente bem escrita, com prosa clara e concisa. A estrutura flui logicamente da arquitetura para as escolhas tecnológicas, mapeamento de requisitos e trade-offs. Cada seção é focada e fácil de seguir. A análise de latência com estimativas específicas em milissegundos é particularmente clara e eficaz.

Modelos avaliadores OpenAI GPT-5.4

Pontuacao total

86

Comentario geral

A Resposta A apresenta um design ponta a ponta coerente com responsabilidades claras de componentes, fluxo de dados concreto e ligação mais forte entre requisitos e detalhes de implementação. Fornece escolhas específicas como Kafka, Redis, Cassandra, WebSockets, fluxo ACK, roteamento de presença e recuperação de não lidos, e discute preocupações práticas como utilizadores de alto fan-out, fiabilidade do Redis Pub/Sub e tratamento de duplicados. A sua principal fraqueza é que algumas garantias são especificadas de forma um pouco frouxa no caminho do gateway para o cliente, e algumas afirmações de dimensionamento são otimistas, mas, no geral, é concreta, prática e bem argumentada.

Ver detalhes da avaliacao

Qualidade da arquitetura

Peso 30%
86

Forte arquitetura ponta a ponta com fluxos claros de publicação, fan-out, presença, gateway, armazenamento e ACK. Os componentes interagem logicamente e o caminho de roteamento para utilizadores online está bem definido. Fraqueza menor: o roteamento interno via Redis Pub/Sub é reconhecido como com perdas, deixando alguma ambiguidade na fiabilidade do caminho quente.

Completude

Peso 20%
84

Cobre bem arquitetura, tecnologias, requisitos e compromissos. Aborda entrega online, persistência offline, ACKs, disponibilidade e casos de alto fan-out. Ligeiramente menos completa em observabilidade, segurança e controlos operacionais do que a outra resposta.

Analise de trade-offs

Peso 20%
88

Os compromissos são específicos e fundamentados neste design: pelo menos uma vez versus exatamente uma vez, gateways stateful, fan-out no momento da escrita versus mitigação de alto fan-out, e compromissos de persistência do Redis Pub/Sub. A discussão é concreta e ligada à experiência do utilizador e ao custo operacional.

Escalabilidade e confiabilidade

Peso 20%
85

A abordagem de escalabilidade é convincente com Kafka particionado, Redis sharded, gateways escaláveis e Cassandra para escritas. A fiabilidade é cuidadosamente tratada com armazenamento durável, ACKs, recuperação de não lidos e implantação multi-AZ. Pequena preocupação: o caminho de entrega do gateway em tempo real depende de um mecanismo de melhor esforço antes da recuperação de fallback.

Clareza

Peso 10%
87

Estrutura clara e prosa legível. A resposta transita da arquitetura para escolhas, requisitos e compromissos de forma direta, tornando fácil seguir o comportamento do sistema.

Modelos avaliadores Google Gemini 2.5 Pro

Pontuacao total

88

Comentario geral

A Resposta A apresenta um design de sistema muito forte, claro e correto. Segue uma estrutura lógica, faz escolhas tecnológicas sólidas com boas justificativas e aborda todos os requisitos centrais da solicitação. Sua principal força é a clareza e a concisão. No entanto, falta a profundidade excepcional e os detalhes operacionais vistos na Resposta B, particularmente em relação a modos de falha e estratégias avançadas de otimização.

Ver detalhes da avaliacao

Qualidade da arquitetura

Peso 30%
88

A arquitetura proposta é excelente, apresentando um conjunto padrão e robusto de componentes (Kafka, Redis, Cassandra, gateways WebSocket). O fluxo de dados é lógico e bem explicado. Representa uma solução sólida e padrão da indústria.

Completude

Peso 20%
85

A resposta é muito completa, abordando todas as quatro seções solicitadas na solicitação de forma completa e eficaz. Atende a todos os requisitos funcionais e não funcionais especificados.

Analise de trade-offs

Peso 20%
88

A análise de trade-off é forte e cobre decisões chave como entrega 'at-least-once' vs. 'exactly-once' e a natureza stateful dos gateways. O ponto específico sobre a confiabilidade do Redis Pub/Sub é particularmente perspicaz.

Escalabilidade e confiabilidade

Peso 20%
85

O design explica claramente como cada componente escala horizontalmente e como a entrega 'at-least-once' é alcançada. O raciocínio é sólido e aborda diretamente os NFRs.

Clareza

Peso 10%
95

A resposta é excepcionalmente clara, concisa e bem estruturada. Segue exatamente o formato da solicitação, tornando muito fácil ler e digerir as informações.

Resumo de alto nível Proponho uma plataforma de notificação em tempo real, escalável horizontalmente e de baixa latência, construída em torno de: (1) infraestrutura de borda/gateway para aceitar eventos e conexões de clientes, (2) um backbone de pub/sub durável para rotear eventos para assinantes interessados, (3) gerenciadores de conexão / workers WebSocket que mantêm conexões de clientes ativas e executam fan-out, e (4) um armazenamento de presença rápido e um armazenamento de notificação durável para confiabilidade e entrega offline. O sistema usa particionamento e replicação para atingir metas de taxa de tran...

Mostrar resposta completa

Resumo de alto nível Proponho uma plataforma de notificação em tempo real, escalável horizontalmente e de baixa latência, construída em torno de: (1) infraestrutura de borda/gateway para aceitar eventos e conexões de clientes, (2) um backbone de pub/sub durável para rotear eventos para assinantes interessados, (3) gerenciadores de conexão / workers WebSocket que mantêm conexões de clientes ativas e executam fan-out, e (4) um armazenamento de presença rápido e um armazenamento de notificação durável para confiabilidade e entrega offline. O sistema usa particionamento e replicação para atingir metas de taxa de transferência e disponibilidade, com instrumentação de ponta a ponta, backpressure e idempotência para impor entrega pelo menos uma vez e baixa latência. 1) Arquitetura geral (componentes e fluxo de solicitação) Componentes principais - API Gateway / Ingress: Aceita publicações de eventos (de serviços internos) e atualizações de conexão de clientes. Expõe endpoints REST/gRPC para publicadores de eventos e lida com autenticação e limitação de taxa. Implantado atrás de LBs globais e endpoints por região. - Camada de Conexão (WebSocket / GRPC streams): Uma frota de servidores de conexão sem estado (WebSocket/HTTP2 ou gRPC) que mantêm conexões persistentes com os clientes. Eles executam roteamento leve e tratamento de reconhecimento e encaminham alterações de assinatura para o armazenamento de presença. - Armazenamento de Presença e Roteamento: Um armazenamento chave-valor de baixa latência (cluster Redis) que rastreia qual(is) servidor(es) de conexão hospeda(m) atualmente cada usuário online e quais tópicos eles assinam. Usado para rotear notificações para o worker de conexão correto. - Backbone Pub/Sub: Um barramento de mensagens durável e particionado (Kafka ou Apache Pulsar) usado para distribuir eventos de publicadores para workers de notificação. Os tópicos são particionados por chaves lógicas (ID do usuário, ID do tópico) para garantir processamento ordenado por chave e taxa de transferência escalável. - Serviço de Notificação / Pool de Workers: Consumidores do tópico pub/sub que realizam enriquecimento, filtragem e roteamento de entrega. Os workers consultam o armazenamento de presença para encontrar servidores de conexão de destino e enviam tarefas de entrega para caminhos de entrega rápidos. - Camada de Entrega / Mecanismo de Fan-out: Os servidores de conexão recebem solicitações de entrega (diretamente ou via RPC rápido) e enviam notificações pela conexão persistente para o cliente. Eles lidam com controle de fluxo por conexão, lotes e ACKs dos clientes. - Armazenamento de Notificação Durável (NoSQL): Um armazenamento replicado e otimizado para gravação (por exemplo, Cassandra / DynamoDB) para persistir notificações para usuários offline, retentativas e auditoria. Armazena cargas úteis de notificação, tentativas de entrega, timestamps, TTLs. - Armazenamento de Deduplicação e Idempotência: Pequeno armazenamento chave-valor (Redis ou RocksDB) para registrar IDs de mensagens recentes para deduplicação quando semânticas de pelo menos uma vez causam duplicatas. - Plano de Controle e Monitoramento: Métricas, rastreamento, SLO/alertas, disjuntores e limitação. Fluxos típicos - Fluxo de publicação (produtor de eventos -> usuário): 1) O publicador envia o evento para o API Gateway (REST/gRPC). 2) O gateway grava a mensagem no tópico Pub/Sub (particionado por tópico de destino/ID do usuário). 3) Os workers de notificação consomem eventos, enriquecem e resolvem listas de assinaturas (ou consultam o banco de dados de assinaturas), consultam o armazenamento de presença para encontrar destinatários online e, para cada conexão online, enviam para os servidores de conexão apropriados. 4) Os servidores de conexão enviam via stream WebSocket/gRPC para o cliente e aguardam um ACK leve. 5) Se o usuário estiver offline (falha na presença), grava no Armazenamento de Notificação Durável para recuperação offline. - Fluxo de assinatura: Os clientes enviam mensagens de assinatura/cancelamento de assinatura por meio de sua conexão persistente. O servidor de conexão atualiza o armazenamento de presença atomicamente para que o roteamento do worker veja as assinaturas atualizadas rapidamente. - Recuperação e repetição: O pub/sub durável e o Armazenamento de Notificação permitem a repetição de eventos perdidos; os servidores de conexão registram novamente a presença na reconexão. 2) Escolhas de tecnologia e justificativa - Conexão do cliente: WebSockets ou streams HTTP/2 (gRPC) - Escolha: WebSockets para ampla compatibilidade com clientes (móvel/web). Considere streams gRPC HTTP/2 para aplicativos internos/móveis que o suportam. Ambos mantêm conexões TCP/TLS persistentes para atender à latência <200ms. - Razão: O polling é muito lento e ineficiente. O long polling aumenta a latência e o uso de recursos. WebSockets fornecem push, baixo RTT e a capacidade de entregar mensagens binárias com pouca sobrecarga. - Backbone Pub/Sub: Apache Kafka ou Apache Pulsar - Escolha: Kafka (gerenciado como Confluent Cloud ou auto-hospedado) ou Pulsar se as necessidades de multilocação e replicação geográfica dominarem. - Razão: Ambos fornecem mensagens particionadas, duráveis e de alta taxa de transferência. Kafka tem ferramentas maduras, alta taxa de transferência, latência previsível e suporte a semântica exatamente uma vez em produtores. O particionamento permite escalar para 10k msg/s facilmente. Pulsar oferece replicação geográfica integrada se multi-região for necessário. - Armazenamento de presença e roteamento: Cluster Redis (em memória) com replicação - Razão: Leituras/gravações abaixo de 1ms para mapear usuário -> servidores de conexão, assinaturas e metadados de conexão. Redis suporta clustering, persistência (AOF/RDB) e pesquisas rápidas necessárias para rotear eventos dentro do orçamento de 200ms. - Armazenamento de notificação persistente: Cassandra / DynamoDB (NoSQL) - Escolha: Cassandra ou armazenamento chave-valor semelhante ao DynamoDB. - Razão: Alta taxa de transferência de gravação, escalabilidade linear e TTLs configuráveis, ideais para armazenar muitas gravações por segundo e atender a leituras offline. Sistemas SQL lutam nessa escala de gravações e complexidade de particionamento horizontal. - Servidores de conexão e comunicação do worker: gRPC/RPC interno + protobuf - Razão: Mensagens binárias de baixa sobrecarga, suporte a backpressure, tipagem forte e alto desempenho. - Balanceamento de carga e roteamento: Balanceadores de carga L4 (TCP) para WebSockets + LB L7 para APIs REST. Use roteamento fixo via hashing consistente ou afinidade de sessão para rotear reconexões para a mesma região. - Formato do payload do cliente: Binário compacto (protobuf/flatbuffers) para payloads menores e serialização mais rápida. 3) Como o design atende aos requisitos não funcionais - Escalabilidade (1 milhão de usuários simultâneos, pico de 10 mil notificações/s) - Servidores de conexão sem estado: Escala horizontal; cada servidor lida com N conexões WebSocket simultâneas. Com máquinas modernas (por exemplo, 100 mil soquetes por máquina com ajuste adequado), dezenas/centenas de servidores lidam com 1 milhão de soquetes simultâneos. Grupo de autoescalonamento + orquestração de contêineres gerencia a capacidade. - Pub/sub particionado (Kafka): Escala produtores e consumidores adicionando partições/workers. O particionamento por ID de usuário de destino ou tópico garante distribuição uniforme de carga. 10 mil msg/s é modesto para clusters Kafka dimensionados adequadamente (dezenas de brokers). - Armazenamento de presença particionado: O Cluster Redis particiona o espaço do usuário para que as consultas permaneçam O(1) e escalem. - Armazenamento durável particionado: Cassandra escala linearmente adicionando nós para gravações e leituras. - Latência (99% dentro de 200ms) - Conexões persistentes eliminam a sobrecarga do handshake TCP. Uma vez estabelecida, o push de publicação de evento para o cliente é: API Gateway -> Anexação Kafka (sub-ms-10s ms dependendo do ajuste) -> consumo do worker -> consulta de presença (sub-ms) -> RPC para o servidor de conexão -> push via WebSocket (sub-ms a alguns ms). Com posicionamento cuidadoso (implantar workers e servidores de conexão na mesma região/az), a latência da rede permanece pequena. Use lotes ajustados para entrega quase instantânea (evite atrasos de lote) e ajuste a configuração do consumidor Kafka (linger.ms baixo) para manter a latência de ponta a ponta baixa. - Implantação de borda/regional: Posicione os servidores de conexão perto dos clientes (nível regional) para minimizar a latência da última milha. - Use serialização binária e payloads pequenos para reduzir o tempo de serialização/rede. - Confiabilidade (entrega pelo menos uma vez) - Gravações duráveis: Publicadores gravam eventos no Kafka (durável), workers rastreiam offsets; as mensagens permanecem duráveis até serem reconhecidas pelo processamento do consumidor. - Pelo menos uma vez: Se a entrega falhar (crash do servidor de conexão, rede), o worker pode reenfileirar ou tentar novamente porque o pub/sub retém as mensagens e o worker confirma os offsets apenas após o enfileiramento/confirmação bem-sucedida. Os clientes confirmam o recebimento, mas os ACKs apenas confirmam a aceitação do cliente; a persistência do lado do servidor permite retentativas. - Deduplicação: Como pelo menos uma vez pode produzir duplicatas, inclua IDs de mensagem exclusivos e caches de deduplicação do lado do servidor ou do lado do cliente para suprimir duplicatas. - Armazenamento de Notificação Durável: Quando o usuário estiver offline ou quando a confirmação persistente for necessária, grave a notificação no Cassandra antes de confirmar o evento para que possa ser entregue posteriormente. - Disponibilidade (99,95% de tempo de atividade) - Implantação multi-AZ e multi-região: Replique componentes críticos. Use Kafka com fator de replicação >2, Redis com mestre-réplica e failover, Cassandra com várias réplicas e consistência ajustável. - Frontends sem estado e autoescalonamento: Se algum servidor de conexão falhar, os clientes se reconectam ao próximo servidor disponível. Use verificações de integridade e failover rápido. - Degradação graciosa: Se ocorrer sobrecarga de entrega, aceite eventos e persista-os para entrega posterior, em vez de descartá-los. Limitação e backpressure protegem o sistema. - Observabilidade e automação: Reinicialização automática, disjuntores e runbooks para intervenção do operador. SLOs e alertas ajustados para manter 99,95% de disponibilidade. 4) Detalhes operacionais e otimizações - Chaves de particionamento e roteamento: Particione o pub/sub por ID de usuário para mensagens direcionadas ao usuário e por ID de tópico para transmissões de tópico. Para fan-outs para muitos usuários (por exemplo, uma postagem curtida por milhares), execute fan-out hierárquico: 1) determine os destinatários; 2) agrupe os destinatários por servidor de conexão; 3) envie a mensagem de entrega agrupada para cada servidor de conexão para evitar chamadas NRPC. - Estratégias de Fan-out - Fan-out na gravação (push): Preferível para entrega online em tempo real — os workers enviam apenas para conexões online encontradas via armazenamento de presença. - Fan-out na leitura (pull): Use para fan-out offline grande ou para usuários com pouca frequência online; armazene a notificação e deixe os clientes buscarem quando online. - Loteamento e coalescência: Para eventos semelhantes de alto volume, coaleça vários eventos em uma notificação compacta quando seguro (por exemplo, “3 pessoas curtiram sua postagem”) para reduzir a carga e melhorar a experiência do usuário. - Backpressure e suavização: Se os servidores de conexão ou o cliente não puderem aceitar mensagens, aplique backpressure: diminua a velocidade dos consumidores, armazene em buffer no armazenamento durável e tente novamente. Implemente limites de taxa por cliente. - Modelo ACK do cliente: Use um ACK leve para recebimento bem-sucedido. Se o ACK não for recebido dentro do tempo limite, tente novamente a entrega. Mantenha contadores de tentativas de entrega e envie para o armazenamento de dead-letter após N tentativas. - Segurança e privacidade: Autenticação de ponta a ponta no gateway, verifique a permissão do publicador para publicar; criptografe o transporte (TLS) e sanitize os payloads. 5) Compromissos e discussão - Complexidade vs Simplicidade - Compromisso: Um sistema multi-componente baseado em Kafka é operacionalmente mais complexo do que um servidor de push simples, mas necessário para escala e confiabilidade. O custo operacional e a complexidade de engenharia aumentam (gerenciando Kafka, cluster Redis, Cassandra), mas fornecem durabilidade, repetição e controle de fan-out. - Pelo menos uma vez vs Exatamente uma vez - Escolha: Entrega pelo menos uma vez com deduplicação é escolhida. Exatamente uma vez de ponta a ponta é muito caro (coordenação entre serviços e clientes) e muitas vezes desnecessário para notificações onde duplicatas são toleráveis. Caches de deduplicação e idempotência do lado do cliente fornecem mitigação prática. - WebSockets vs gRPC HTTP/2 - Compromisso: WebSockets maximizam a compatibilidade, mas exigem mais ajuste de LB e conexão. gRPC oferece melhor controle de fluxo e segurança de tipo para clientes que o suportam. Suportar ambos adiciona complexidade, mas oferece a melhor cobertura. - Push em tempo real vs armazenamento primeiro - Push primeiro é priorizado para usuários online para atender à latência. No entanto, armazenamento primeiro (persistir no banco de dados primeiro) adiciona durabilidade ao custo de latência de gravação adicional. Buscamos um equilíbrio: gravar no Kafka (durável) rapidamente, opcionalmente persistir no Cassandra dependendo da política de confiabilidade. - Consistência eventual da presença Redis - A presença pode estar ligeiramente desatualizada em casos extremos; uma pequena janela de falsos negativos/positivos pode causar uma única notificação perdida que será recuperada do armazenamento de notificação durável. Este design favorece consultas de presença de baixa latência em valores de presença globais estritamente síncronos. 6) Planejamento de capacidade e números (estimativa rápida) - 1 milhão de usuários simultâneos: Se cada servidor de conexão lidar com ~10 mil WebSockets simultâneos, são necessários ~100 servidores de conexão. Adicione um fator de segurança (2x) para picos -> ~200 instâncias em todas as regiões. - 10 mil notificações/s: Cluster Kafka com 10–50 partições é suficiente dependendo do tamanho da mensagem e replicação; número alvo de brokers em torno de 5–10 com fator de replicação 3. Grupos de consumidores escalam horizontalmente. - Armazenamento: A 10 mil notificações/s, ~864 milhões de notificações por dia (se cada mensagem for persistida) — use TTLs e agregação para reduzir o armazenamento. Nós Cassandra dimensionados de acordo. 7) Modos de falha e mitigações - Crash do servidor de conexão: Clientes se reconectam a outros servidores; o armazenamento de presença é atualizado na reconexão. Mensagens em buffer no worker são retentadas. Use estratégias de reconexão fixas para reduzir a rotatividade de estado. - Falha do broker Kafka: A replicação de partição garante que não haja perda de dados quando o fator de replicação >=3 e ISR configurado. Monitore partições sub-replicadas. - Failover Redis: Use Cluster Redis com réplicas e failover automatizado (Sentinel ou serviços gerenciados). Reconstrua a presença dos servidores de conexão em caso de failover grande. - Fan-outs grandes (eventos virais): Use fan-out hierárquico e loteamento; descarregue para workers em segundo plano e persista notificações para entrega posterior se a entrega em tempo real violar a latência. Conclusão Este design usa conexões persistentes (WebSockets/gRPC), um pub/sub particionado durável (Kafka/Pulsar), um armazenamento de presença de baixa latência (Redis) e um armazenamento NoSQL escalável (Cassandra/DynamoDB) para atender às metas de 1 milhão de conexões simultâneas, 10 mil notificações/s, latência de 99% <200ms, confiabilidade pelo menos uma vez e disponibilidade de 99,95%. Os principais compromissos são o aumento da complexidade operacional e o tratamento de duplicatas. Com particionamento cuidadoso, replicação, monitoramento e ajuste de componentes individuais (configurações do consumidor, loteamento, backpressure), esta arquitetura escalará e fornecerá as notificações em tempo real de baixa latência e confiáveis que a plataforma precisa.

Resultado

#1 | Vencedor

Votos de vitoria

2 / 3

Pontuacao media

87
Modelos avaliadores Anthropic Claude Opus 4.6

Pontuacao total

82

Comentario geral

A Resposta B fornece um design de sistema abrangente e detalhado que vai além dos requisitos principais. Ela cobre todos os componentes fundamentais da Resposta A, mas adiciona profundidade significativa em várias áreas: planejamento de capacidade com cálculos aproximados, análise explícita de modos de falha com mitigações, mecanismos de backpressure e controle de fluxo, considerações de segurança, estratégias de batching e coalescing, fanout hierárquico para eventos virais, escolhas de serialização binária e um armazenamento de deduplicação como um componente separado. A análise de trade-offs é sólida, embora ligeiramente menos focada que a da Resposta A. A resposta é bem organizada com seções claras, embora o detalhe adicional a torne às vezes um pouco mais verbosa. A inclusão de gRPC como alternativa ao WebSockets e a discussão de implantação regional agregam valor prático.

Ver detalhes da avaliacao

Qualidade da arquitetura

Peso 30%
85

A Resposta B apresenta uma arquitetura igualmente sólida com os mesmos componentes centrais, mas adiciona mais profundidade. A inclusão de um armazenamento de deduplicação dedicado, menção explícita de mecanismos de backpressure, fanout hierárquico para grandes fan-outs e a distinção entre balanceamento de carga L4 e L7 demonstram maior sofisticação arquitetônica. Os fluxos de publicação e assinatura são claramente articulados.

Completude

Peso 20%
85

A Resposta B é notavelmente mais completa, cobrindo todas as áreas exigidas, além de planejamento de capacidade com cálculos aproximados, modos de falha explícitos e mitigações, considerações de segurança e privacidade, backpressure e controle de fluxo, estratégias de batching e coalescing, e um componente de deduplicação. As seções adicionais sobre detalhes operacionais e modos de falha adicionam completude significativa.

Analise de trade-offs

Peso 20%
75

A Resposta B cobre trade-offs adequadamente, mas com um pouco menos de profundidade por trade-off. Discute complexidade vs simplicidade, at-least-once vs exactly-once, WebSockets vs gRPC, push vs store-first, e consistência de presença do Redis. Os trade-offs são válidos, mas alguns parecem mais superficiais em comparação com a análise mais detalhada da Resposta A. O trade-off push-first vs store-first é uma boa adição não encontrada na Resposta A.

Escalabilidade e confiabilidade

Peso 20%
85

A Resposta B fornece uma cobertura mais completa de escalabilidade e confiabilidade. Inclui planejamento de capacidade explícito (100-200 servidores de conexão, 5-10 brokers Kafka, estimativas de armazenamento), uma seção dedicada a modos de falha cobrindo múltiplos cenários, mecanismos de backpressure e estratégias de degradação graciosa. A estimativa de 10k conexões por servidor é mais conservadora, mas inclui um fator de segurança de 2x, mostrando julgamento de engenharia prático.

Clareza

Peso 10%
75

A Resposta B é bem organizada com cabeçalhos de seção claros e fluxo lógico. No entanto, o detalhe e a amplitude adicionais às vezes a tornam mais verbosa e um pouco mais difícil de acompanhar rapidamente. Algumas seções parecem que poderiam ser mais concisas. As seções numeradas (1-7) fornecem uma boa estrutura, mas o volume de conteúdo reduz ligeiramente a legibilidade em comparação com a abordagem mais focada da Resposta A.

Modelos avaliadores OpenAI GPT-5.4

Pontuacao total

81

Comentario geral

A Resposta B é abrangente e organizada, cobrindo a maioria das áreas necessárias, incluindo arquitetura, opções de tecnologia, operações, modos de falha e planejamento de capacidade. Demonstra boa consciência de backpressure, batching, observabilidade e fanout hierárquico. No entanto, é menos decisiva em várias escolhas tecnológicas chave, mistura opções em vez de se comprometer com um design conciso e contém uma inconsistência notável ao chamar os servidores de conexão de stateless, ao mesmo tempo em que afirma que eles mantêm conexões persistentes de clientes. Alguns detalhes de confiabilidade são mais genéricos do que exatos, o que enfraquece a precisão geral do design.

Ver detalhes da avaliacao

Qualidade da arquitetura

Peso 30%
78

Boa arquitetura em camadas que inclui a maioria dos componentes principais e preocupações operacionais. No entanto, o design é menos conciso, pois mantém várias alternativas abertas e tem uma inconsistência interna ao descrever os servidores de conexão como stateless, enquanto eles mantêm sockets ativos.

Completude

Peso 20%
87

Resposta muito completa cobrindo arquitetura, justificativa tecnológica, confiabilidade, disponibilidade, estratégias de fanout, modos de falha, planejamento de capacidade e detalhes operacionais. Aborda preocupações mais auxiliares, como segurança, backpressure e monitoramento.

Analise de trade-offs

Peso 20%
82

Mostra sólida consciência de trade-offs de engenharia, como push-first versus store-first, WebSockets versus gRPC, e at-least-once versus exactly-once. O raciocínio é bom, mas às vezes permanece genérico e menos estritamente conectado a um design final escolhido.

Escalabilidade e confiabilidade

Peso 20%
80

Forte discussão sobre técnicas de escalonamento, particionamento, backpressure, replay e resiliência multi-AZ. Mecanismos de confiabilidade estão presentes, incluindo deduplicação e retentativas, mas as semânticas exatas de commit e entrega são descritas de forma mais abstrata, e o caminho de entrega online é menos concretamente definido.

Clareza

Peso 10%
81

Bem organizado com títulos e marcadores, mas um tanto prolixo e ocasionalmente difuso. A inclusão de muitas opções e notas laterais reduz a decisividade e torna o design final um pouco mais difícil de definir.

Modelos avaliadores Google Gemini 2.5 Pro

Pontuacao total

97

Comentario geral

A Resposta B fornece um design de sistema excepcionalmente detalhado e abrangente que demonstra um entendimento de nível sênior na construção e operação de sistemas em escala. Ele não apenas cobre todos os requisitos, mas vai significativamente além da solicitação, incluindo seções sobre detalhes operacionais, planejamento de capacidade e modos de falha. O nível de detalhe, desde a discussão de fan-out hierárquico até mecanismos de backpressure, é excepcional. Sua única desvantagem menor é que sua densidade o torna um pouco menos conciso que a Resposta A.

Ver detalhes da avaliacao

Qualidade da arquitetura

Peso 30%
95

A arquitetura é excepcionalmente bem definida e ligeiramente mais detalhada que a de A. Ela inclui explicitamente um armazenamento de deduplicação e um plano de controle/monitoramento, e considera alternativas como Pulsar e fluxos gRPC, mostrando uma perspectiva mais ampla do espaço do problema.

Completude

Peso 20%
100

Esta resposta é exemplar em sua completude. Ela não apenas aborda todas as partes da solicitação, mas vai significativamente além, adicionando seções altamente relevantes sobre detalhes operacionais, planejamento de capacidade e modos de falha, que são críticos para um sistema real desta escala.

Analise de trade-offs

Peso 20%
95

A discussão de trade-offs é excelente e bem integrada ao restante do design. Ela cobre os mesmos pontos-chave de A, mas também adiciona nuances como WebSockets vs. gRPC e estratégias push-first vs. store-first, vinculando-as aos objetivos gerais do sistema.

Escalabilidade e confiabilidade

Peso 20%
100

Esta resposta demonstra um domínio magistral de escalabilidade e confiabilidade. As seções dedicadas a modos de falha, mitigações e detalhes operacionais (como fan-out hierárquico e backpressure) fornecem uma explicação muito mais profunda e prática de como o sistema lidaria com a escala exigida e permaneceria resiliente.

Clareza

Peso 10%
92

A resposta é muito bem estruturada com títulos e subtítulos claros que ajudam a navegar pela grande quantidade de informações. Embora extremamente clara, sua profundidade e detalhe a tornam um pouco mais densa e menos imediatamente escaneável que a Resposta A.

Resumo comparativo

Para cada tarefa e discussao, a classificacao final e definida por agregacao de rankings por avaliador (rank medio + desempate por Borda). A pontuacao media e exibida como referencia.

Avaliadores: 3

Votos de vitoria

1 / 3

Pontuacao media

84
Ver esta resposta

Votos de vitoria

2 / 3

Pontuacao media

87
Ver esta resposta

Resultados da avaliacao

Modelos avaliadores Google Gemini 2.5 Pro

Motivo do vencedor

A Resposta B é a vencedora clara devido à sua profundidade e abrangência superiores. Embora ambas as respostas proponham arquiteturas excelentes e viáveis, a Resposta B demonstra uma compreensão mais profunda e prática do design de sistemas do mundo real. A sua inclusão de secções detalhadas sobre preocupações operacionais, modos de falha e mitigações, e planeamento de capacidade fornece uma visão muito mais robusta e pronta para produção. Estes detalhes adicionais, como a discussão de fan-out hierárquico para o 'problema da celebridade' e mecanismos de backpressure, abordam diretamente as complexidades de executar tal sistema na escala necessária, tornando-a uma resposta mais completa e de nível especialista.

Modelos avaliadores OpenAI GPT-5.4

Motivo do vencedor

A resposta A vence porque é mais coerente e concreta como um projeto de sistema de alto nível. Ela toma decisões arquitetônicas mais firmes, as vincula diretamente aos requisitos de latência e de pelo menos uma vez, e explica o caminho de entrega de ponta a ponta com mais precisão. A resposta B é ampla e ponderada, mas o uso de múltiplas alternativas e algumas inconsistências arquitetônicas a tornam ligeiramente menos prática e menos internamente consistente para esta solicitação específica.

Modelos avaliadores Anthropic Claude Opus 4.6

Motivo do vencedor

A Resposta B vence porque fornece uma cobertura significativamente mais abrangente do design do sistema. Embora ambas as respostas partilhem a mesma arquitetura central e escolhas tecnológicas, a Resposta B acrescenta valor substancial através de: (1) planeamento explícito de capacidade com cálculos aproximados para servidores de ligação, partições Kafka e armazenamento, (2) uma secção dedicada a modos de falha que abrange falhas de servidores de ligação, falhas de corretores Kafka, failover do Redis e eventos virais, (3) detalhes operacionais como mecanismos de backpressure, batching/coalescing, considerações de segurança e escolhas de serialização binária, (4) um componente dedicado de armazenamento de deduplicação e (5) estratégia de fanout hierárquica para grandes fan-outs. Estas adições demonstram um conhecimento de engenharia prático mais profundo e tornam o design mais acionável. A secção de trade-offs da Resposta A é ligeiramente mais polida e focada, mas a cobertura mais ampla da Resposta B em todas as dimensões dá-lhe a vantagem geral.

X f L