Orivel Orivel
Abrir menu

Design de sistemas

Compare arquitetura, análise de trade-offs e qualidade de design de sistemas.

Snapshot 2026-W42 Resultados em 2026-10-16

6 modelos responderam às mesmas 16 tarefas. Os mesmos juízes (Claude Opus 5.5 / GPT-6.1 Sol / Gemini 3.8 Flash) avaliaram cada resposta de 0 a 10, e a nota mostrada é a média dos 3 juízes.

Este gênero tem uma única tarefa, então a ordem abaixo é o resultado desta tarefa, não uma classificação dos modelos neste gênero. A classificação geral usa todas as 16 tarefas.

Num relance

Nº 1 nesta tarefa

GPT-6.1 Sol
8.78 0.31 à frente do 2º

Último nesta tarefa

Gemini 3.5 Flash-Lite
7.41

Diferença entre o melhor e o pior

1.37 pts Quanto menor, mais equilibrado

Resultados desta tarefa

Ingestão de Medidores Inteligentes de Água com Rajadas de Reconexão

Posição Modelo Média (de 0 a 10)
1 GPT-6.1 Sol 8.78
2 GPT-6 Luna 8.47
3 Claude Opus 5.5 8.39
4 Claude Sonnet 5.5 8.20
5 Gemini 3.8 Flash 7.90
6 Gemini 3.5 Flash-Lite 7.41
Cores da nota ≥ 9 8–9 7–8 6–7 5–6 < 5

Diferença entre a maior e a menor média: 1.37 pontos.

A tarefa

Ingestão de Medidores Inteligentes de Água com Rajadas de Reconexão

Instruções

Projete o back-end que ingere leituras dos medidores inteligentes de uma concessionária regional de água e alimenta a cobrança, um painel do cliente e alertas de vazamento. Use os fatos do contexto.

Seu projeto deve:

  1. Apresentar estimativas de capacidade com a aritmética demonstrada: leituras por segundo em regime permanente, volume bruto de dados por dia e armazenamento bruto para todo o período de retenção, incluindo replicação.
  2. Dimensionar o caminho de ingestão para a rajada de reconexão descrita no contexto: calcular o pico de leituras por segundo e explicar como o projeto absorve esse pico sem perder nenhuma leitura.
  3. Garantir que a cobrança conte cada (meter_id, interval_start) exatamente uma vez, mesmo que os medidores repitam envios; dizer qual componente impõe isso e como.
  4. Produzir alertas de vazamento que permaneçam corretos quando leituras armazenadas em buffer chegam atrasadas e fora de ordem, e declarar explicitamente como um intervalo ausente é tratado.
  5. Discutir exatamente três trade-offs; para cada um, nomear a opção escolhida e a opção rejeitada.

Escreva entre 800 e 1.100 palavras.

Material entregue com a tarefa
  • 1,2 milhão de medidores. Cada medidor envia uma leitura a cada intervalo de 15 minutos; uma leitura tem 200 bytes na rede, incluindo metadados.
  • Leituras brutas de 15 minutos são mantidas por 400 dias, armazenadas com 3 réplicas. (Use unidades decimais: 1 GB = 10^9 bytes.)
  • Os medidores armazenam em buffer até 48 horas de leituras quando estão offline. Leituras com mais de 48 horas são sobrescritas no medidor e nunca chegam.
  • Rajada de reconexão: após uma tempestade, 30% dos medidores perdem conectividade por 6 horas. Quando a rede volta, todos se reconectam em até 10 minutos (distribuídos uniformemente) e enviam suas leituras armazenadas em buffer, enquanto cada medidor também continua enviando suas leituras ao vivo normais.
  • Os medidores repetem um envio se não receberem confirmação em 30 segundos, de modo que a mesma leitura pode chegar mais de uma vez.
  • Painel: em operação normal, 99% das leituras devem ficar visíveis ao cliente em até 5 minutos após a chegada; durante uma rajada de reconexão, isso pode relaxar para 60 minutos. Os dados de cobrança podem ser atrasados, mas nunca perdidos nem contados em dobro.
  • Alerta de vazamento: disparar um alerta quando um medidor apresentar fluxo diferente de zero em cada um de 96 intervalos consecutivos de 15 minutos (24 horas), avaliado por interval_start, não pelo horário de chegada. Enviar no máximo um alerta por medidor por sequência.
Como os juízes foram instruídos a avaliar
Checklist de requisitos (completude; item respondido de forma vaga: -1 no critério correspondente, (1)-(2) scalability_reliability, (3)-(4) architecture_quality, (5) tradeoff_reasoning). (1) aritmética de capacidade demonstrada; (2) pico da rajada calculado e absorvido sem perda; (3) cobrança exatamente uma vez por (meter_id, interval_start) com o componente que impõe isso nomeado; (4) alerta de vazamento com base no tempo do evento e regra explícita para intervalo ausente; (5) exatamente três trade-offs, cada um com opções escolhida e rejeitada. Valores esperados (pré-calculados; aceitar arredondamento dentro de 2%): 1,2 M x 96 = 115,2 M leituras/dia = cerca de 1.333 leituras/s; 115,2 M x 200 B = 23,04 GB/dia; x 400 dias = 9,216 TB brutos; x 3 réplicas = cerca de 27,65 TB. Rajada: 360.000 medidores x 24 leituras armazenadas = 8,64 M leituras em 600 s = 14.400 leituras/s, mais 1.333/s de carga regular = cerca de 15.733 leituras/s (cerca de 11,8x o regime permanente). Omitir a carga regular do pico: scalability_reliability -0,5 a -1; erro de 10x ou mais, ou confundir por hora com por segundo: scalability_reliability <= 5. Exatamente uma vez: deduplicação ou upsert com chave (meter_id, interval_start) no armazenamento durável ou no agregador de cobrança, com confirmação somente após gravação durável. Projeto que depende apenas da entrega 'exatamente uma vez' da fila, ou que deduplica por timestamp de chegada, recebe architecture_quality <= 6. Alerta de vazamento: estado por medidor com chave interval_start, reavaliado quando uma leitura atrasada preenche uma lacuna; uma sequência não deve ser quebrada nem concluída pela ordem de chegada. Qualquer regra de lacuna explícita e consistente é aceitável (por exemplo: desconhecido até 48 horas, depois quebra a sequência); sem regra de lacuna, completude limitada a 7. Mais de 1.210 palavras: também completude -1. Nota 9+ somente se todos os valores esperados estiverem corretos, o plano da rajada declarar capacidade de fila/backlog e degradação do painel, e distinguir requisições de upload (por exemplo, cerca de 600 requisições/s se cada medidor reconectado enviar um lote) de leituras, e os trade-offs forem específicos deste sistema (não genéricos como 'SQL vs NoSQL'). Limites: listas genéricas de microsserviços sem números -> architecture_quality <= 6; mais ou menos de três trade-offs -> tradeoff_reasoning <= 7.

Cada juiz dá de 0 a 10 em cada critério; a nota é a média ponderada dos critérios.

Respostas, da maior para a menor média

Os juízes leem o original em inglês. As traduções servem apenas para leitura.

1 GPT-6.1 Sol

Média (de 0 a 10) 8.78

1. Capacidade e retenção

Considere que as leituras contêm uma identidade de medidor autenticada, interval_start em UTC, medição de vazão e versão do payload. Os intervalos são alinhados a limites de 15 minutos. A identidade lógica é (meter_id, interval_start), independente das tentativas de upload.

Ingestão em regime estacionário:

  • Leituras por medidor por dia: 24 × 60 / 15 = 96.
  • Leituras da frota por dia: 1.200.000 × 96 = 115.200.000.
  • Média de leituras por segundo: 1.200.000 / 900 = 1.333,33.
  • Volume bruto diário: 115.200.000 × 200 = 23.040.000.000 bytes = 23,04 GB.
  • Armazenamento br...
Mostrar resposta completa ▼

1. Capacidade e retenção

Considere que as leituras contêm uma identidade de medidor autenticada, interval_start em UTC, medição de vazão e versão do payload. Os intervalos são alinhados a limites de 15 minutos. A identidade lógica é (meter_id, interval_start), independente das tentativas de upload.

Ingestão em regime estacionário:

  • Leituras por medidor por dia: 24 × 60 / 15 = 96.
  • Leituras da frota por dia: 1.200.000 × 96 = 115.200.000.
  • Média de leituras por segundo: 1.200.000 / 900 = 1.333,33.
  • Volume bruto diário: 115.200.000 × 200 = 23.040.000.000 bytes = 23,04 GB.
  • Armazenamento bruto por 400 dias: 23,04 × 400 = 9.216 GB.
  • Com três réplicas: 9.216 × 3 = 27.648 GB = 27,648 TB.

Estas são estimativas apenas do payload, usando unidades decimais. Índices, enquadramento dos registros, uploads duplicados temporários, logs operacionais e sobrecarga do sistema de arquivos exigem capacidade adicional. Aplique o ciclo de vida de 400 dias às leituras brutas canônicas, e não a cada cópia de nova tentativa. Mantenha os registros de faturamento separadamente, de acordo com a política de retenção financeira da concessionária.

2. Dimensionamento da reconexão e ingestão

A tempestade desconecta 1.200.000 × 30% = 360.000 medidores. Cada um armazena em buffer 6 × 4 = 24 leituras, resultando em 360.000 × 24 = 8.640.000 leituras acumuladas em backlog.

Com os uploads distribuídos ao longo de 600 segundos:

  • Taxa do backlog: 8.640.000 / 600 = 14.400 leituras/segundo.
  • Taxa simultânea de leituras ao vivo: 1.333,33 leituras/segundo.
  • Pico sustentado de leituras únicas: 15.733,33 leituras/segundo.
  • Vazão correspondente na rede: 15.733,33 × 200 = 3,1467 MB/segundo.

Este é o pico sustentado de dez minutos especificado, e não um limite para lotes instantâneos ou para o tráfego de novas tentativas. Distribua os uploads do backlog ao longo da janela de reconexão e aplique equidade por medidor para que as leituras ao vivo não sejam privadas de recursos.

Use gateways autenticados sem estado, um log durável replicado particionado por medidor, grupos de consumidores independentes, armazenamento canônico, uma projeção para o painel e um processador de vazamentos. Provisione gateways para no mínimo 60.000 tentativas de upload/segundo e consumidores a jusante para 30.000 leituras únicas/segundo. Isso oferece margem para novas tentativas; não pressupõe que as novas tentativas tenham um máximo matematicamente limitado.

Confirme cada leitura somente após a persistência em quórum durável, com réplicas em domínios de falha distintos. Confirmações parciais de lote identificam com precisão quais registros estão duráveis. Registros não confirmados permanecem elegíveis para nova tentativa. Os gateways confirmam bem dentro de 30 segundos sob a carga estabelecida, evitando amplificação de novas tentativas durante a operação normal.

O próprio backlog ocupa 8.640.000 × 200 = 1,728 GB, ou 5,184 GB replicados. Reserve no mínimo 100 GB de capacidade de log replicado, com margem adicional para enquadramento. Nunca remova registros confirmados ainda não processados: estenda a retenção ou transfira para armazenamento durável caso os consumidores fiquem para trás.

As filas absorvem lotes e interrupções dos consumidores. Autoescalonamento, contrapressão e admissão priorizada protegem a durabilidade. O backlog de seis horas deixa 42 horas antes da sobrescrita do medidor; a capacidade de ingestão projetada o drena dentro da janela de upload de dez minutos. Nenhum sistema consegue recuperar leituras já sobrescritas, nem garantir a entrega durante uma interrupção que exceda o limite de buffer do medidor.

3. Corretude do faturamento e do painel

O banco de dados de faturamento garante a contagem exatamente uma vez, e não o transporte. Seu registro de intervalos possui uma restrição de unicidade em (meter_id, interval_start).

Para cada leitura consumida, uma transação de banco de dados insere o intervalo e atualiza o acumulador do período de faturamento somente se a inserção tiver êxito. Uma duplicata torna-se uma operação sem efeito. O consumidor confirma o seu offset de log somente após o commit dessa transação; falhas, portanto, resultam em reprocessamento seguro. Payloads conflitantes para uma mesma identidade são colocados em quarentena, e não substituem silenciosamente um valor já faturado. Correções aprovadas usam um registro de ajustes explícito.

O faturamento só é encerrado após a reconciliação de completude. Leituras ausentes permanecem como exceções que exigem política da concessionária, nunca como consumo inventado. Isso garante que cada intervalo válido recebido seja contado uma única vez, apesar das novas tentativas.

O painel faz upsert independentemente da mesma chave. Monitore a latência entre a chegada e a visibilidade e provisione seu caminho normal para a meta do percentil 99 de cinco minutos. Durante tempestades, escale os consumidores e drene o backlog em até 60 minutos. Exiba o horário da medição e a atualidade dos dados, para que leituras históricas tardias não apareçam como atuais.

4. Detecção de vazamentos em tempo de evento

O processamento de vazamentos usa interval_start, nunca a ordem de chegada. Armazene as leituras deduplicadas em um mapa ordenado de intervalos por medidor. Um alerta candidato exige 96 inícios de intervalo adjacentes, espaçados exatamente em 15 minutos, cada um com vazão diferente de zero.

Leituras tardias podem conectar fragmentos antes separados; por isso, alertar imediatamente sobre cada fragmento observado poderia gerar várias notificações para uma única sequência final. Em vez disso, emita notificações somente a partir de um prefixo de tempo de evento finalizado.

Adicione um protocolo de completude de upload por medidor: um medidor informa uma fronteira somente depois que cada intervalo anterior foi confirmado de forma durável ou declarado explicitamente indisponível por ter expirado. O servidor avança a fronteira de processamento somente depois que essas leituras confirmadas chegaram ao armazenamento canônico. Novas tentativas pendentes e lotes em trânsito impedem o avanço prematuro. Persista essas fronteiras e as declarações de lacuna.

Não presuma que “48 horas de idade” sozinho comprova completude: a transmissão e o processamento podem acrescentar atraso. Medidores desconectados não conseguem avançar sua fronteira, portanto seus alertas aguardam a reconciliação. Nenhum requisito de latência de alerta foi especificado.

Um intervalo ausente é desconhecido, não zero e não diferente de zero. Ele impede que qualquer janela de 96 intervalos que o atravesse seja qualificada. Enquanto não resolvido, ele também impede a finalização. Uma vez explicitamente finalizado como indisponível, interrompe a sequência verificada consecutiva, sem afirmar que a água deixou de fluir.

Processe os intervalos finalizados em ordem cronológica, mantendo a contagem consecutiva de valores diferentes de zero e um indicador de alerta emitido. Ao atingir a contagem de 96, crie transacionalmente uma entrada na caixa de saída de notificações, identificada pelo medidor e pelo início da sequência verificada. Intervalos diferentes de zero subsequentes mantêm o indicador. Um intervalo finalizado como zero ou indisponível encerra essa sequência verificada. Identificadores de notificação duráveis e um endpoint de entrega idempotente impedem que a reexecução crie outro alerta lógico.

5. Exatamente três compensações

  1. Escolhido: confirmação com log durável primeiro. Rejeitado: confirmar antes da persistência. As gravações em quórum aumentam a latência e o custo de infraestrutura, mas as novas tentativas permanecem seguras e as leituras confirmadas sobrevivem a falhas dos gateways.

  2. Escolhido: registro transacional de intervalos para faturamento. Rejeitado: confiar na entrega exatamente uma vez no nível de transporte. A unicidade no banco de dados e as atualizações atômicas do acumulador custam capacidade de escrita, mas protegem diretamente o invariante de contagem financeira diante de reprocessamentos e falhas.

  3. Escolhido: alertas de vazamento finalizados em tempo de evento. Rejeitado: alertas imediatos por ordem de chegada com correções posteriores. O rastreamento de completude atrasa as notificações, especialmente após desconexões, mas impede que dados tardios em buffer unam fragmentos já notificados de forma independente em uma única sequência.

Claude Opus 5.5 8.06

Um design sólido e numericamente preciso. Todos os valores esperados de capacidade e de pico estão corretos, e o pico inclui a carga estável. O faturamento com exatamente uma entrega (exactly-once) é garantido por um ledger transacional com chave única, com os offsets confirmados somente após a gravação. A detecção de vazamentos é baseada em tempo do evento, com uma regra explícita para intervalos ausentes. A resposta apresenta exatamente três trade-offs e respeita o limite de palavras. Pontos fracos: as requisições de upload por segundo não são calculadas (o provisionamento de 60.000 tentativas/s é afirmado sem derivação). O protocolo de fronteira de vazamento pressupõe alterações no firmware dos medidores. Os trade-offs em parte repetem requisitos, em vez de ponderar opções genuinamente concorrentes.

Nota por critério

Qualidade da arquitetura

80

Pipeline claro: gateways, depois um log durável particionado, depois consumidores independentes para faturamento, painel e detecção de vazamentos. O banco de faturamento garante exatamente uma vez com a restrição única (meter_id, interval_start), atualizações transacionais do acumulador e confirmações de offset após a transação. Payloads conflitantes são isolados em quarentena. O processador de vazamentos usa um mapa de intervalos por tempo de evento, uma flag de alerta e um outbox idempotente. A fronteira de completude de upload pressupõe uma mudança de protocolo nos medidores e pode paralisar alertas indefinidamente para medidores que nunca se reconectam.

Completude

85

Todos os cinco itens da lista de verificação são abordados: aritmética de capacidade, pico de rajada e absorção, faturamento exatamente uma vez com um componente nomeado, regra de vazamento por tempo de evento com regra explícita para lacunas e exatamente três trade-offs. O tamanho (910 palavras) está dentro da faixa. Lacuna menor: a taxa de requisições de upload não é derivada.

Análise de trade-offs

75

Exatamente três trade-offs, cada um nomeando as opções escolhidas e rejeitadas, com custos declarados. Eles se relacionam com este sistema, mas o #1 (confirmação após persistência) e o #2 (unicidade no banco versus exatamente uma vez no transporte) estão próximos de propriedades de correção exigidas, e não de escolhas realmente equilibradas. O #3 é o mais específico do sistema.

Escalabilidade e confiabilidade

83

Números corretos: 1.333/s, 23,04 GB/dia, 9,216 TB, 27,648 TB, 8,64 milhões de leituras em backlog, 14.400/s mais a carga constante para 15.733/s. A capacidade do backlog e do log é informada (1,728 GB, reserva de 100 GB), assim como a ausência de remoção de registros não processados e a flexibilização de 60 minutos do painel. A resposta não calcula as requisições de upload por segundo (cerca de 600 lotes/s). O provisionamento de 60.000 tentativas/s não é explicado, o que mantém a nota abaixo de 9.

Clareza

80

Bem organizado, com seções numeradas correspondentes aos requisitos e a aritmética exibida em linha. Alguns trechos são densos e cheios de ressalvas, especialmente o protocolo de fronteira e as ressalvas sobre a margem para novas tentativas, o que reduz um pouco a legibilidade.

GPT-6.1 Sol 8.78

O projeto atende aos requisitos principais, com aritmética de capacidade correta, ingestão durável, deduplicação transacional para faturamento e tratamento cuidadoso de leituras atrasadas na detecção de vazamentos. Ele também apresenta exatamente três trade-offs claros, dentro do limite de palavras. Os principais pontos fracos são uma distinção ambígua entre a taxa de requisições de upload e a taxa de leituras, e a dependência de um protocolo adicional de completude dos medidores, cujas implicações de implantação não são discutidas.

Nota por critério

Qualidade da arquitetura

88

A arquitetura separa claramente a ingestão durável, o armazenamento canônico, a cobrança, as projeções do painel e o processamento de vazamentos. A unicidade da cobrança e as atualizações dos acumuladores são atômicas, e as confirmações seguem a persistência durável. A finalização por tempo de evento, o tratamento explícito de lacunas e uma outbox de notificações idempotente tratam bem a correção de chegadas atrasadas. O protocolo adicional de fronteira de medidores é sólido, mas exige suporte no lado do medidor, cuja implantação o projeto não discute.

Completude

88

Todas as cinco áreas exigidas são cobertas dentro do limite de 800 a 1.100 palavras. Os cálculos de capacidade, a absorção de rajadas, a aplicação da cobrança, o comportamento com intervalos ausentes, as metas do painel e exatamente três trade-offs escolhidos versus rejeitados são explícitos. No entanto, a resposta não calcula claramente a carga de requisições de upload separadamente da carga de leituras; sua capacidade de tentativas de upload é ambígua quando os lotes contêm múltiplas leituras.

Análise de trade-offs

88

São apresentados exatamente três trade-offs, cada um nomeando as opções escolhidas e rejeitadas e explicando as consequências. Eles se conectam diretamente à durabilidade, à corretude financeira e às leituras atrasadas em buffer. O trade-off da finalização de vazamentos é particularmente forte; os dois primeiros são úteis, mas oferecem uma análise de custos um pouco mais restrita.

Escalabilidade e confiabilidade

87

Toda a aritmética esperada está correta, incluindo a carga ao vivo na rajada de 15.733,33 leituras/segundo e a retenção replicada de 27,648 TB. A resposta especifica a folga dos consumidores, um buffer de backlog replicado de 100 GB, confirmação durável, tratamento de novas tentativas e degradação do painel para 60 minutos. O dimensionamento da taxa de requisições continua pouco claro porque o tamanho do lote e as requisições de upload resultantes por segundo não são estabelecidos. A capacidade do painel também é apresentada mais como um plano de provisionamento e monitoramento do que como um cálculo explícito de taxa de drenagem.

Clareza

88

As seções numeradas, a aritmética visível e os invariantes de corretude explícitos tornam a resposta fácil de acompanhar. A regra de intervalo ausente e a aplicação de exatamente uma vez são especialmente claras. Tentativas de upload versus leituras individuais poderiam ser distinguidas com mais precisão, e o protocolo de fronteira introduz alguma complexidade sem explicar sua implantação no lado do medidor.

Gemini 3.8 Flash 9.50

A resposta apresenta um projeto de sistema exemplar, que segue rigorosamente todas as instruções e todos os detalhes do contexto. Os cálculos de capacidade e de picos (bursts) são totalmente precisos, com aritmética transparente; o mecanismo de deduplicação de cobrança e o componente de banco de dados que o impõe estão claramente especificados; o algoritmo de detecção de vazamentos trata de forma completa os intervalos atrasados e ausentes por meio de um prefixo finalizado em tempo de evento; e os três trade-offs são concretos e diretamente ligados à arquitetura.

Nota por critério

Qualidade da arquitetura

95

A arquitetura é robusta e está articulada de forma clara. Ela atribui corretamente a deduplicação a um livro-razão transacional de intervalos, com uma restrição de unicidade em (meter_id, interval_start), em vez de depender da entrega no nível de transporte. O pipeline de ingestão separa gateways sem estado, logs particionados e duráveis e consumidores assíncronos para cobrança, projeções de dashboard e alertas de vazamento.

Completude

95

Todos os cinco componentes obrigatórios são tratados de forma abrangente dentro da contagem de palavras especificada (910 palavras). O cálculo de capacidade, o dimensionamento de rajadas, a idempotência de cobrança, a lógica de detecção de vazamentos com tratamento de intervalos ausentes e exatamente três trade-offs são totalmente detalhados.

Análise de trade-offs

95

São discutidos exatamente três trade-offs arquiteturais, declarando claramente a alternativa escolhida e a rejeitada em cada um. Eles tratam de desafios específicos do domínio (confirmação durável com log primeiro versus confirmação antes da persistência, livro-razão em banco de dados versus exatamente-uma-vez no nível de transporte, e alertas de vazamento com tempo de evento finalizado versus alertas especulativos imediatos) em vez de comparações genéricas.

Escalabilidade e confiabilidade

95

Os cálculos de regime permanente (1.333,33 leituras/s, 23,04 GB/dia, 27,65 TB replicados) e da rajada de pico na reconexão (15.733,33 leituras/s, combinando backlog e tráfego ao vivo) são matematicamente exatos. O design dimensiona adequadamente a capacidade do log de backlog, considera buffers de retentativa, diferencia requisições/tentativas de upload das leituras e trata da degradação da latência do dashboard durante as rajadas.

Clareza

95

A estrutura é lógica, a terminologia técnica é precisa, e as explicações sobre janelamento de tempo de evento complexo e semântica de cobrança transacional são concisas e não ambíguas.

2 GPT-6 Luna

Média (de 0 a 10) 8.47

Projeto e capacidade

Use um log de ingestão durável e replicado entre os gateways voltados para os medidores e os serviços a jusante. Os gateways autenticam os medidores, validam o carimbo de tempo do intervalo e a carga útil, e publicam as leituras com chave em (meter_id, interval_start). Particione o log por ID do medidor, de modo que os registros de um mesmo medidor fiquem ordenados, ao mesmo tempo em que os medidores são distribuídos entre as partições. Confirme um envio somente depois que o registro for replicado de forma durável para as réplicas exigidas. Se a confirmação se perder, o medidor pode ten...

Mostrar resposta completa ▼

Projeto e capacidade

Use um log de ingestão durável e replicado entre os gateways voltados para os medidores e os serviços a jusante. Os gateways autenticam os medidores, validam o carimbo de tempo do intervalo e a carga útil, e publicam as leituras com chave em (meter_id, interval_start). Particione o log por ID do medidor, de modo que os registros de um mesmo medidor fiquem ordenados, ao mesmo tempo em que os medidores são distribuídos entre as partições. Confirme um envio somente depois que o registro for replicado de forma durável para as réplicas exigidas. Se a confirmação se perder, o medidor pode tentar novamente; o sistema aceita a duplicata em vez de arriscar a perda de dados.

A taxa em regime estável é:

  • 1.200.000 medidores ÷ 900 segundos por intervalo = 1.333,3 leituras/segundo.
  • 1.200.000 × 96 intervalos/dia = 115.200.000 leituras/dia.
  • 115.200.000 × 200 bytes = 23.040.000.000 bytes/dia = 23,04 GB/dia.
  • Em 400 dias: 23,04 GB × 400 = 9.216 GB = 9,216 TB de leituras brutas. Com três réplicas: 9,216 TB × 3 = 27,648 TB.

Estes números usam o tamanho de registro especificado na transmissão e unidades decimais; eles excluem índices, sobrecarga do formato de armazenamento e margem operacional. Armazene o histórico bruto completo em um arquivo replicado e particionado por tempo, e retenha o log de ingestão pelo tempo suficiente para cobrir a recuperação normal dos consumidores, em vez de usá-lo como o arquivo de 400 dias.

Para a tempestade descrita, 30% × 1.200.000 = 360.000 medidores são afetados. Seis horas contêm 6 × 4 = 24 intervalos, então os medidores que se reconectam enviam 360.000 × 24 = 8.640.000 leituras armazenadas em buffer. Distribuídas ao longo de 10 minutos, isso resulta em 8.640.000 ÷ 600 = 14.400 leituras/segundo. Somando o tráfego ao vivo de todos os medidores, 1.333,3 leituras/segundo, obtém-se um pico nominal de aproximadamente 15.733 leituras/segundo. A carga de chegada de 10 minutos é de cerca de 9,44 milhões × 200 bytes = 1,888 GB, incluindo aproximadamente 800.000 leituras ao vivo.

Provisione capacidade de gateway e de escrita no log para pelo menos 32.000 leituras/segundo sustentadas, cerca de duas vezes o pico calculado, e reserve capacidade de fila para pelo menos toda a janela de chegada de 9,44 milhões de registros, com espaço adicional para novas tentativas e atraso de processamento. O log replicado absorve a rajada enquanto os consumidores se atualizam; consumidores escaláveis de forma independente então gravam o arquivo, o armazenamento de cobrança, a visão do painel e o estado de alertas. Essa capacidade absorve a rajada descrita sem descartar leituras aceitas. O limite de sobrescrita de 48 horas do medidor é uma limitação a montante: leituras sobrescritas antes da reconexão não podem ser recuperadas pelo backend.

Corretude e disponibilização

A cobrança usa uma tabela canônica de leituras com uma restrição de unicidade imposta pelo banco de dados sobre (meter_id, interval_start). Seu destino executa uma operação de inserção-ou-conflito: a primeira cópia insere a leitura, e novas tentativas ou envios repetidos com a mesma chave não criam outro intervalo faturável. A cobrança agrega somente essa tabela canônica. O destino confirma a leitura e o progresso do consumidor do log de forma transacional, ou usa gravações seguras para reprocessamento, para que uma falha seguida de reprocessamento não cause contagem dupla. Uma duplicata com valores conflitantes deve ser sinalizada para investigação, em vez de ser silenciosamente contabilizada como outro intervalo.

Um consumidor separado mantém uma visão materializada voltada ao cliente. Ele faz upsert pela mesma chave de intervalo e atualiza a última leitura exibida de acordo com o tempo do intervalo, e não pela ordem de chegada. Monitore a latência de ponta a ponta entre chegada e visualização e escale consumidores e partições para atingir a meta de operação normal de que 99% estejam visíveis em cinco minutos. Durante a rajada especificada, a visão pode atrasar até 60 minutos; o log durável e o arquivo permanecem íntegros enquanto ela se recupera. Os clientes podem ver informações de atualidade, para que uma visão atrasada não seja confundida com uma leitura atual.

A detecção de vazamentos é um cálculo de tempo de evento, indexado por medidor e ordenado por interval_start. Deduplique cada intervalo antes de avaliá-lo, e mantenha os resultados dos intervalos para que uma leitura tardia possa atualizar o estado e provocar o recálculo da sequência de intervalos afetada. Não decida que um intervalo está ausente apenas porque um intervalo posterior chegou primeiro. Avance uma marca d'água de completude somente depois que todos os registros do log recebidos até o tempo de ingestão relevante tiverem sido processados, e defina-a com pelo menos 48 horas de atraso em relação ao tempo de ingestão, com margem operacional extra para atraso de fila. Isso considera o período máximo de armazenamento em buffer do medidor.

Um intervalo ausente é tratado como não mostrando fluxo diferente de zero: quando ele está atrás da marca d'água de completude e não existe leitura, ele interrompe uma sequência consecutiva. Antes disso, ele está não resolvido, e não é zero. Quando 96 intervalos consecutivos finalizados mostrarem todos fluxo diferente de zero, emita um alerta para essa sequência. Persista uma identidade de alerta baseada no medidor e na sequência, e use uma caixa de saída de notificações idempotente, para que o reprocessamento não envie outro alerta para a mesma sequência. Aguardar a completude pode atrasar um alerta em até o horizonte de atraso, mas evita que uma leitura tardia e fora de ordem produza um resultado incorreto.

Exatamente três compromissos

  1. Escolhido: log replicado antes dos consumidores. Rejeitado: gravações síncronas dos gateways em todos os destinos. O log adiciona infraestrutura e alguma latência, mas armazena em buffer as rajadas de reconexão e isola a ingestão de serviços lentos de cobrança ou painel.
  2. Escolhido: visões materializadas do painel atualizadas de forma assíncrona. Rejeitado: distribuição síncrona para o painel durante a ingestão. Atualizações eventuais atendem às metas declaradas de cinco minutos em operação normal e 60 minutos durante a rajada, mantendo as consultas dos clientes rápidas; a distribuição síncrona acoplaria a aceitação dos medidores à disponibilidade do painel e à carga da rajada.
  3. Escolhido: alertas de vazamento baseados em marca d'água e sensíveis a dados atrasados. Rejeitado: alertas imediatos pela ordem de chegada. Aguardar a janela limitada de atraso custa velocidade no alerta, mas sustenta sequências corretas baseadas em intervalos e o tratamento explícito de dados ausentes.
Claude Opus 5.5 8.09

Um design sólido e bem organizado. Todos os números de capacidade correspondem aos valores esperados: 1.333/s, 23,04 GB/dia, 9,216 TB brutos e 27,648 TB replicados. O pico de rajada de 15.733/s inclui corretamente a carga constante, e o design prevê provisionamento de 2x e capacidade de fila para a janela de 9,44 milhões de registros. A cobrança exatamente uma vez é garantida por uma restrição de unicidade no banco de dados e por um sink do tipo insert-or-conflict, com confirmação (acknowledgement) somente após uma gravação durável. Os alertas de vazamento usam estado baseado em tempo do evento, com uma regra explícita e consistente para intervalos ausentes. Pontos fracos: as requisições de upload nunca são distinguidas das leituras, portanto o limite de 9 ou mais não é atingido. Os alertas de vazamento são sempre atrasados pela watermark de 48 horas, mesmo quando uma sequência já está totalmente presente. Os trade-offs são válidos, mas tendem a padrões comuns.

Nota por critério

Qualidade da arquitetura

80

O pipeline é coerente: gateways, um log replicado particionado por medidor e consumidores independentes para o arquivo, o faturamento, o painel e os alertas. O faturamento com exatamente-uma-vez é garantido na tabela canônica por meio de uma restrição de unicidade em (meter_id, interval_start), com commits de offset transacionais e confirmação após replicação durável. O estado de vazamento é em tempo de evento, recalculado em preenchimentos tardios, com uma caixa de saída de alertas idempotente. A fraqueza menor é que os alertas sempre aguardam a marca d'água de 48 horas, mesmo quando todos os 96 intervalos já chegaram, o que atrasa desnecessariamente alertas legítimos.

Completude

85

Todos os cinco requisitos são tratados de forma concreta. A aritmética de capacidade é mostrada, a rajada é calculada e absorvida, o componente que garante exatamente-uma-vez é nomeado, a regra de intervalo ausente é explícita e exatamente três trade-offs são apresentados. Com 818 palavras, a resposta está dentro da faixa de 800 a 1.100. A nota fica abaixo de 9 porque o plano de rajada não distingue requisições de upload das leituras.

Análise de trade-offs

75

Há exatamente três trade-offs, cada um nomeando a opção escolhida e a rejeitada e relacionado às metas de rajada e latência. Os dois primeiros (log versus escritas síncronas, painel assíncrono versus síncrono) são padrões bastante comuns, e não específicos do sistema. O trade-off do alerta de vazamento é bem fundamentado neste sistema.

Escalabilidade e confiabilidade

83

Todos os valores esperados estão corretos e o pico inclui o tráfego constante, com cerca de 1,888 GB de carga útil na janela de rajada. O design provisiona 32.000/s, reserva capacidade de fila para toda a janela de 9,44 milhões de registros, descreve atraso do painel de até 60 minutos com indicadores de frescor e confirma somente após replicação. Omite a taxa de requisições de upload (cerca de 600 requisições/s), portanto não atinge 9+.

Clareza

83

As seções são claramente organizadas e a aritmética é apresentada passo a passo. Os trade-offs estão claramente rotulados como escolhidos e rejeitados. Algumas frases na seção de alerta de vazamento sobre a mecânica da marca d'água são densas, mas permanecem precisas.

GPT-6.1 Sol 8.61

O projeto atende aos requisitos principais, com aritmética de capacidade correta, buffer durável para picos, deduplicação de cobrança garantida pelo banco de dados e detecção explícita de vazamentos baseada no tempo do evento. Também apresenta exatamente três trade-offs específicos do sistema e respeita o limite de palavras. As principais limitações são a ausência de dimensionamento das requisições de upload e o pouco detalhamento quantitativo sobre a capacidade de recuperação do processamento downstream, a margem para novas tentativas e a folga de armazenamento da fila.

Nota por critério

Qualidade da arquitetura

87

O log de ingestão replicado, as confirmações duráveis, a tabela canônica de cobrança com uma chave única de intervalo, as gravações seguras para reprocessamento e a caixa de saída de notificações idempotente formam uma arquitetura coerente. A detecção de vazamentos reavalia explicitamente leituras atrasadas e distingue lacunas não resolvidas de intervalos ausentes finalizados. A recuperação dos consumidores e a identidade dos alertas são descritas de forma adequada, embora os detalhes operacionais permaneçam um tanto em alto nível.

Completude

88

Todos os cinco itens exigidos são abordados, incluindo a aritmética de replicação, o pico de rajada somando tempo real e buffer, o componente de cobrança que impõe a regra, uma regra explícita de intervalo ausente e exatamente três trade-offs entre escolhido e rejeitado. A resposta de 818 palavras atende à faixa solicitada. Ela não distingue requisições de upload de leituras individuais, o que impede uma nota acima de 9 de acordo com a política.

Análise de trade-offs

83

Exatamente três trade-offs nomeiam opções escolhidas e rejeitadas e relacionam as decisões ao isolamento de rajadas, à latência do painel e à corretude de dados atrasados. O trade-off de latência do alerta de vazamento é particularmente claro. Os dois primeiros trade-offs se sobrepõem substancialmente no argumento a favor do desacoplamento assíncrono, o que limita a amplitude do raciocínio.

Escalabilidade e confiabilidade

85

Todos os valores de capacidade esperados estão corretos, incluindo aproximadamente 15.733 leituras por segundo durante a reconexão e 27,648 TB de retenção bruta replicada. A resposta especifica 32.000 leituras por segundo de capacidade de ingestão, uma reserva de fila para toda a janela de rajada, confirmações duráveis e degradação do painel para 60 minutos. Não dimensiona separadamente as requisições de upload nem quantifica as taxas de escoamento a jusante e a folga para tentativas e armazenamento, deixando algumas premissas de capacidade operacional não verificadas.

Clareza

88

A resposta é concisa, bem organizada e torna a aritmética e os mecanismos de corretude fáceis de acompanhar. A regra de intervalo ausente e a contagem exata de trade-offs são especialmente explícitas. A explicação da marca d'água é relativamente densa, e os lotes de upload versus registros individuais poderiam ser distinguidos com mais clareza.

Gemini 3.8 Flash 8.72

O design atende a todos os requisitos do prompt com exatidão matemática, separação arquitetural limpa e uma lógica sólida de processamento por tempo de evento. Os cálculos para o regime estável (1.333,3 leituras/s, 23,04 GB/dia, 27,65 TB replicados) e para o pico de rajada (15.733 leituras/s) são precisos. A deduplicação para faturamento se apoia em restrições no nível do banco de dados, com chave em (meter_id, interval_start), e a marca d'água da detecção de vazamentos trata explicitamente os intervalos ausentes após a janela de buffer de 48 horas. A única omissão que impede uma pontuação máxima no dimensionamento da rajada é a falta de distinção entre as requisições de upload HTTP/rede em lote e as leituras individuais.

Nota por critério

Qualidade da arquitetura

88

O pipeline de ponta a ponta é bem pensado: um log de ingestão particionado desacopla o gateway dos destinos de armazenamento, a deduplicação de faturamento é estritamente aplicada por uma restrição de unicidade canônica no banco de dados sobre (meter_id, interval_start), e os painéis dos clientes ficam atrás dos buffers do log com segurança. O motor de alertas usa corretamente uma marca d'água de completude de 48 horas para avaliar sequências em tempo de evento, em vez da ordem de chegada.

Completude

86

Todas as cinco tarefas exigidas são abordadas dentro do limite de 800 a 1.100 palavras. Cada passo aritmético é mostrado, a lógica de lacunas da detecção de vazamentos está totalmente definida e exatamente três trade-offs são apresentados, com opções escolhidas e rejeitadas. No entanto, não analisa o volume em nível de requisição (por exemplo, distinguir requisições de upload em lote das leituras brutas) durante rajadas de reconexão.

Análise de trade-offs

88

Exatamente três trade-offs são apresentados, e cada um identifica claramente as alternativas escolhidas e rejeitadas. O raciocínio é específico do domínio de medidores de água e das restrições de ingestão (por exemplo, log com buffer versus fan-out síncrono, visão materializada do painel versus atualizações inline, alertas atrasados por marca d'água versus avaliação imediata na ordem de chegada).

Escalabilidade e confiabilidade

85

Todos os cálculos de regime estacionário e de pico de rajada correspondem exatamente aos valores esperados, inclusive com a adição do tráfego de base à rajada da tempestade. O buffer de backlog da fila e a folga de vazão sustentada estão dimensionados de forma adequada. Pela política de avaliação 9+, fica um pouco aquém por dimensionar a vazão apenas em leituras/segundo, sem distinguir a quantidade de conexões/requisições de upload caso os medidores enviem em lote as 24 leituras.

Clareza

90

A prosa é direta, altamente organizada, evita enchimento desnecessário e mantém precisão técnica em todas as seções.

3 Claude Opus 5.5

Média (de 0 a 10) 8.39

1. Estimativas de capacidade

Taxa em regime permanente

  • 1.200.000 medidores ÷ 900 s por intervalo = 1.333 leituras/s
  • 1.333 × 200 B ≈ 267 KB/s

Volume bruto por dia

  • Leituras por dia: 1.200.000 × 96 intervalos = 115,2 M
  • Bytes por dia: 115,2 M × 200 B = 23,04 × 10^9 B = 23,04 GB/dia

Armazenamento bruto para a retenção

  • Uma cópia: 23,04 GB × 400 dias = 9.216 GB = 9,216 TB
  • Com 3 réplicas: 9,216 TB × 3 = 27,65 TB

Os índices e a sobrecarga de compactação vêm além disso. A compressão colunar provavelmente reduzirá bastante esse valor.

2. Rajada de reconexão

Taxa de pico
-...

Mostrar resposta completa ▼

1. Estimativas de capacidade

Taxa em regime permanente

  • 1.200.000 medidores ÷ 900 s por intervalo = 1.333 leituras/s
  • 1.333 × 200 B ≈ 267 KB/s

Volume bruto por dia

  • Leituras por dia: 1.200.000 × 96 intervalos = 115,2 M
  • Bytes por dia: 115,2 M × 200 B = 23,04 × 10^9 B = 23,04 GB/dia

Armazenamento bruto para a retenção

  • Uma cópia: 23,04 GB × 400 dias = 9.216 GB = 9,216 TB
  • Com 3 réplicas: 9,216 TB × 3 = 27,65 TB

Os índices e a sobrecarga de compactação vêm além disso. A compressão colunar provavelmente reduzirá bastante esse valor.

2. Rajada de reconexão

Taxa de pico

  • Medidores offline: 30% × 1,2 M = 360.000
  • Leituras armazenadas em buffer por medidor: 6 h × 4 intervalos/h = 24
  • Backlog total: 360.000 × 24 = 8,64 M leituras
  • Todos os medidores se reconectam em até 600 s, distribuídos uniformemente: 8,64 M ÷ 600 = 14.400 leituras/s
  • Some o tráfego ao vivo: 14.400 + 1.333 = 15.733 leituras/s. Isso equivale a cerca de 11,8× o regime permanente, ou aproximadamente 3,15 MB/s.
  • Se as confirmações ficarem mais lentas, as retentativas podem dobrar esse valor, então provisiono para cerca de 32.000 leituras/s.

Como o projeto absorve a rajada

  1. Gateways sem estado (MQTT/HTTPS atrás de um balanceador de carga) verificam as credenciais dos medidores e o esquema da carga útil. Eles são dimensionados para 32 mil/s mais capacidade ociosa N+1.
  2. Log durável (Kafka, fator de replicação 3, acks=all, particionado por meter_id). O gateway envia ao medidor sua confirmação somente após a escrita no log ser confirmada. Assim, toda leitura confirmada é durável, e uma leitura não confirmada é reenviada pelo medidor. Em ambos os casos, nada é perdido. Alguns MB/s são trivial para o Kafka, então as escritas continuam rápidas e as confirmações retornam bem dentro do tempo limite de 30 s, o que mantém as retentativas raras.
  3. Dois tópicos. O gateway envia para live as leituras com interval_start nos últimos 30 minutos, e tudo o que for mais antigo para backfill. Os consumidores esvaziam live primeiro, então a meta de 5 minutos do painel se mantém para os dados ao vivo mesmo durante uma tempestade.
  4. Os consumidores a jusante absorvem o backlog. Eles não precisam acompanhar o pico. A 5.000 leituras/s, o backlog de 8,64 M é zerado em cerca de 29 minutos, dentro do limite relaxado de 60 minutos do painel. A retenção do Kafka é de 7 dias, então mesmo uma falha do consumidor não causa perda de dados.
  5. Jitter no lado do medidor. O firmware adiciona um backoff aleatório na reconexão e nas retentativas, o que suaviza ainda mais a rajada.

3. Cobrança exatamente uma vez

O banco de dados do razão de cobrança garante a contagem exatamente uma vez. Ele usa a chave primária (meter_id, interval_start).

  • O consumidor de cobrança escreve com INSERT … ON CONFLICT (meter_id, interval_start) DO NOTHING.
  • Envios repetidos, reenvios do gateway e reprocessamentos do consumidor após uma falha caem todos no conflito e não alteram nada.
  • Os offsets do Kafka são confirmados somente depois que a escrita no banco de dados tem sucesso. Isso resulta em entrega pelo menos uma vez em um destino idempotente, o que, na prática, equivale a exatamente uma vez.
  • Se uma duplicata chegar com um valor diferente, o primeiro valor armazenado é mantido e o conflito vai para uma fila de conciliação. Ele nunca é somado.
  • Os totais de cobrança são calculados somente a partir dessa tabela desduplicada.
  • O armazenamento do painel (um banco de dados de séries temporais) usa a mesma chave como upsert, então seus gráficos também não têm duplicatas.

4. Alertas de vazamento em tempo de evento

Um processador de fluxo com estado (por exemplo, Flink), particionado por meter_id, lê os dois tópicos e trabalha em tempo de evento (interval_start), não em tempo de chegada.

Estado por medidor

  • Um mapa de bits sobre os últimos 296 intervalos (48 h mais 24 h de histórico mais margem). Cada posição é não zero, zero ou desconhecida.
  • As sequências atuais, cada uma identificada pelo seu primeiro intervalo.
  • Um indicador para cada sequência, registrando se ela já disparou um alerta.

Regras

  • Uma leitura atrasada preenche a sua posição, onde quer que ela esteja. A ordem de chegada não importa, e uma duplicata não tem efeito.
  • Um alerta é disparado somente quando 96 posições consecutivas estão todas presentes e todas não zero. Como toda posição precisa ser preenchida com dados confirmados, uma chegada posterior nunca pode invalidar um alerta que já foi disparado.
  • Intervalo ausente. Enquanto uma posição tiver menos de 48 h (mais 1 h de tolerância), ela é desconhecida. Ela não estende nem quebra uma sequência, e o alerta simplesmente aguarda. Depois que interval_start + 49 h tiver passado, a leitura nunca mais poderá chegar, então a posição é finalizada como ausente, o que quebra a sequência. Um alerta nunca é disparado com base em dados não verificados.
  • Um alerta por sequência. O registro de alerta é identificado por (meter_id, streak_start) em uma tabela de alertas com restrição de unicidade, então um evento reprocessado não pode enviar um segundo alerta. Uma sequência termina em uma leitura zero ou em uma lacuna finalizada. Se uma leitura atrasada preencher uma lacuna e unir duas sequências, a sequência mesclada mantém o streak_start mais antigo e herda o indicador de "já alertada", então ainda recebe apenas um alerta.
  • O estado é salvo em ponto de controle no armazenamento durável. Após uma reinicialização, o processador reprocessa a partir dos offsets confirmados e reconstrói o mesmo estado.

5. Compromissos

  1. Quando confirmar uma leitura

    • Escolhido: confirmar após a escrita replicada no log. Isso garante que nenhuma leitura seja perdida e custa alguns milissegundos por confirmação.
    • Rejeitado: confirmar no recebimento, a partir da memória. É mais rápido, mas uma falha do gateway descartaria silenciosamente leituras que o medidor já apagou do seu buffer.
  2. Como remover duplicatas

    • Escolhido: escritas idempotentes com uma chave única no razão de cobrança. Isso é simples, fácil de verificar e sobrevive a qualquer reprocessamento, de qualquer origem.
    • Rejeitado: transações Kafka exatamente uma vez de ponta a ponta. Elas não detectam duplicatas criadas antes do Kafka, como um medidor que reenvia após perder uma confirmação. Além disso, adicionam custo de coordenação e são difíceis de operar.
  3. Como tratar um intervalo ausente na detecção de vazamentos

    • Escolhido: uma lacuna finalizada quebra a sequência. Isso significa que não há alertas falsos baseados em dados estimados, e cada alerta pode ser respaldado perante o cliente. O custo é que um vazamento real com uma lacuna de conectividade de 48 horas pode ser detectado com atraso.
    • Rejeitado: tratar lacunas como continuação da sequência, ou preenchê-las a partir de leituras vizinhas. Isso detecta mais vazamentos, mas gera alertas com base em leituras que nunca existiram e torna a regra de "um alerta por sequência" pouco clara.

Resumo

  • Capacidade: 1.333 leituras/s em regime permanente, 23,04 GB/dia, 27,65 TB armazenados com 3 réplicas.
  • Rajada: pico de 15.733 leituras/s, absorvido por um log durável que confirma somente após uma escrita confirmada e por prioridade para os dados ao vivo.
  • Cobrança: a contagem exatamente uma vez é garantida pela chave única do razão.
  • Alertas de vazamento: calculados em tempo de evento, nunca disparados com base em dados não verificados, e limitados a um por sequência.
Claude Opus 5.5 8.44

Este é um design sólido e bem organizado. Todos os valores esperados estão corretos: 1.333 leituras/s, 23,04 GB/dia, 9,216 TB brutos e 27,65 TB replicados, além de um pico de 15.733 leituras/s (cerca de 11,8x o volume estável). A cobrança alcança exatamente-uma-vez por meio de um livro-razão idempotente com chave (meter_id, interval_start), com confirmação somente após uma gravação durável no log. A detecção de vazamentos é executada em tempo de evento e tem uma regra explícita e consistente para intervalos ausentes. Há exatamente três trade-offs específicos do sistema. A principal deficiência é que o plano para picos nunca separa requisições de upload ou lotes de leituras individuais, o que impede notas 9+. Além disso, a capacidade do gateway é expressa apenas em leituras/s, e não em conexões ou requisições.

Nota por critério

Qualidade da arquitetura

85

O livro-razão de cobrança é nomeado como o componente que aplica a regra, usando INSERT ON CONFLICT em (meter_id, interval_start). Os offsets são confirmados somente após a gravação no banco, e duplicatas conflitantes vão para reconciliação. O processador de vazamentos mantém estado de tempo de evento por medidor, com slots de três estados, mescla sequências em chegadas tardias e usa uma chave única (meter_id, streak_start) para os alertas. A divisão dos tópicos em tempo real e backfill é concreta e sustentada por números. Não alcança 9+ porque a condição de 9+ que exige que o plano de rajada separe requisições de upload das leituras não é atendida.

Completude

85

Os cinco itens da lista de verificação são tratados: aritmética de capacidade, pico e absorção da rajada, cobrança exatamente-uma-vez com seu componente aplicador, uma regra de vazamento em tempo de evento com regra explícita para intervalos ausentes, e exatamente três trade-offs. Com 1.033 palavras, está dentro da faixa exigida. Não alcança 9+ porque nunca distingue requisições de upload das leituras (por exemplo, cerca de 600 requisições/s).

Análise de trade-offs

85

Há exatamente três trade-offs, cada um indicando a opção escolhida e a rejeitada, com consequências específicas deste sistema. Eles cobrem confirmação após a gravação no log versus confirmação a partir da memória, sink idempotente versus transações do Kafka (observando corretamente que as retentativas anteriores ao Kafka escapam das transações), e lacunas que quebram sequências versus preenchimento de lacunas. São específicos, e não genéricos, mas a condição de 9+ não é atendida no conjunto.

Escalabilidade e confiabilidade

82

A aritmética de capacidade e de rajada está correta e inclui a carga estável. A folga de provisionamento para retentativas é um acréscimo sensato. A taxa de escoamento do backlog (5.000/s limpa em cerca de 29 minutos, dentro do limite de 60 minutos), a retenção de 7 dias no Kafka e a degradação do painel são todas declaradas. O raciocínio de não perda é sólido, porque a confirmação segue a gravação replicada. No entanto, requisições ou lotes de upload não são distinguidos das leituras, e o dimensionamento do gateway omite a contagem de conexões e requisições.

Clareza

85

As seções numeradas correspondem diretamente aos requisitos, a aritmética é apresentada passo a passo e as regras são objetivas. O resumo é conciso. Há pequenos pontos imprecisos, como a formulação vaga sobre compressão e a escolha pouco explicada de um bitmap de 296 slots.

GPT-6.1 Sol 7.76

A resposta apresenta uma aritmética de capacidade correta, um caminho de ingestão durável e crível e um faturamento idempotente bem especificado, dentro do limite de palavras. Sua principal fraqueza é a correção dos alertas de vazamento: mesclar execuções que já geraram alerta pode violar a regra de um alerta por sequência, e a expiração do buffer do medidor não estabelece que uma leitura não possa mais chegar pelo pipeline de ingestão. O dimensionamento para picos é, em geral, sólido, mas a capacidade da fila e as taxas de requisições de upload não são quantificadas, e a aritmética de escoamento do backlog omite o processamento simultâneo de dados em tempo real.

Nota por critério

Qualidade da arquitetura

65

O limite de confirmação do log replicado e a chave primária do razão de faturamento sustentam corretamente a ingestão durável e os efeitos de faturamento exatamente uma vez. Slots de tempo de evento e uma regra explícita para intervalos ausentes são bases apropriadas. No entanto, duas execuções podem, cada uma, disparar um alerta antes que uma leitura tardia que preenche a lacuna as una em uma única sequência; herdar uma flag de alertado não pode desfazer as duas notificações já enviadas. Além disso, declarar uma leitura impossível após 49 horas confunde a sobrescrita no lado do medidor com atraso de entrega no lado downstream: uma leitura já enviada ao Kafka ainda pode chegar ao processador mais tarde. São defeitos significativos na semântica exigida para vazamentos.

Completude

85

Todas as cinco áreas solicitadas são tratadas explicitamente, incluindo a aritmética de replicação, o cálculo de rajada, o componente nomeado de aplicação do faturamento, uma regra para intervalos ausentes e exatamente três trade-offs escolhidos versus rejeitados. As 1.033 palavras medidas atendem ao requisito de tamanho. A resposta não atende às condições adicionais de pontuação máxima porque omite o dimensionamento de requisições de upload e o dimensionamento explícito da capacidade de fila e backlog.

Análise de trade-offs

86

São apresentados exatamente três trade-offs, cada um com opções escolhidas e rejeitadas claras. O limite de confirmação e o tratamento de duplicatas geradas pelo medidor são particularmente relevantes para este sistema. O trade-off sobre dados ausentes também é concreto, embora sua discussão subestime que leituras sobrescritas podem nunca se tornar disponíveis, e não apenas atrasar a detecção.

Escalabilidade e confiabilidade

76

A taxa constante, o volume diário, o armazenamento de retenção replicado e o pico de rajada de 15.733 leituras/s estão todos corretos. O provisionamento para novas tentativas, confirmações duráveis e priorização de tempo real/backfill são úteis. Porém, sete dias de retenção não são uma estimativa explícita de capacidade de fila provisionada, e a vazão de requisições não é distinguida da vazão de leituras. Se 5.000 leituras/s for a capacidade total downstream, o tráfego concorrente em tempo real deixa cerca de 3.667 leituras/s para backfill, tornando o tempo conservador de drenagem de aproximadamente 39 minutos em vez de 29; ainda assim, cabe na meta relaxada do painel.

Clareza

87

A estrutura numerada segue de perto a tarefa, a aritmética é fácil de auditar, e as regras de faturamento e alerta são expressas de forma concreta. A resposta permanece dentro da faixa de palavras solicitada. Algumas afirmações categóricas, como 'nada é perdido' e que uma leitura 'nunca pode chegar' após 49 horas, ocultam premissas que deveriam ter sido declaradas, e o escopo da capacidade de consumo de 5.000 leituras/s é ambíguo.

Gemini 3.8 Flash 8.98

O design atende integralmente a todos os requisitos funcionais e não funcionais, com cálculos que correspondem exatamente aos valores esperados. O pipeline de ingestão, os mecanismos de deduplicação para faturamento e a detecção de vazamentos por tempo do evento, com uma regra explícita para intervalos ausentes, estão bem arquitetados. No entanto, o dimensionamento de picos analisa a taxa de transferência exclusivamente em termos de leituras por segundo e omite a distinção entre requisições de rede de upload (em lote) e leituras individuais, o que mantém as notas de escalabilidade abaixo do limite de 9,0 conforme a política.

Nota por critério

Qualidade da arquitetura

88

A arquitetura é robusta, com gateways sem estado, um log Kafka replicado dividido em tópicos de dados ao vivo e de reprocessamento, e um destino de cobrança idempotente. O design de detecção de vazamentos opera corretamente em tempo de evento, com tratamento explícito de estado para chegadas atrasadas e fora de ordem.

Completude

92

Todos os requisitos do prompt são atendidos: cálculos aritméticos completos para os estados estável e de rajada, componente e lógica de cobrança com exatamente uma vez, uma regra explícita de lacuna para alertas de vazamento, exatamente três trade-offs específicos do sistema e conformidade com os limites de palavras.

Análise de trade-offs

92

São apresentados exatamente três trade-offs altamente relevantes e específicos do domínio (momento da confirmação, local da deduplicação e interpretação de lacunas na detecção de vazamentos). Cada um contrasta claramente a abordagem escolhida com uma alternativa rejeitada.

Escalabilidade e confiabilidade

87

Os cálculos de capacidade e de pico são matematicamente precisos (incluindo a soma do tráfego em regime estável durante as rajadas). A drenagem do backlog e a degradação do SLA dos painéis são bem tratadas, mas a análise não distingue requisições de upload HTTP/MQTT (por exemplo, 600 lotes/s) de leituras individuais, limitando este critério abaixo de 9,0.

Clareza

92

A resposta está bem estruturada, é concisa e fácil de acompanhar, com títulos de seção claros e derivações nítidas.

4 Claude Sonnet 5.5

Média (de 0 a 10) 8.20

1. Estimativas de capacidade

Estado estacionário

  • Intervalos por dia: 24 h × 4 = 96.
  • Leituras por segundo: 1.200.000 / 900 s = ≈1.333 leituras/s. Isso equivale a cerca de 267 KB/s na rede.
  • Leituras por dia: 1.200.000 × 96 = 115,2 M.
  • Volume bruto por dia: 115,2 M × 200 B = 23,04 GB, portanto ≈23 GB/dia.
  • Retenção: 23,04 GB × 400 dias = 9.216 GB ≈ 9,2 TB de uma cópia.
  • Com 3 réplicas: 9,216 TB × 3 = ≈27,6 TB (27.648 GB).
  • Isso não inclui índices nem compressão. Eu adicionaria cerca de 30% de folga, resultando em um valor provisionado de cerca de 36 TB.

2. Rajada de reconexão

  • Med...
Mostrar resposta completa ▼

1. Estimativas de capacidade

Estado estacionário

  • Intervalos por dia: 24 h × 4 = 96.
  • Leituras por segundo: 1.200.000 / 900 s = ≈1.333 leituras/s. Isso equivale a cerca de 267 KB/s na rede.
  • Leituras por dia: 1.200.000 × 96 = 115,2 M.
  • Volume bruto por dia: 115,2 M × 200 B = 23,04 GB, portanto ≈23 GB/dia.
  • Retenção: 23,04 GB × 400 dias = 9.216 GB ≈ 9,2 TB de uma cópia.
  • Com 3 réplicas: 9,216 TB × 3 = ≈27,6 TB (27.648 GB).
  • Isso não inclui índices nem compressão. Eu adicionaria cerca de 30% de folga, resultando em um valor provisionado de cerca de 36 TB.

2. Rajada de reconexão

  • Medidores afetados: 30% × 1,2 M = 360.000.
  • Intervalos armazenados em buffer por medidor: 6 h × 4 = 24.
  • Acúmulo: 360.000 × 24 = 8,64 M de leituras, o que equivale a 1,73 GB.
  • Janela de envio: 10 min = 600 s, distribuídos uniformemente, então a taxa do acúmulo = 8,64 M / 600 = 14.400/s.
  • O tráfego ao vivo continua em 1.333/s.
  • Pico = 14.400 + 1.333 ≈ 15.733 leituras/s, cerca de 11,8× o estado estacionário, ou cerca de 3,1 MB/s.

As retentativas somam-se a isso. Se as confirmações forem atrasadas além de 30 s, os medidores reenviam. Por isso, dimensiono o caminho de ingestão para 2× o pico, cerca de 32.000/s. Na prática, isso significa 8 nós de ingestão sem estado, com cerca de 5.000/s cada, mais N+2 de reserva.

Como nada se perde

  1. O gateway de ingestão valida uma leitura e a anexa a um log durável e particionado, como o Kafka. Ele usa acks=all, fator de replicação 3 e min.insync.replicas=2. Ele envia ao medidor a confirmação somente depois que a anexação é bem-sucedida.
  2. O log tem 48 partições com chave meter_id e mantém 7 dias de dados. A rajada é de cerca de 3 MB/s, o que é trivial para o log. Os consumidores podem ficar atrasados por minutos ou horas sem perda.
  3. Se o gateway ou o log estiver sobrecarregado, ele retorna 503 ou nenhuma confirmação. O medidor mantém a leitura e tenta novamente. Seu buffer de 48 horas cobre uma interrupção de 6 horas mais a recuperação, o que deixa cerca de 42 horas de margem. Assim, a contrapressão nunca descarta dados.
  4. Os consumidores a jusante (gravador de faturamento, projetor do painel, processador de vazamentos) têm grupos de consumidores separados. Eles confirmam os offsets somente depois que suas gravações têm sucesso, de modo que uma falha causa reprocessamento, não perda.
  5. Os consumidores são dimensionados para cerca de 30.000/s. O acúmulo de 8,64 M é então drenado em cerca de 5 minutos, bem dentro do orçamento relaxado de 60 minutos do painel. Em operação normal, o atraso permanece em segundos, o que atende à meta de 5 minutos para 99% das leituras.

3. Faturamento exatamente uma vez

A entrega é pelo menos uma vez em todos os pontos: retentativas do medidor, retentativas do gateway e reprocessamentos do log. O efeito exatamente uma vez é garantido por um único componente: o armazenamento de leituras, um armazenamento SQL replicado (3 réplicas, particionado por meter_id). Ele tem uma chave primária (meter_id, interval_start).

  • O gravador de faturamento executa INSERT … ON CONFLICT DO NOTHING. Uma duplicata não tem efeito, seja ela proveniente de uma retentativa do medidor, de um reprocessamento ou de uma reinicialização do consumidor.
  • Os totais de faturamento são calculados consultando esta tabela. Eles nunca são mantidos como contadores de stream que poderiam ser incrementados duas vezes.
  • O interval_start é definido pelo medidor e alinhado à grade de 15 minutos. O gateway rejeita valores desalinhados e os coloca em quarentena.
  • Se uma chave duplicada chegar com um conteúdo diferente, a primeira gravação prevalece. O conflito é registrado em uma tabela de discrepâncias para revisão, de modo que o faturamento nunca seja alterado silenciosamente.
  • Os consumidores a jusante agem somente sobre as linhas que a inserção informa como recém-criadas. Por isso, o painel e o processador de vazamentos também são deduplicados.

Este armazenamento também é o armazenamento bruto. Seus 27,6 TB são o valor replicado calculado acima.

4. Alertas de vazamento com dados atrasados e fora de ordem

A regra é avaliada pelo interval_start, portanto o processador usa tempo do evento e não mantém janelas baseadas no tempo de chegada. Trata-se de um job de stream com estado, com chave meter_id, que consome somente leituras recém-inseridas.

Estado por medidor (cerca de 70 bytes):

  • Um anel de 2 bits por intervalo, cobrindo os últimos 288 intervalos (72 horas). Os três valores são desconhecido, zero e não zero.
  • alerted_range = [start, end] para a última sequência com alerta.

A cada leitura no intervalo t:

  1. Defina o slot de t.
  2. Se ele for não zero, varra à esquerda e à direita a partir de t para encontrar a sequência contígua máxima de intervalos não zero que contém t.
  3. Se o comprimento da sequência for ≥ 96 e ela não se sobrepuser a alerted_range, emita um alerta. Em seguida, defina alerted_range como a sequência.
  4. Se a sequência se sobrepuser a alerted_range, estenda alerted_range e não emita nada.

Como o estado depende apenas do conjunto de leituras e não da ordem delas, um lote que chega em ordem inversa produz o mesmo resultado que a chegada em ordem. Uma leitura atrasada que preenche um buraco pode unir duas sequências menores em uma sequência de 96, e o alerta é disparado nesse momento. Uma leitura zero encerra a sequência. A próxima sequência qualificada é uma nova sequência e pode gerar alerta novamente.

Os alertas são gravados em uma outbox na mesma transação de alerted_range, e uma chave única (meter_id, streak_start) reforça essa garantia. Reprocessamentos e reinicializações, portanto, não podem enviar um segundo alerta.

Intervalos ausentes. Um intervalo ausente é desconhecido. Não é zero nem não zero, e nunca é interpolado. Ele quebra a contiguidade, portanto nenhum alerta é disparado através de uma lacuna. A sequência é reavaliada automaticamente se a leitura ausente chegar depois, o que pode acontecer até 48 horas após o intervalo. Após 48 horas, ela é perdida permanentemente e a sequência permanece interrompida. Isso favorece a ausência de alarmes falsos, ao custo de um possível alerta atrasado ou perdido após uma interrupção longa. Se ficar claro que alertas perdidos são piores do que alertas falsos, pode-se acrescentar um aviso separado de "lacuna de dados".

Estado com mais de 72 horas é removido. Leituras mais antigas que o limite de 48 horas não podem chegar legitimamente, então são registradas em log e ignoradas.

5. Compensações

1. Quando confirmar ao medidor.

  • Escolhido: confirmar após a anexação ao log durável.
  • Rejeitado: confirmar após a gravação no armazenamento SQL.
  • Motivo: a gravação no log é uma anexação rápida, não afetada pela carga do banco de dados. Assim, uma rajada não pode elevar a latência de confirmação além de 30 s e disparar tempestades de retentativas.
  • Custo: os dados ainda não são consultáveis no momento da confirmação. Isso é aceitável porque o faturamento tolera atraso e o painel permite 60 minutos durante uma rajada.

2. Onde deduplicar.

  • Escolhido: uma restrição de chave primária no banco de dados com inserção idempotente.
  • Rejeitado: deduplicação no nível do stream, ou seja, transações do Kafka ou um cache "visto" em memória ou baseado em filtro de Bloom.
  • Motivo: as transações do Kafka cobrem apenas o trecho do log, não as retentativas do medidor que criam novas mensagens. Um cache é limitado e pode ser perdido em uma reinicialização, e um filtro de Bloom tem falsos positivos, o que descartaria uma leitura faturável.
  • Custo: cada duplicata custa uma inserção conflitante e barata. Com 2× o pico, isso fica bem dentro da capacidade do armazenamento.

3. Como avaliar vazamentos.

  • Escolhido: um bitmap por medidor, orientado a eventos e avaliado a cada nova leitura.
  • Rejeitado: uma varredura periódica em lote ou janelas fechadas por marca d'água.
  • Motivo: o bitmap é independente da ordem e tolera atraso de 48 horas sem nenhum atraso de marca d'água, de modo que os alertas são disparados assim que o último intervalo ausente chega. As janelas precisariam de uma marca d'água de 48 horas e atrasariam todos os alertas, ou então emitiriam resultados errados que exigiriam correção posterior.
  • Custo: cerca de 85 MB de estado com chave (1,2 M × cerca de 70 B) e uma recuperação cuidadosa do estado a partir de checkpoints.
Claude Opus 5.5 8.36

Um design sólido e numericamente preciso. Todos os valores esperados de capacidade e de pico estão corretos, com a aritmética demonstrada. O faturamento exactly-once é garantido por uma inserção idempotente com chave primária no armazenamento de leituras, com confirmação (acknowledgement) somente após um append durável no log. A lógica de vazamento por tempo do evento (event-time) independe da ordem e tem uma regra explícita para intervalos ausentes. Os três trade-offs são específicos do sistema, e cada um nomeia as opções escolhidas e as rejeitadas. Pontos fracos: as requisições de upload nunca são distinguidas das leituras (não há número de taxa de requisições), o que impede nota 9 ou mais em todos os critérios. Com 1.161 palavras, a resposta também excede o limite de 1.100 palavras.

Nota por critério

Qualidade da arquitetura

85

Os componentes são concretos e numerados: Kafka com acks=all, RF3, min.insync=2, 48 partições e retenção de 7 dias; uma loja SQL particionada (sharded) com chave (meter_id, interval_start) e ON CONFLICT DO NOTHING; e um processador de vazamento com estado, usando um anel de 2 bits e uma outbox com uma chave única de sequência. O componente que garante a exatamente uma vez é claramente nomeado. O tratamento de payloads conflitantes e o fan-out apenas de "inseridos recentemente" são bem pensados. As condições para nota 9+ não são todas atendidas, então a nota fica abaixo de 9.

Completude

85

Todos os cinco itens da lista de verificação são tratados por completo. Estão presentes a aritmética de capacidade, o pico de rajada, a cobrança exatamente uma vez com o componente que a garante, a regra de vazamento em tempo de evento com uma regra explícita para lacunas, e exatamente três trade-offs. O texto tem mais de 1.100 palavras, mas menos de 1.210, então a penalidade de completude da política não se aplica. A ausência da distinção entre requisições e leituras impede nota 9+.

Análise de trade-offs

85

Há exatamente três trade-offs, cada um específico deste sistema: confirmar após o log versus após o BD, deduplicação por chave no BD versus deduplicação por stream ou Bloom, e bitmap orientado a eventos versus janelas de watermark. Cada um nomeia as opções escolhidas e rejeitadas e declara seu custo. O raciocínio é sólido, incluindo a observação de que as transações do Kafka não cobrem as novas tentativas dos medidores. A nota é limitada abaixo de 9 pela condição global de 9+.

Escalabilidade e confiabilidade

83

Os números estão corretos: 1.333/s, 23,04 GB/dia, 9,216 TB e 27,6 TB; a rajada é de 8,64 milhões de leituras, 14.400 + 1.333 = 15.733/s, cerca de 11,8 vezes o estado estacionário. A resposta acrescenta margem de retry de 2x, dimensionamento de nós, um backlog de 1,73 GB frente a uma retenção de log de 7 dias, um tempo de esvaziamento de cerca de 5 minutos, metas de atraso dos painéis e back-pressure por retry sem ack dentro do buffer de 48 horas. Nunca calcula as taxas de requisições de upload separadamente das leituras (por exemplo, cerca de 600 lotes/s), então não se qualifica para nota 9+.

Clareza

75

Bem organizado, com seções numeradas, marcadores e os principais números em negrito, o que facilita o acompanhamento. O texto tem 1.161 palavras, contra um limite de 800 a 1.100. Essa falha não é nomeada pela política, então é descontada aqui (-1).

GPT-6.1 Sol 7.19

A resposta apresenta cálculos corretos de capacidade e de rajadas, um caminho de ingestão durável e concreto, deduplicação de faturamento imposta pelo banco de dados e exatamente três compromissos (trade-offs) específicos do sistema. No entanto, o algoritmo de vazamento pode emitir vários alertas para uma sequência que depois é unida por uma leitura atrasada, e a passagem dos inserts bem-sucedidos para os processadores downstream não é à prova de falhas (crash-safe), conforme descrita. A resposta também excede o limite de palavras solicitado e omite o dimensionamento das requisições de upload.

Nota por critério

Qualidade da arquitetura

55

O log durável e a restrição de chave primária fornecem uma base sólida para efeitos de cobrança exatamente-uma-vez. A correção de vazamento não é garantida: duas execuções qualificadoras separadas por um intervalo desconhecido podem cada uma gerar um alerta, e depois se tornar uma única sequência quando esse intervalo chegar com valor diferente de zero. Manter apenas o último intervalo alertado também perde o histórico de deduplicação quando execuções disjuntas chegam fora de ordem. Além disso, consumir apenas as linhas recém-inseridas exige um outbox transacional ou uma transferência por CDC; caso contrário, uma falha após a inserção, mas antes da publicação downstream, faz com que o replay produza uma duplicata sem efeito e possivelmente pule o processamento do dashboard ou do vazamento. O outbox de alertas trata da persistência do estado local, mas não corrige esses problemas.

Completude

80

Todos os cinco tópicos solicitados são abordados explicitamente, incluindo retenção com replicação, tráfego ao vivo no pico de rajada, o componente de imposição de cobrança, uma regra para intervalo ausente e exatamente três comparações de escolhido versus rejeitado. As 1.161 palavras medidas excedem o máximo de 1.100 palavras, o que custa um ponto. As requisições de upload não são distinguidas das leituras, e o provisionamento numérico de armazenamento de fila/backlog não é informado, o que impede uma pontuação máxima.

Análise de trade-offs

80

Exatamente três trade-offs são apresentados, cada um com opções escolhidas e rejeitadas explícitas e custos relevantes. O posicionamento das confirmações e a deduplicação durável estão especialmente bem associados às tempestades de novas tentativas e à segurança da cobrança. O trade-off de vazamento exagera a necessidade de atrasar cada alerta baseado em marca d'água em 48 horas, e sua alegada correção imediata e independente da ordem é enfraquecida pelo problema de união de sequências.

Escalabilidade e confiabilidade

75

Toda a aritmética esperada está correta: aproximadamente 1.333 leituras/s, 23,04 GB/dia, 27,648 TB de retenção replicada e 15.733 leituras/s durante a reconexão. A resposta especifica a taxa de transferência de ingestão e de consumidores, a margem para novas tentativas, o log replicado, a retenção de sete dias e a degradação e recuperação do dashboard. No entanto, a capacidade da fila não é quantificada em bytes ou registros, a taxa de transferência das requisições de upload é omitida, e uma margem fixa de 2x para novas tentativas não estabelece por si só proteção contra amplificação sustentada de novas tentativas. A afirmação de que a contrapressão nunca perde dados é absoluta demais, dado o buffer finito de 48 horas do medidor.

Clareza

84

As seções numeradas, a aritmética visível e os rótulos explícitos de escolhido/rejeitado tornam o design fácil de inspecionar. A terminologia geralmente distingue bem a entrega at-least-once dos efeitos exatamente-uma-vez. Algumas afirmações são mais fortes do que seus mecanismos de apoio, especialmente a de que os resultados de vazamento são independentes da ordem e a de que a contrapressão nunca descarta dados; a relação entre grupos de consumidores de log separados e o consumo apenas de linhas recém-inseridas também não está clara.

Gemini 3.8 Flash 9.04

A resposta é excepcionalmente bem estruturada, precisa e aborda com rigor todos os requisitos do prompt. As estimativas de capacidade e os cálculos da rajada de reconexão correspondem exatamente aos valores esperados. O mecanismo de deduplicação e a máquina de estados de detecção de vazamentos foram cuidadosamente projetados em torno da semântica de tempo de evento, e os três trade-offs são concretos e adaptados ao cenário. A escalabilidade só não ficou na faixa mais alta porque as requisições HTTP/de rede de upload não foram distinguidas das leituras individuais durante a rajada.

Nota por critério

Qualidade da arquitetura

92

A arquitetura separa bem as responsabilidades: o log de ingestão fornece resiliência de contrapressão, o armazenamento relacional impõe deduplicação idempotente em (meter_id, interval_start), e uma máquina de estados em memória, baseada em tempo de evento, avalia sequências de vazamento sem depender da ordem de chegada.

Completude

88

As cinco seções exigidas são respondidas de forma completa, incluindo aritmética, absorção de rajadas, semântica de exatamente uma vez, avaliação de vazamento com regras explícitas para intervalos ausentes e três trade-offs específicos do sistema. A resposta ultrapassa ligeiramente a meta de 1.100 palavras (1.161 palavras), mas permanece bem abaixo do limite de penalidade de 1.210 palavras.

Análise de trade-offs

93

A resposta apresenta exatamente três trade-offs, nomeando opções concretas escolhidas e rejeitadas para cada um (momento do ack, local da deduplicação e estratégia de avaliação de vazamento), com justificativas realistas e custos claros de trade-off, em vez de comparações genéricas.

Escalabilidade e confiabilidade

87

A aritmética de capacidade e os cálculos de rajada estão completamente corretos (1.333 leituras/s em regime estável, 15.733 leituras/s no pico de rajada). O buffer de fila durável e a degradação do painel durante as rajadas são bem tratados. No entanto, falta a condição para 9+: não se distingue entre requisições de upload (por exemplo, medidores enviando 24 leituras em um único lote a cerca de 600 req/s) e leituras brutas por segundo.

Clareza

92

A escrita é concisa, claramente seccionada e fácil de acompanhar. As fórmulas, os detalhes do estado do sistema e as etapas algorítmicas para avaliação de sequências são explicados com excepcional clareza.

5 Gemini 3.8 Flash

Média (de 0 a 10) 7.90

Arquitetura Regional de Ingestão de Medidores Inteligentes de Água

1. Estimativas de Capacidade e Aritmética

Leituras por Segundo em Regime Permanente
  • Frota de medidores: $1,200,000$ medidores.
  • Intervalo: A cada 15 minutos ($15 \times 60 = 900$ segundos).
  • Cálculos:
    $$\text{Vazão em Regime Permanente} = \frac{1,200,000\text{ leituras}}{900\text{ segundos}} = 1,333.33\text{ leituras/segundo}$$
Volume Bruto de Dados por Dia
  • Leituras por medidor por dia: $\frac{24\text{ horas} \times 60\text{ minutos}}{15\text{ minutos}} = 96\text{ leituras/dia}$.
  • **Total de leituras diária...
Mostrar resposta completa ▼

Arquitetura Regional de Ingestão de Medidores Inteligentes de Água

1. Estimativas de Capacidade e Aritmética

Leituras por Segundo em Regime Permanente
  • Frota de medidores: $1,200,000$ medidores.
  • Intervalo: A cada 15 minutos ($15 \times 60 = 900$ segundos).
  • Cálculos:
    $$\text{Vazão em Regime Permanente} = \frac{1,200,000\text{ leituras}}{900\text{ segundos}} = 1,333.33\text{ leituras/segundo}$$
Volume Bruto de Dados por Dia
  • Leituras por medidor por dia: $\frac{24\text{ horas} \times 60\text{ minutos}}{15\text{ minutos}} = 96\text{ leituras/dia}$.
  • Total de leituras diárias: $1,200,000 \times 96 = 115,200,000\text{ leituras/dia}$.
  • Tamanho da carga útil: $200\text{ bytes/leitura}$ na transmissão.
  • Cálculos (usando unidades decimais, onde $1\text{ GB} = 10^9\text{ bytes}$):
    $$\text{Volume Diário de Ingestão} = 115,200,000 \times 200\text{ bytes} = 23,040,000,000\text{ bytes} = 23.04\text{ GB/dia}$$
Armazenamento Bruto para Retenção de 400 Dias (com 3 Réplicas)
  • Armazenamento de 400 dias com uma única cópia:
    $$400\text{ dias} \times 23.04\text{ GB/dia} = 9,216\text{ GB} = 9.216\text{ TB}$$
  • Armazenamento com replicação tripla:
    $$9,216\text{ GB} \times 3 = 27,648\text{ GB} = 27.648\text{ TB}$$

2. Dimensionamento e Absorção de Rajadas na Reconexão

Cálculos do Pico de Rajada
  • Medidores afetados: $30% \text{ de } 1,200,000 = 360,000\text{ medidores}$.
  • Duração da interrupção: 6 horas = $6 \times 4 = 24\text{ intervalos}$ acumulados por medidor.
  • Total de leituras armazenadas em buffer: $360,000 \times 24 = 8,640,000\text{ leituras}$.
  • Janela de reconexão: 10 minutos = $600\text{ segundos}$ (distribuídos uniformemente).
  • Taxa de chegada da rajada a partir do backlog:
    $$\text{Taxa de Rajada} = \frac{8,640,000\text{ leituras}}{600\text{ segundos}} = 14,400\text{ leituras/segundo}$$
  • Tráfego simultâneo de regime permanente ativo: $1,333.33\text{ leituras/segundo}$.
  • Vazão combinada de pico:
    $$\text{Taxa de Pico} = 14,400 + 1,333.33 = 15,733.33\text{ leituras/segundo} \approx 15,734\text{ leituras/segundo}$$
  • Largura de banda de ingresso no pico:
    $$15,734\text{ leituras/s} \times 200\text{ bytes} = 3,146,800\text{ bytes/s} \approx 3.15\text{ MB/s (25.2 Mbps)}$$
Estratégia de Absorção
  1. Terminação na Borda e ACK Rápido: Uma frota de API Gateways sem estado, escalados horizontalmente, fica à frente do endpoint de ingestão. Como os medidores tentam novamente após 30 segundos sem um ACK, o gateway verifica a estrutura do lote e anexa imediatamente a carga útil a um log de commit distribuído (Apache Kafka) antes de confirmar HTTP 202/200 em menos de 50 milissegundos. Isso elimina timeouts de cliente sem confirmação e retentativas em cascata.
  2. Desacoplamento por Fila: O Kafka atua como um amortecedor durável de choques. As partições são divididas estritamente pelo hash de meter_id (usando 64 partições para lidar com conforto com até $50,000\text{ msgs/s}$). Mesmo que o processamento dos consumidores a jusante desacelere durante a rajada, o caminho de ingresso persiste o fluxo de dados de 3.15 MB/s diretamente em disco, sem aplicar contrapressão aos gateways de borda.
  3. Limitação de Consumo do Painel do Cliente: Os workers de projeção do painel do cliente limitam o consumo de ingestão, atendendo facilmente ao SLO de rajada relaxado de 60 minutos, enquanto garantem capacidade de consumo dedicada aos processadores de fluxo críticos de cobrança e alertas.

3. Ingestão de Cobrança Exatamente Uma Vez

Retentativas de rede inevitavelmente produzem mensagens duplicadas com (meter_id, interval_start) idênticos. O projeto garante contagem exatamente uma vez na Camada de Carga de Armazenamento de Cobrança (Pipeline de Ingestão de Cobrança) por meio de uma combinação de upserts idempotentes e restrições de chave primária relacional.

Mecanismo
  • Chave Natural: A chave primária do razão de staging de cobrança é (meter_id, interval_start).
  • Limite de Deduplicação: Um carregador de lotes transacional consome eventos do Kafka e os grava em um banco de dados de razão de cobrança imutável e somente de inserção, usando semântica de upsert determinística (INSERT ... ON CONFLICT (meter_id, interval_start) DO NOTHING).
  • Idempotência em Duas Fases:
    1. Antes do staging, um processador de fluxo com estado (por exemplo, Apache Flink) usa uma tabela de estado com suporte em RocksDB, mantendo um filtro de deduplicação deslizante de 48 horas (correspondendo ao buffer máximo de 48 horas do medidor). Retentativas de rede duplicadas que ocorram dentro dessa janela são descartadas imediatamente.
    2. Quaisquer retentativas que contornem ou sejam recarregadas após reinicializações dos workers atingem a restrição de índice único do banco de dados em (meter_id, interval_start). As consultas de agregação de cobrança somam exclusivamente este razão deduplicado, tornando matematicamente impossível a contagem em excesso.

4. Motor de Alertas de Vazamento com Leituras Fora de Ordem / Ausentes

Lógica de Detecção

Um vazamento contínuo é definido como 96 intervalos consecutivos de 15 minutos (24 horas contínuas) de fluxo diferente de zero, avaliados estritamente por interval_start.

Pipeline de Processamento de Fluxo
  1. Marcas d'Água e Atraso Permitido: Uma topologia de streaming (Apache Flink) mantém um estado com chave por medidor, rastreando intervalos contíguos. Como os medidores podem armazenar em buffer até 48 horas, o job de streaming configura um limite de atraso permitido de 48 horas. Leituras chegadas com atraso são roteadas de volta ao estado com chave do medidor, em vez de descartadas.
  2. Conjunto de Bits de Contiguidade / Árvore de Intervalos: Cada medidor mantém uma estrutura de estado de intervalos contendo os intervalos avaliados mais recentes, ordenados por interval_start. Quando chega uma rajada fora de ordem, os intervalos preenchem seus slots correspondentes na linha do tempo cronológica.
  3. Tratamento de Intervalos Ausentes:
    • Se um intervalo estiver ausente devido a perda de pacotes, desvio de relógio ou exceder o limite de sobrescrita do buffer de 48 horas do medidor, ele é tratado como um fluxo contíguo desconhecido/interrompido.
    • Como a especificação exige 96 intervalos consecutivos de fluxo não zero confirmado, um intervalo ausente zera a sequência ativa. O motor nunca presume fluxo ou fluxo zero para dados ausentes.
  4. Garantia de Alerta Único:
    • A máquina de estados rastreia streak_count e uma flag booleana alert_emitted_for_current_streak.
    • Quando streak_count atinge 96, o motor verifica se alert_emitted_for_current_streak é false. Se for false, emite o alerta de vazamento e define a flag como true.
    • Intervalos subsequentes consecutivos não zero incrementam streak_count, mas suprimem novos alertas. Somente quando uma leitura zero (ou um intervalo ausente) quebra a sequência é streak_count zerado e alert_emitted_for_current_streak redefinido para false.

5. Compromissos Arquiteturais

Compromisso 1: Momento da Confirmação de Ingestão
  • Opção Escolhida: Confirmar o recebimento assim que as leituras brutas forem gravadas na fila de mensagens distribuída (Kafka).
  • Opção Rejeitada: Confirmar o recebimento somente após as gravações serem concluídas no banco de dados histórico de longo prazo e nas tabelas de cobrança.
  • Justificativa: Um ACK completo de ponta a ponta durante uma tempestade de reconexão de 15,734 rps arrisca atingir gargalos de I/O do banco de dados. Se as respostas excederem o timeout de 30 segundos do medidor, os medidores tentam novamente, aumentando a carga de ingresso exponencialmente. O ACK no nível da fila garante persistência em milissegundos e interrompe as retentativas imediatamente.
Compromisso 2: Arquitetura de Computação para Detecção de Vazamentos
  • Opção Escolhida: Processador de streaming com estado e tempo de evento (Apache Flink com backend de estado RocksDB).
  • Opção Rejeitada: Consultas SQL em lote periódicas sobre tabelas de banco de dados analítico (por exemplo, executadas a cada 15 minutos).
  • Justificativa: Varreduras SQL em lote sobre milhões de medidores com chegadas tardias fora de ordem exigem consultar janelas deslizantes enormes de vários dias sobre bilhões de linhas para reconstruir lacunas e sequências. O motor de streaming com estado avalia o estado deslizante de forma incremental à medida que os dados chegam, mantendo a latência mínima e eliminando varreduras repetidas de tabelas.
Compromisso 3: Armazenamento de Dados do Painel do Cliente
  • Opção Escolhida: Armazenamento NoSQL/séries temporais pré-agregado e otimizado para leitura (por exemplo, Apache Cassandra / ScyllaDB).
  • Opção Rejeitada: Consultas sob demanda diretamente no banco de dados relacional normalizado de cobrança.
  • Justificativa: As consultas do painel apresentam alta concorrência de leitura e requisitos de consistência flexíveis (permitindo até 60 minutos de atraso durante rajadas). Desacoplar as leituras do painel do armazenamento de cobrança protege as transações financeiras de picos de consultas dos clientes e permite escalonamento horizontal com 23+ GB por dia.
Claude Opus 5.5 7.56

A aritmética de capacidade e de pico está totalmente correta, a deduplicação de faturamento é concreta e está posicionada corretamente, e há exatamente três trade-offs específicos do sistema. Os pontos fracos são a lógica de alerta de vazamento, o plano para picos e as condições para a nota 9+. A lógica de vazamento zera a sequência quando há uma lacuna, mas também permite preenchimentos tardios de até 48 horas, o que gera risco de efeitos da ordem de chegada e de alertas duplicados. O plano para picos omite as contagens de requisições de upload e o dimensionamento do backlog, portanto as condições para a nota 9+ não são atendidas.

Nota por critério

Qualidade da arquitetura

68

A exatamente-uma-vez na cobrança está bem especificada: um upsert ON CONFLICT DO NOTHING com chave em (meter_id, interval_start) no razão de cobrança, somado a um filtro de deduplicação de 48 horas no Flink, com o ACK enviado somente após a gravação durável no Kafka. O projeto de vazamento tem estado por medidor com chave em interval_start e tolerância de atraso de 48 horas. No entanto, depende de um streak_count em execução que é zerado imediatamente quando falta um intervalo. Isso conflita com tratar a lacuna como 'desconhecida' e com preenchimentos tardios, e não mostra como a sequência é recalculada quando a lacuna é preenchida depois. Zerar a flag de alerta em uma lacuna que é preenchida depois também pode gerar um alerta duplicado.

Completude

80

Todos os cinco itens exigidos são abordados, incluindo uma regra explícita para intervalos ausentes e todos os números de capacidade. Com 984 palavras, a resposta está dentro do limite. Alguns detalhes são superficiais: não há dimensionamento em nível de requisição nem volume de backlog.

Análise de trade-offs

80

Há exatamente três trade-offs, cada um nomeando uma opção escolhida e uma opção rejeitada. Eles estão ligados ao sistema: o momento do ACK versus a retentativa de 30 s, a detecção de vazamento em streaming versus em lote com dados atrasados, e um armazenamento separado para o painel. O terceiro tem uma justificativa um tanto genérica.

Escalabilidade e confiabilidade

76

Todos os valores esperados estão corretos: 1.333/s, 23,04 GB/dia, 9,216 TB e 27,648 TB, e uma rajada de 14.400 + 1.333 = 15.733/s. O buffer do Kafka, o ACK rápido, o dimensionamento de partições e a limitação do painel ao SLO de 60 minutos são declarados. Faltam a taxa de requisições de upload (cerca de 600 req/s), distinta da taxa de leituras, e o tamanho do backlog ou a capacidade de retenção, portanto a resposta não atinge o padrão de 9+.

Clareza

80

Bem estruturada, com seções numeradas e aritmética claramente exibida. Há pequenas inconsistências de redação, como um razão 'somente de anexação' escrito com upserts e intervalos ausentes descritos como 'desconhecidos', mas tratados como quebras.

GPT-6.1 Sol 7.37

A resposta acerta toda a aritmética de capacidade e de picos (bursts) e apresenta uma arquitetura de log durável confiável, com deduplicação de faturamento imposta pelo banco de dados. Seus principais pontos fracos são um plano de backlog e recuperação insuficientemente especificado, uma cobertura incompleta de SLOs no dashboard e um estado de alerta de vazamento que não explica como leituras tardias unem sequências antes separadas sem gerar alertas duplicados. Os três trade-offs são claros e relevantes.

Nota por critério

Qualidade da arquitetura

65

O limite de ingestão em log durável e o registro de cobrança com chave única tratam corretamente as repetições e a contagem exatamente uma vez. O processamento de vazamentos usa interval_start e trata explicitamente intervalos ausentes como quebras, mas o contador e o sinalizador de alerta reiniciável não garantem correção quando dados atrasados conectam sequências previamente separadas. O projeto precisa de recálculo histórico das sequências e reconciliação dos alertas já emitidos, além de emissão de alertas durável ou transacional para evitar duplicatas após a recuperação. A ordenação de checkpoints do consumidor e a implementação da retenção de dados brutos também estão pouco especificadas.

Completude

75

Toda a aritmética solicitada está presente, incluindo o armazenamento replicado de 400 dias e o tráfego ativo no pico de rajada. A resposta nomeia o componente de deduplicação de cobrança, declara uma regra para intervalos ausentes, apresenta exatamente três trade-offs escolhido versus rejeitado e atende à faixa de palavras medida. No entanto, não aborda explicitamente o requisito de operação normal de que 99% das leituras fiquem visíveis em cinco minutos, e a meta do painel durante a rajada é afirmada sem um orçamento de processamento.

Análise de trade-offs

83

Exatamente três trade-offs identificam opções escolhidas e rejeitadas. O tempo de ACK está diretamente ligado ao timeout de repetição de 30 segundos, o processamento por tempo de evento está ligado às chegadas em buffer, e o isolamento do painel protege as cargas de cobrança. Parte da justificativa é exagerada: as repetições não precisam crescer exponencialmente, e a detecção de lotes indexada ou incremental não precisa varrer bilhões de linhas. Os custos das opções escolhidas, especialmente a complexidade operacional e a manutenção de projeções separadas, recebem pouca atenção.

Escalabilidade e confiabilidade

71

Todos os valores esperados de capacidade estão corretos, incluindo cerca de 15.733 leituras/s no pico e 27,648 TB de retenção bruta replicada. A meta proposta de 50.000 mensagens/s na ingestão oferece margem, e a fila durável é um absorvedor de rajadas apropriado. A explicação da absorção de rajadas permanece vaga, o que justifica uma dedução de um ponto: não há capacidade de fila/backlog, vazão sustentada dos consumidores nem cálculo de tempo de esvaziamento. As configurações de replicação e confirmação necessárias para aceitação durável no Kafka não são especificadas. A resposta também não distingue requisições de upload em lote das leituras, e um ACK abaixo de 50 ms não elimina todos os cenários de repetição.

Clareza

84

As seções numeradas, as equações explícitas e os rótulos escolhido/rejeitado tornam a resposta fácil de auditar. A terminologia e as unidades são, em geral, claras. Pontos fracos menores incluem a expressão redundante 'partições são particionadas', o uso ambíguo de mensagens versus leituras e a descrição de lacunas tanto como desconhecidas quanto como quebras imediatas de sequência, sem explicar como chegadas tardias posteriores revisam esse estado.

Gemini 3.8 Flash 8.76

O projeto é completo, tecnicamente sólido e atende plenamente ao que foi pedido. Os cálculos de capacidade e de pico estão totalmente corretos, com aritmética clara para a vazão em regime estável, o volume diário, a retenção replicada e a carga de pico em rajada. A deduplicação para faturamento e a máquina de estados de detecção de vazamentos (incluindo chegadas tardias e uma política explícita de tratamento de lacunas) estão bem arquitetadas. Os três trade-offs são adaptados diretamente ao domínio do problema. A única omissão menor em relação aos critérios de nível máximo é não distinguir explicitamente as taxas de requisições HTTP de upload (por exemplo, cerca de 600 requisições/segundo se os medidores enviarem suas 24 leituras em lote) da vazão de leituras individuais.

Nota por critério

Qualidade da arquitetura

88

A arquitetura separa bem as responsabilidades entre ingestão na borda, idempotência baseada em stream e armazenamento durável. Garantir faturamento exatamente uma vez por meio de uma restrição de chave primária em (meter_id, interval_start), apoiada por um filtro de deduplicação deslizante de 48 horas no RocksDB, é robusto e evita anti-padrões comuns, como depender apenas da semântica de entrega da fila.

Completude

87

Todas as cinco seções obrigatórias são tratadas em detalhe, dentro da faixa prescrita de 800 a 1.100 palavras. O único detalhe que impede uma pontuação perfeita é a ausência de uma divisão explícita entre as taxas de requisições de upload e as taxas de leituras individuais durante a rajada de reconexão.

Análise de trade-offs

88

São apresentados exatamente três trade-offs, cada um nomeando claramente a opção escolhida e a rejeitada, com justificativas concretas ligadas aos requisitos do sistema (ACK na fila versus ACK no banco de dados, estado de stream versus SQL em lote para a detecção de vazamentos e armazenamento separado de read-model para os painéis versus consultas ao RDBMS de faturamento).

Escalabilidade e confiabilidade

87

As estimativas de capacidade correspondem exatamente aos números esperados (1.333,33 rps em regime permanente, 23,04 GB/dia, 27.648 TB de armazenamento bruto replicado; pico de 14.400 em rajada + 1.333 em regime permanente = 15.733,33 rps). O dimensionamento e as estratégias de absorção de buffer, por meio de Kafka particionado e throttling de consumidores, são sólidos, embora não calcule explicitamente a taxa de requisições em lote (por exemplo, 600 req/s).

Clareza

88

A resposta está estruturada de forma lógica, com títulos claros, fórmulas matemáticas explícitas e descrições técnicas objetivas. A contagem de palavras (984 palavras) está confortavelmente dentro dos limites-alvo.

6 Gemini 3.5 Flash-Lite

Média (de 0 a 10) 7.41

Arquitetura de Ingestão de Medidores Inteligentes de Água

1. Estimativas de Capacidade e Cálculos

Para construir um back-end robusto para 1,2 milhão de medidores inteligentes, começamos com o dimensionamento determinístico de capacidade e armazenamento.

  • Leituras por segundo em regime estacionário: Cada medidor transmite uma leitura a cada 15 minutos (900 segundos). Para 1.200.000 medidores, a taxa média de ingestão é $1.200.000 / 900 = 1.333,33$ leituras por segundo.
  • Volume de dados brutos por dia: Com 1.333,33 leituras por segundo, o número total de leituras diárias é $1.333,33 \times 86.400...
Mostrar resposta completa ▼

Arquitetura de Ingestão de Medidores Inteligentes de Água

1. Estimativas de Capacidade e Cálculos

Para construir um back-end robusto para 1,2 milhão de medidores inteligentes, começamos com o dimensionamento determinístico de capacidade e armazenamento.

  • Leituras por segundo em regime estacionário: Cada medidor transmite uma leitura a cada 15 minutos (900 segundos). Para 1.200.000 medidores, a taxa média de ingestão é $1.200.000 / 900 = 1.333,33$ leituras por segundo.
  • Volume de dados brutos por dia: Com 1.333,33 leituras por segundo, o número total de leituras diárias é $1.333,33 \times 86.400 = 115.200.000$ leituras/dia. Com cada leitura dimensionada em 200 bytes na transmissão, o volume diário de dados brutos é $115.200.000 \times 200 \text{ bytes} = 23.040.000.000 \text{ bytes/dia}$ (ou 23,04 GB/dia).
  • Armazenamento bruto para todo o período de retenção, incluindo replicação: Os dados devem ser retidos por 400 dias com 3 réplicas. O cálculo total de armazenamento é $23,04 \text{ GB/dia} \times 400 \text{ dias} \times 3 \text{ réplicas} = 27.648 \text{ GB}$ (ou 27,64 TB).

2. Caminho de Ingestão e Dimensionamento de Rajadas de Reconexão

Quando ocorre uma tempestade grande, 30% dos medidores ($360.000$ medidores) perdem conectividade por 6 horas. Ao longo de 6 horas, cada medidor desconectado armazena em buffer $6 \times 4 = 24$ leituras. Quando a conectividade retorna, todos os 360.000 medidores enviam suas 24 leituras armazenadas em buffer, distribuídas uniformemente em uma janela de 10 minutos (600 segundos).

  • Taxa de envio do buffer: A taxa de leituras históricas durante a rajada é $(360.000 \text{ medidores} \times 24 \text{ leituras}) / 600 \text{ segundos} = 8.640.000 / 600 = 14.400$ leituras por segundo.
  • Taxa simultânea de leituras ao vivo: Simultaneamente, todos os 1.200.000 medidores continuam enviando suas leituras normais em tempo real a $1.333,33$ leituras por segundo.
  • Taxa de ingestão de pico: A taxa total de pico é $14.400 + 1.333,33 = 15.733,33$ leituras por segundo (aproximadamente 15,7k rps).

Para absorver esse aumento súbito sem descartar nenhuma leitura, a camada de ingestão usa um broker de mensagens distribuído e escalável horizontalmente (como o Apache Kafka), particionado em 64 partições. Uma frota de API Gateway, posicionada atrás de um balanceador de carga, encerra o TLS, realiza validação rápida de esquema e grava diretamente no broker de mensagens. Como as partições do Kafka desacoplam a ingestão do processamento a jusante, o aumento súbito fica armazenado com segurança em buffer em logs de commit com suporte em disco. Os workers consumidores escalam dinamicamente com base no atraso de consumo (consumer lag), absorvendo o aumento temporário sem perda de dados.

3. Idempotência e Cobrança Exatamente Uma Vez

Os medidores repetem envios se não receberem uma confirmação em 30 segundos, o que significa que duplicatas certamente chegarão. Para garantir que a cobrança conte cada (meter_id, interval_start) exatamente uma vez, aplicamos idempotência dentro do Processador de Stream de Cobrança.

Cada payload de leitura recebido contém uma chave natural composta: meter_id e interval_start. O processador de stream de cobrança consome leituras do broker de mensagens e usa uma operação de upsert atômica contra um armazenamento de dados colunar distribuído ou um armazenamento de estado de deduplicação (como o RocksDB integrado ao Apache Flink).

Quando uma leitura chega, o processador verifica se já existe um registro para (meter_id, interval_start) que tenha sido processado e cobrado. Se a chave existir, o payload duplicado é descartado com segurança ou marcado como duplicata, garantindo zero contagem dupla. Se a chave não existir, a tabela de cobrança é atualizada e uma confirmação é enviada de volta ao broker de ingestão.

4. Dados Atrasados e Alertas de Vazamento

A detecção de vazamentos exige identificar quando um medidor apresenta fluxo diferente de zero em cada um dos 96 intervalos consecutivos de 15 minutos (cobrindo um período completo de 24 horas), avaliado estritamente pelo interval_start e não pelo horário de chegada. Para garantir que os alertas de vazamento permaneçam corretos quando leituras armazenadas em buffer chegam atrasadas e fora de ordem, empregamos Processamento de Stream em Tempo de Evento com Watermarking.

  • Tratamento de dados atrasados: O processador de stream mantém janelas de estado indexadas por meter_id. Como os medidores podem armazenar dados em buffer por até 48 horas, as janelas de processamento de stream são configuradas com um limite de atraso permitido de 48 horas. Isso garante que, quando envios em lote atrasados ou reconectados chegarem, eles sejam retroativamente alocados em seus compartimentos cronológicos corretos de 15 minutos com base nos timestamps de interval_start.
  • Intervalos ausentes: Se um intervalo de 15 minutos estiver totalmente ausente do stream e sua janela de atraso de 48 horas se encerrar sem receber dados, esse intervalo é explicitamente tratado como fluxo zero (ou dado ausente que quebra uma sequência contígua). Uma leitura ausente interrompe a sequência de fluxo não zero, reiniciando o contador consecutivo de 96 intervalos desse medidor.
  • Disparo de alertas: Assim que um medidor acumula 96 intervalos contíguos não zero, o sistema dispara exatamente um alerta por sequência. Leituras não zero subsequentes na mesma execução contínua não geram alertas duplicados, graças a flags de deduplicação com estado armazenadas junto ao contador da sequência ativa.

5. Compromissos Arquiteturais

Para finalizar o design do nosso sistema, avaliamos três escolhas arquiteturais críticas:

  1. Protocolo de Ingestão: Opção Escolhida (HTTP/REST com JSON sobre TLS) vs. Opção Rejeitada (MQTT / Sockets TCP Customizados). Embora sockets TCP customizados ou MQTT tenham menor sobrecarga de payload, HTTP/REST com JSON é amplamente suportado por módulos de gateway celulares e IoT, simplifica a depuração, integra-se nativamente com firewalls de gerenciamento de APIs existentes e acomoda facilmente o requisito de tamanho de 200 bytes na transmissão, sem exigir pilhas de protocolo de firmware especializadas.
  2. Paradigma de Armazenamento: Opção Escolhida (Arquivos Parquet em Object Storage para Dados Frios + Log Distribuído para Dados Quentes) vs. Opção Rejeitada (Cluster SQL Relacional Distribuído Tradicional). Manter 400 dias de dados históricos de séries temporais mais 3 réplicas em um cluster de banco de dados relacional tradicional introduz custos de infraestrutura proibitivos e limites complexos de sharding horizontal. Ao gravar leituras brutas compactadas em arquivos Parquet colunares em object storage (por exemplo, AWS S3), consultados por mecanismos de consulta serverless, alcançamos retenção de longo prazo com custo-benefício, mantendo o caminho operacional ativo rápido.
  3. Consistência do Dashboard: Opção Escolhida (Consistência Eventual via Projeções de Read-Model) vs. Opção Rejeitada (Consultas Síncronas Read-Through ao Banco de Dados). Para garantir que as consultas do dashboard permaneçam responsivas durante rajadas massivas de reconexão (15,7k rps), escolhemos projeções assíncronas de read-model que atualizam os dashboards dos clientes em até 5 minutos sob cargas normais (e que relaxam para 60 minutos durante tempestades). Rejeitamos consultas síncronas read-through porque bloquear ou consultar o armazenamento transacional primário sob rajadas de ingestão de pico causaria timeouts em cascata, esgotamento do pool de conexões do banco de dados e possível falha da ingestão.
Claude Opus 5.5 6.74

Todos os números esperados estão corretos e apresentados: 1.333 leituras/s, 23,04 GB/dia, cerca de 27,65 TB replicados e um pico de 15.733 leituras/s que inclui a carga constante. Todas as seções exigidas estão presentes e a resposta está dentro do limite de palavras. Os pontos fracos são a profundidade e a precisão. O plano de absorção de picos não traz dimensionamento de backlog nem de retenção, não separa as requisições de upload das leituras e deixa de fora a degradação do painel durante o pico. O caminho de confirmação para o faturamento com exatamente uma entrega (exactly-once) está confuso, com o ack indo para o 'broker' em vez de ir para o medidor após uma gravação durável. Alguns trade-offs são bastante genéricos.

Nota por critério

Qualidade da arquitetura

63

O fluxo é claro: um API gateway, um cluster Kafka com 64 partições, um processador de cobrança Flink que deduplica por (meter_id, interval_start) em um state store RocksDB ou por upsert, e detecção de vazamento com base no event time e 48 horas de lateness permitido. O componente que faz a aplicação é nomeado. No entanto, a semântica de confirmação está confusa: o ack é 'enviado de volta ao broker de ingestão' em vez de ir ao medidor somente depois de uma escrita durável. A duração do estado de deduplicação não é especificada. A reavaliação da sequência de vazamento quando um intervalo é preenchido tardiamente é descrita apenas de forma vaga.

Completude

75

Todos os cinco requisitos são atendidos: a aritmética de capacidade, o pico da rajada, o componente de cobrança exatamente-uma-vez, o tratamento de vazamento com dados atrasados com uma regra explícita de lacuna (uma lacuna quebra a sequência quando a janela de lateness de 48 horas se fecha), e três trade-offs. A resposta está dentro da faixa de palavras. Vários itens são superficiais, principalmente os detalhes de absorção da rajada e a garantia de ack somente após escrita durável.

Análise de trade-offs

65

Há exatamente três trade-offs, cada um nomeando uma opção escolhida e uma rejeitada. O trade-off entre read-model de dashboard e consultas síncronas está ligado à rajada e ao SLA de 5/60 minutos. Os trade-offs HTTP versus MQTT e Parquet/armazenamento de objetos versus SQL relacional são bastante genéricos, e o raciocínio sobre HTTP com base no tamanho de 200 bytes é fraco.

Escalabilidade e confiabilidade

65

Todos os valores esperados estão corretos, e o pico inclui a carga constante. A absorção é afirmada apenas pelo buffer em disco do Kafka e pelo autoscaling dos consumidores. Não há dimensionamento de backlog nem de retenção, nenhuma verificação de throughput por partição, nenhuma distinção entre cerca de 600 requisições de upload/s e leituras/s, e nenhum plano explícito de degradação do dashboard dentro da seção de rajada. A garantia de não perda por meio de ack durável antes da confirmação ao medidor não está claramente declarada.

Clareza

75

A resposta está bem organizada, com títulos correspondentes aos requisitos e a aritmética apresentada passo a passo. A redação é em geral precisa. Há uma pequena confusão na formulação sobre intervalos ausentes ('fluxo zero (ou dados ausentes...)') e na descrição do ack.

GPT-6.1 Sol 7.00

A resposta acerta a aritmética de capacidade e de picos (bursts), respeita o limite de palavras e apresenta exatamente três trade-offs entre a opção escolhida e a rejeitada. No entanto, o plano de buffer para picos não é dimensionado quantitativamente, o design de faturamento não estabelece uma garantia de exactly-once resistente a falhas (crash-safe), e a lógica de alerta de vazamento não explica totalmente a reconciliação de sequências (streaks) com dados atrasados.

Nota por critério

Qualidade da arquitetura

60

O caminho de ingestão baseado em broker e a chave natural de faturamento são adequados. No entanto, consultar um armazenamento de deduplicação e atualizar o faturamento não são explicitamente uma única operação atômica e durável, de modo que falhas poderiam perder atualizações de faturamento ou contá-las em duplicidade. A confirmação (acknowledgement) descrita é para o broker, e não uma confirmação ao medidor após a ingestão durável. Há janelas (bins) por tempo do evento e uma regra de intervalo ausente, mas a reavaliação de sequências históricas e a identidade do alerta quando leituras atrasadas unem execuções antes separadas estão pouco especificadas.

Completude

80

A resposta de 941 palavras cobre as cinco áreas solicitadas, inclui a aritmética de capacidade, soma explicitamente o tráfego ao vivo ao pico (burst), nomeia o componente que aplica o faturamento, enuncia uma regra de intervalo ausente e apresenta exatamente três trade-offs. As metas de latência do painel também são reconhecidas. A cobertura é estruturalmente completa, embora várias garantias sejam afirmadas em vez de plenamente estabelecidas.

Análise de trade-offs

75

Exatamente três trade-offs identificam claramente as opções escolhida e rejeitada, com conexões úteis com o custo de retenção e o isolamento do painel durante o pico. A comparação de protocolos não comprova que JSON e HTTP caibam na premissa de tamanho em trânsito dada, e as comparações de armazenamento e de painel exageram as desvantagens inerentes do armazenamento relacional e das consultas síncronas. Os custos das opções escolhidas recebem pouca atenção.

Escalabilidade e confiabilidade

65

A taxa constante, o volume diário, o armazenamento de retenção replicado e o pico de aproximadamente 15.733 leituras/s estão corretamente calculados. No entanto, 64 partições e o escalonamento dinâmico de consumidores não estabelecem a vazão de ingestão provisionada nem capacidade suficiente de backlog. Não há dimensionamento quantitativo da fila, cálculo de tempo de drenagem, margem para retentativas nem política explícita de confirmação de escrita replicada. A vazão de leituras em buffer também não é distinguida da vazão de requisições de upload.

Clareza

80

A resposta é bem organizada, legível e concisa o bastante para a faixa exigida, com a aritmética claramente exibida e trade-offs rotulados. Algumas descrições técnicas permanecem ambíguas, notadamente as alternativas intercambiáveis de armazenamento de faturamento e as confirmações enviadas ao broker. Usar "rps" para leituras, em vez de distinguir requisições, também obscurece o dimensionamento da ingestão.

Gemini 3.8 Flash 8.49

O projeto aborda de forma completa os cinco requisitos do prompt, com cálculos matemáticos totalmente precisos tanto para o cenário de regime estável quanto para o de picos de carga (bursts). Ele oferece mecanismos arquitetônicos sólidos para a deduplicação de faturamento com semântica de exatamente uma vez (exactly-once) e para a detecção de vazamentos com base no tempo do evento (event-time) com eventos que chegam atrasados, além de uma política explícita de tratamento de lacunas. A resposta fica ligeiramente abaixo do limite de 9,0+ porque não distingue as requisições HTTP de upload da vazão de leituras individuais durante os bursts de reconexão, nem quantifica a capacidade total de backlog da fila.

Nota por critério

Qualidade da arquitetura

85

A arquitetura separa claramente as responsabilidades entre o gateway de ingestão, os logs de commit do Kafka, o processamento de fluxo em tempo de evento e os armazenamentos de cobrança. O processamento exatamente uma vez para cobrança usa corretamente a chave composta (meter_id, interval_start) em um upsert atômico/armazenamento de estado, em vez de depender apenas de garantias de nível de transporte. A arquitetura de alerta de vazamento trata corretamente dados fora de ordem por meio de janelamento em tempo de evento e estabelece uma regra clara de lacuna de atraso de 48 horas.

Completude

88

Todos os itens principais da lista de verificação são abordados: a aritmética está demonstrada e correta, a rajada é modelada com tráfego ativo concorrente, a responsabilidade pela deduplicação é explicitamente atribuída, o comportamento para intervalos ausentes está claramente declarado, e são apresentados exatamente três trade-offs com opções escolhidas e rejeitadas. A contagem de palavras (941 palavras) está bem dentro da faixa de 800 a 1.100 palavras.

Análise de trade-offs

82

A resposta apresenta exatamente três trade-offs, identificando claramente as alternativas escolhidas e rejeitadas, com justificativas técnicas. Embora as escolhas de protocolo e de projeção do painel estejam bem ligadas aos parâmetros operacionais, o trade-off de armazenamento tende a ser genérico (Parquet em armazenamento de objetos versus SQL relacional), em vez de examinar alternativas específicas para séries temporais (por exemplo, um TSDB dedicado versus armazenamentos LSM-tree).

Escalabilidade e confiabilidade

83

Todos os cálculos correspondem perfeitamente aos valores esperados, incluindo o volume bruto diário (23,04 GB/dia), o armazenamento de 400 dias com replicação 3x (27,65 TB) e o pico combinado da rajada (15.733 rps). No entanto, não distingue o volume de requisições de upload (por exemplo, cerca de 600 requisições/s se houver lotes) das leituras individuais por segundo, e discute o buffer de fila de forma qualitativa, sem calcular explicitamente o volume numérico de backlog nem a ocupação de disco.

Clareza

88

A resposta está organizada com cabeçalhos claros em markdown, explicações concisas e formulações matemáticas transparentes, o que facilita a leitura e a avaliação.

Sobre este gênero

Neste gênero, as capacidades mais observadas são Qualidade da arquitetura, Completude, Análise de trade-offs.

Diferente de coding, este gênero pesa mais arquitetura, escala, confiabilidade e trade-offs do que detalhes de implementação executável.

Uma nota alta aqui não significa que o modelo vai escrever o melhor código funcional nem a explicação mais simples.

Para que servem modelos fortes neste gênero

propostas de arquitetura, desenho de serviços e discussões sobre escalabilidade.

O que este gênero sozinho não consegue mostrar

qualidade de implementação em baixo nível, correção exata ou escrita para público não técnico.

O que é avaliado em Design de sistemas

Critérios e pesos usados neste ranking por gênero.

Qualidade da arquitetura

30.0%

Este critério foi incluído para verificar Qualidade da arquitetura na resposta. Ele recebe mais peso porque influência fortemente o resultado final deste gênero.

Completude

20.0%

Este critério foi incluído para verificar Completude na resposta. Ele tem peso relevante porque afeta a qualidade de forma visível, mesmo não sendo o único ponto importante.

Análise de trade-offs

20.0%

Este critério foi incluído para verificar Análise de trade-offs na resposta. Ele tem peso relevante porque afeta a qualidade de forma visível, mesmo não sendo o único ponto importante.

Escalabilidade e confiabilidade

20.0%

Este critério foi incluído para verificar Escalabilidade e confiabilidade na resposta. Ele tem peso relevante porque afeta a qualidade de forma visível, mesmo não sendo o único ponto importante.

Clareza

10.0%

Este critério foi incluído para verificar Clareza na resposta. Ele recebe peso menor porque apoia o objetivo principal, mas não define sozinho este gênero.

Links relacionados

X f L