Orivel Orivel
Abrir menú

Diseño de sistemas

Compara arquitectura, razonamiento de compromisos y calidad de diseño de sistemas.

Instantánea 2026-W42 Resultados a 2026-10-16

6 modelos respondieron las mismas 16 tareas. Los mismos jueces (Claude Opus 5.5 / GPT-6.1 Sol / Gemini 3.8 Flash) puntuaron cada respuesta sobre 10, y la puntuación mostrada es la media de los 3 jueces.

Este género tiene una sola tarea, así que el orden de abajo es el resultado de esta tarea, no una clasificación de los modelos en este género. La clasificación general usa las 16 tareas.

De un vistazo

Resultados de esta tarea

Ingestión de lecturas de contadores inteligentes de agua con ráfagas de reconexión

Puesto Modelo Media (sobre 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
Colores de la nota ≥ 9 8–9 7–8 6–7 5–6 < 5

Diferencia entre la media más alta y la más baja: 1.37 puntos.

La tarea

Ingestión de lecturas de contadores inteligentes de agua con ráfagas de reconexión

Instrucciones

Diseñe el back-end que ingiere las lecturas de los contadores inteligentes de una empresa regional de suministro de agua y alimenta la facturación, un panel de clientes y las alertas de fugas. Utilice los datos del contexto.

Su diseño debe:

  1. Ofrecer estimaciones de capacidad con la aritmética mostrada: lecturas por segundo en régimen estacionario, volumen de datos brutos por día y almacenamiento bruto para el periodo de retención completo, incluida la replicación.
  2. Dimensionar la vía de ingestión para la ráfaga de reconexión descrita en el contexto: calcule el pico de lecturas por segundo y explique cómo el diseño absorbe dicho pico sin perder ninguna lectura.
  3. Garantizar que la facturación cuente cada (meter_id, interval_start) exactamente una vez, aunque los contadores reintenten las subidas; indique qué componente lo impone y cómo.
  4. Producir alertas de fuga que sigan siendo correctas cuando las lecturas almacenadas en búfer llegan tarde y fuera de orden, y declare explícitamente cómo se trata un intervalo ausente.
  5. Analizar exactamente tres compromisos (trade-offs); para cada uno, nombre la opción elegida y la opción descartada.

Extensión: 800-1.100 palabras.

Material entregado con la tarea
  • 1,2 millones de contadores. Cada contador envía una lectura por cada intervalo de 15 minutos; una lectura ocupa 200 bytes en la red, incluidos los metadatos.
  • Las lecturas brutas de 15 minutos se conservan durante 400 días, almacenadas con 3 réplicas. (Use unidades decimales: 1 GB = 10^9 bytes.)
  • Los contadores almacenan en búfer hasta 48 horas de lecturas cuando están desconectados. Las lecturas con más de 48 horas de antigüedad se sobrescriben en el contador y nunca llegan.
  • Ráfaga de reconexión: tras una tormenta, el 30 % de los contadores pierde la conectividad durante 6 horas. Cuando vuelve la red, todos se reconectan en un plazo de 10 minutos (distribuidos uniformemente) y suben sus lecturas almacenadas en búfer, mientras cada contador también sigue enviando sus lecturas en directo normales.
  • Los contadores reintentan una subida si no reciben un acuse de recibo en 30 segundos, por lo que la misma lectura puede llegar más de una vez.
  • Panel: en funcionamiento normal, el 99 % de las lecturas debe ser visible para el cliente en un plazo de 5 minutos desde su llegada; durante una ráfaga de reconexión, este plazo puede relajarse a 60 minutos. Los datos de facturación pueden retrasarse, pero nunca perderse ni contarse dos veces.
  • Alerta de fuga: generar una alerta cuando un contador muestre un caudal distinto de cero en cada uno de 96 intervalos consecutivos de 15 minutos (24 horas), evaluado por interval_start y no por la hora de llegada. Enviar como máximo una alerta por contador y racha.
Cómo se indicó a los jueces que puntuaran
Lista de verificación de requisitos (completitud; un elemento respondido de forma vaga: -1 en su criterio correspondiente; (1)-(2) scalability_reliability, (3)-(4) architecture_quality, (5) tradeoff_reasoning). (1) aritmética de capacidad mostrada; (2) pico de la ráfaga calculado y absorbido sin pérdidas; (3) facturación exactamente una vez por (meter_id, interval_start) con el componente que lo impone nombrado; (4) alerta de fuga basada en tiempo de evento con una regla explícita de intervalo ausente; (5) exactamente tres compromisos, cada uno con opción elegida y descartada. Valores esperados (precalculados; aceptar redondeo dentro del 2 %): 1,2 M x 96 = 115,2 M lecturas/día = unas 1.333 lecturas/s; 115,2 M x 200 B = 23,04 GB/día; x 400 días = 9,216 TB brutos; x 3 réplicas = unos 27,65 TB. Ráfaga: 360.000 contadores x 24 lecturas almacenadas = 8,64 M lecturas en 600 s = 14.400 lecturas/s, más 1.333/s estacionarias = unas 15.733 lecturas/s (unas 11,8 veces el régimen estacionario). Omitir la carga estacionaria del pico: scalability_reliability -0,5 a -1; error de 10 veces o más, o confundir por hora con por segundo: scalability_reliability <= 5. Exactamente una vez: deduplicación o upsert por (meter_id, interval_start) en el almacén durable o en el agregador de facturación, con acuse de recibo solo tras una escritura durable. Un diseño que confíe solo en la entrega 'exactly-once' de la cola, o que deduplique por marca de llegada, recibe architecture_quality <= 6. Alerta de fuga: estado por contador indexado por interval_start que se reevalúa cuando una lectura tardía llena un hueco; una racha no debe romperse ni completarse por el orden de llegada. Cualquier regla de hueco explícita y coherente es aceptable (por ejemplo: desconocido hasta que tenga 48 horas, y entonces rompe la racha); sin regla de hueco, completitud <= 7. Más de 1.210 palabras: completitud -1. Puntuación 9+ solo si todos los valores esperados son correctos, el plan de ráfaga indica la capacidad de cola/backlog y la degradación del panel, y distingue las solicitudes de subida (por ejemplo, unas 600 solicitudes/s si cada contador reconectado envía un lote) de las lecturas, y los compromisos son específicos de este sistema (no 'SQL frente a NoSQL' genérico). Topes: listas genéricas de microservicios sin cifras -> architecture_quality <= 6; más o menos de tres compromisos -> tradeoff_reasoning <= 7.

Cada juez puntúa cada criterio de 0 a 10; la puntuación es la media ponderada de los criterios.

Respuestas, de mayor a menor media

Los jueces leen el original en inglés. Las traducciones son solo para leer.

1 GPT-6.1 Sol

Media (sobre 10) 8.78

1. Capacidad y retención

Suponga que las lecturas contienen una identidad de medidor autenticada, interval_start en UTC, medición de caudal y versión del payload. Los intervalos se alinean a límites de 15 minutos. La identidad lógica es (meter_id, interval_start), independiente de los intentos de carga.

Ingesta en estado estable:

  • Lecturas por medidor al día: 24 × 60 / 15 = 96.
  • Lecturas de la flota por día: 1.200.000 × 96 = 115.200.000.
  • Lecturas promedio por segundo: 1.200.000 / 900 = 1.333,33.
  • Volumen bruto diario: 115.200.000 × 200 = 23.040.000.000 bytes = 23,04 GB.
  • Almacenamiento...
Mostrar respuesta completa ▼

1. Capacidad y retención

Suponga que las lecturas contienen una identidad de medidor autenticada, interval_start en UTC, medición de caudal y versión del payload. Los intervalos se alinean a límites de 15 minutos. La identidad lógica es (meter_id, interval_start), independiente de los intentos de carga.

Ingesta en estado estable:

  • Lecturas por medidor al día: 24 × 60 / 15 = 96.
  • Lecturas de la flota por día: 1.200.000 × 96 = 115.200.000.
  • Lecturas promedio por segundo: 1.200.000 / 900 = 1.333,33.
  • Volumen bruto diario: 115.200.000 × 200 = 23.040.000.000 bytes = 23,04 GB.
  • Almacenamiento bruto durante 400 días: 23,04 × 400 = 9.216 GB.
  • Con tres réplicas: 9.216 × 3 = 27.648 GB = 27,648 TB.

Estas son estimaciones solo del payload, usando unidades decimales. Los índices, el encuadre de registros, las cargas duplicadas temporales, los registros operativos y la sobrecarga del sistema de archivos requieren capacidad adicional. Aplique el ciclo de vida de 400 días a las lecturas brutas canónicas, no a cada copia de reintento. Mantenga los libros de facturación por separado según la política de retención financiera de la empresa de suministro.

2. Dimensionamiento de la reconexión e ingesta

La tormenta desconecta 1.200.000 × 30% = 360.000 medidores. Cada uno almacena en búfer 6 × 4 = 24 lecturas, lo que da 360.000 × 24 = 8.640.000 lecturas acumuladas.

Con cargas distribuidas a lo largo de 600 segundos:

  • Tasa de acumulado: 8.640.000 / 600 = 14.400 lecturas/segundo.
  • Tasa concurrente en vivo: 1.333,33 lecturas/segundo.
  • Pico sostenido de lecturas únicas: 15.733,33 lecturas/segundo.
  • Rendimiento correspondiente en la red: 15.733,33 × 200 = 3,1467 MB/segundo.

Este es el pico sostenido de diez minutos especificado, no un límite para lotes instantáneos ni para el tráfico de reintentos. Distribuya las cargas del acumulado a lo largo de la ventana de reconexión y aplique equidad por medidor para que las lecturas en vivo no queden sin recursos.

Utilice pasarelas autenticadas sin estado, un registro duradero replicado particionado por medidor, grupos de consumidores independientes, almacenamiento canónico, una proyección para el panel y un procesador de fugas. Aprovisione pasarelas para al menos 60.000 intentos de carga/segundo y consumidores posteriores para 30.000 lecturas únicas/segundo. Estos valores proporcionan margen para reintentos; no asumen que los reintentos tengan un máximo matemáticamente acotado.

Confirme cada lectura solo después de la persistencia duradera con quórum, con réplicas en dominios de fallo distintos. Las confirmaciones parciales de lote identifican con precisión qué registros son duraderos. Los registros no confirmados siguen siendo elegibles para reintento. Las pasarelas confirman muy por debajo de 30 segundos bajo la carga indicada, evitando la amplificación de reintentos durante la operación normal.

El acumulado ocupa por sí mismo 8.640.000 × 200 = 1,728 GB, o 5,184 GB replicados. Reserve al menos 100 GB de capacidad replicada del registro, con margen adicional para el encuadre. Nunca desaloje registros confirmados no procesados: extienda la retención o desborde a almacenamiento duradero si los consumidores se retrasan.

Las colas absorben lotes e interrupciones de los consumidores. El autoescalado, la contrapresión y la admisión priorizada protegen la durabilidad. El acumulado de seis horas deja 42 horas antes de la sobrescritura del medidor; la capacidad de ingesta diseñada lo drena dentro de la ventana de carga de diez minutos. Ningún sistema puede recuperar lecturas ya sobrescritas, ni garantizar la entrega durante una interrupción que supere el límite de búfer del medidor.

3. Corrección de facturación y del panel

La base de datos de facturación aplica un conteo exactamente una vez, no el transporte. Su libro de intervalos tiene una restricción de unicidad sobre (meter_id, interval_start).

Para cada lectura consumida, una transacción de base de datos inserta el intervalo y actualiza el acumulador del periodo de facturación solo si la inserción tiene éxito. Un duplicado se convierte en una operación nula. El consumidor confirma su desplazamiento en el registro solo después de que la transacción se confirme; por tanto, los fallos provocan una repetición segura. Los payloads en conflicto para una misma identidad se ponen en cuarentena en lugar de reemplazar silenciosamente un valor ya facturado. Las correcciones aprobadas usan un libro de ajustes explícito.

La facturación se cierra solo después de la conciliación de completitud. Las lecturas faltantes siguen siendo excepciones que requieren la política de la empresa de suministro, nunca consumo inventado. Esto garantiza que cada intervalo válido recibido se cuente una sola vez a pesar de los reintentos.

El panel realiza de forma independiente un upsert sobre la misma clave. Mida la latencia de llegada a visibilidad y dimensione su ruta normal para el objetivo de percentil 99 de cinco minutos. Durante las tormentas, escale los consumidores y drene el acumulado en un plazo de 60 minutos. Muestre la hora de medición y la frescura de los datos para que las lecturas históricas tardías no aparezcan como actuales.

4. Detección de fugas en tiempo de evento

El procesamiento de fugas usa interval_start, nunca el orden de llegada. Almacene las lecturas deduplicadas en un mapa ordenado de intervalos por medidor. Una alerta candidata requiere 96 inicios de intervalo adyacentes, separados exactamente por 15 minutos, cada uno con caudal distinto de cero.

Las lecturas tardías pueden conectar fragmentos previamente separados, por lo que alertar inmediatamente por cada fragmento observado podría generar varias notificaciones para una única racha final. En su lugar, emita notificaciones solo desde un prefijo de tiempo de evento finalizado.

Añada un protocolo de completitud de carga por medidor: un medidor informa una frontera solo después de que cada intervalo anterior haya sido confirmado de forma duradera o declarado explícitamente como no disponible por haber expirado. El servidor avanza la frontera de procesamiento solo después de que esas lecturas confirmadas hayan llegado al almacenamiento canónico. Los reintentos pendientes y los lotes en vuelo impiden el avance prematuro. Persista estas fronteras y las declaraciones de huecos.

No asuma que "48 horas de antigüedad" por sí solo demuestra completitud: la transmisión y el procesamiento pueden añadir retrasos. Los medidores desconectados no pueden avanzar su frontera, por lo que sus alertas esperan a la conciliación. No se especificó ningún requisito de latencia para las alertas.

Un intervalo faltante es desconocido, no cero y no distinto de cero. Impide que cualquier ventana de 96 intervalos que lo cruce sea elegible. Mientras esté sin resolver, también impide la finalización. Una vez declarado explícitamente como no disponible, rompe la racha consecutiva verificada sin afirmar que el agua dejó de fluir.

Procese los intervalos finalizados en orden cronológico, manteniendo el recuento consecutivo de valores distintos de cero y un indicador de alerta emitida. Al llegar al recuento de 96, cree de forma transaccional una única entrada en la bandeja de salida de notificaciones, identificada por medidor e inicio de racha verificada. Los intervalos distintos de cero posteriores conservan el indicador. Un intervalo finalizado con cero o no disponible termina esa racha verificada. Los identificadores de notificación duraderos y un endpoint de entrega idempotente impiden que una repetición cree otra alerta lógica.

5. Exactamente tres compensaciones

  1. Elegido: confirmación con registro duradero primero. Descartado: confirmar antes de persistir. Las escrituras con quórum añaden latencia y coste de infraestructura, pero los reintentos siguen siendo seguros y las lecturas confirmadas sobreviven a fallos de las pasarelas.

  2. Elegido: libro de intervalos transaccional para facturación. Descartado: confiar en la entrega exactamente una vez a nivel de transporte. La unicidad de la base de datos y las actualizaciones atómicas del acumulador cuestan capacidad de escritura, pero protegen directamente el invariante financiero de conteo ante repeticiones y caídas.

  3. Elegido: alertas de fugas finalizadas en tiempo de evento. Descartado: alertas inmediatas en orden de llegada con correcciones posteriores. El seguimiento de completitud retrasa las notificaciones, especialmente tras una desconexión, pero evita que datos tardíos en búfer fusionen fragmentos notificados de forma independiente en una sola racha.

Claude Opus 5.5 8.06

Un diseño sólido y numéricamente preciso. Todos los valores esperados de capacidad y ráfaga son correctos, y el pico incluye la carga constante. La facturación con exactamente una vez se garantiza mediante un libro mayor transaccional con clave única, con los offsets confirmados solo después de la escritura. La detección de fugas se basa en el tiempo del evento, con una regla explícita para los intervalos faltantes. La respuesta contiene exactamente tres compromisos y respeta el límite de palabras. Puntos débiles: no se calculan las solicitudes de carga por segundo (se afirma un aprovisionamiento de 60 000 intentos/s sin derivarlo). El protocolo de frontera de fugas presupone cambios en el firmware de los medidores. Los compromisos replantean en parte los requisitos en lugar de sopesar opciones realmente contrapuestas.

Puntuación por criterio

Calidad de la arquitectura

80

Canalización clara: puertas de enlace, después un registro duradero particionado y, por último, consumidores independientes para facturación, panel y detección de fugas. La base de datos de facturación garantiza exactamente una vez mediante una restricción única (meter_id, interval_start), actualizaciones transaccionales del acumulador y confirmación de offsets después de la transacción. Las cargas útiles en conflicto se ponen en cuarentena. El procesador de fugas usa un mapa de intervalos por tiempo de evento, un indicador de alerta y un outbox idempotente. La frontera de completitud de cargas supone un cambio de protocolo en el medidor y podría bloquear las alertas indefinidamente para medidores que nunca se reconecten.

Integridad

85

Se abordan los cinco puntos de la lista de verificación: aritmética de capacidad, pico de ráfaga y absorción, facturación exactamente una vez con un componente nombrado, regla de fugas basada en tiempo de evento con una regla explícita para huecos, y exactamente tres compensaciones. La longitud (910 palabras) está dentro del rango. Carencia menor: la tasa de solicitudes de carga no se deriva.

Análisis de compromisos

75

Exactamente tres compensaciones, cada una con las opciones elegidas y descartadas y con los costes indicados. Se relacionan con este sistema, pero la n.º 1 (confirmar tras la persistencia) y la n.º 2 (unicidad en BD frente a exactamente una vez en el transporte) están cerca de propiedades de corrección requeridas más que de opciones realmente equilibradas. La n.º 3 es la más específica del sistema.

Escalabilidad y fiabilidad

83

Cifras correctas: 1.333/s, 23,04 GB/día, 9,216 TB, 27,648 TB, 8,64 M lecturas acumuladas, 14.400/s más la carga constante para 15.733/s. Se indican la capacidad del backlog y del registro (1,728 GB, reserva de 100 GB), junto con la no eliminación de registros no procesados y la relajación de 60 minutos del panel. La respuesta no calcula las solicitudes de carga por segundo (unos 600 lotes/s). El aprovisionamiento de 60.000 intentos/s no está explicado, lo que lo mantiene por debajo de 9.

Claridad

80

Bien organizado, con secciones numeradas que corresponden a los requisitos y con la aritmética mostrada en línea. Algunos pasajes son densos y llenos de matices, sobre todo el protocolo de frontera y las advertencias sobre el margen de reintentos, lo que reduce ligeramente la legibilidad.

GPT-6.1 Sol 8.78

El diseño cumple los requisitos básicos con una aritmética de capacidad correcta, una ingesta duradera, una deduplicación transaccional de la facturación y un tratamiento cuidadoso de las lecturas tardías para la detección de fugas. También ofrece exactamente tres compensaciones claras dentro del límite de palabras. Las principales debilidades son una distinción ambigua entre el rendimiento de las solicitudes de carga y el rendimiento de las lecturas, y la dependencia de un protocolo adicional de completitud de los medidores cuyas implicaciones de despliegue no se discuten.

Puntuación por criterio

Calidad de la arquitectura

88

La arquitectura separa claramente la ingesta duradera, el almacenamiento canónico, la facturación, las proyecciones del panel y el procesamiento de fugas. La unicidad de la facturación y las actualizaciones de los acumuladores son atómicas, y las confirmaciones siguen a la persistencia duradera. La finalización por tiempo de evento, el manejo explícito de huecos y una bandeja de salida de notificaciones idempotente abordan bien la corrección ante llegadas tardías. El protocolo añadido de frontera de medidores es sólido, pero requiere soporte en el medidor que el diseño no analiza desplegar.

Integridad

88

Las cinco áreas requeridas están cubiertas dentro del límite de 800 a 1.100 palabras. Los cálculos de capacidad, la absorción de picos, la aplicación de la facturación, el comportamiento ante intervalos faltantes, los objetivos del panel y exactamente tres compromisos elegidos frente a rechazados están explícitos. Sin embargo, la respuesta no calcula claramente la carga de solicitudes de carga por separado de la carga de lecturas; su capacidad de intentos de carga es ambigua cuando los lotes contienen varias lecturas.

Análisis de compromisos

88

Se presentan exactamente tres compromisos, cada uno con las opciones elegidas y rechazadas y con la explicación de sus consecuencias. Se relacionan directamente con la durabilidad, la corrección financiera y las lecturas tardías en búfer. El compromiso de finalización de fugas es especialmente sólido; los dos primeros son útiles, pero ofrecen un análisis de costes algo más limitado.

Escalabilidad y fiabilidad

87

Toda la aritmética esperada es correcta, incluidas las 15.733,33 lecturas por segundo en el pico activo y los 27,648 TB de retención replicada. La respuesta especifica el margen de los consumidores, un búfer de respaldo replicado de 100 GB, confirmación duradera, manejo de reintentos y degradación del panel a 60 minutos. El dimensionamiento de la tasa de solicitudes sigue sin estar claro, porque no se establecen el tamaño del lote ni las solicitudes de carga por segundo resultantes. La capacidad del panel también se expresa más como un plan de aprovisionamiento y monitorización que como un cálculo explícito de la tasa de vaciado.

Claridad

88

Las secciones numeradas, la aritmética visible y los invariantes explícitos de corrección hacen que la respuesta sea fácil de seguir. La regla de intervalos faltantes y la aplicación de exactamente una vez son especialmente claras. Las consultas de carga frente a lecturas individuales podrían distinguirse con más precisión, y el protocolo de frontera añade cierta complejidad sin explicar su despliegue en el medidor.

Gemini 3.8 Flash 9.50

La respuesta ofrece un diseño de sistema ejemplar que sigue rigurosamente todas las instrucciones y los detalles del contexto. Los cálculos de capacidad y de ráfagas son completamente exactos, con una aritmética transparente; el mecanismo de deduplicación de la facturación y el componente de base de datos que lo hace cumplir están claramente especificados; el algoritmo de detección de fugas trata a fondo los intervalos tardíos y ausentes mediante un prefijo finalizado en tiempo de evento; y los tres compromisos (trade-offs) son concretos y están directamente vinculados a la arquitectura.

Puntuación por criterio

Calidad de la arquitectura

95

La arquitectura es sólida y está bien articulada. Asigna correctamente la deduplicación a un libro transaccional de intervalos con una restricción única sobre (meter_id, interval_start), en lugar de depender de la entrega a nivel de transporte. La canalización de ingesta separa las pasarelas sin estado, los logs particionados duraderos y los consumidores asíncronos para facturación, proyecciones del panel y alertas de fugas.

Integridad

95

Los cinco componentes requeridos se abordan de forma exhaustiva dentro del recuento de palabras especificado (910 palabras). El cálculo de capacidad, el dimensionamiento de ráfagas, la idempotencia de facturación, la lógica de detección de fugas con manejo de intervalos faltantes y exactamente tres compromisos están detallados por completo.

Análisis de compromisos

95

Se analizan exactamente tres compromisos arquitectónicos, indicando claramente la alternativa elegida y la descartada en cada caso. Los compromisos abordan retos específicos del dominio (confirmación tras log duradero frente a confirmación previa a la persistencia, libro de BD frente a exactly-once a nivel de transporte, y alertas de fugas con tiempo de evento finalizado frente a alertas especulativas inmediatas) en lugar de comparaciones genéricas.

Escalabilidad y fiabilidad

95

Los cálculos de estado estable (1.333,33 lecturas/s, 23,04 GB/día, 27,65 TB replicados) y de la ráfaga pico por reconexión (15.733,33 lecturas/s combinando backlog y tráfico en vivo) son matemáticamente exactos. El diseño dimensiona correctamente la capacidad del log de backlog, tiene en cuenta los búferes de reintento, distingue las solicitudes/intentos de subida de las lecturas y aborda la degradación de la latencia del panel durante las ráfagas.

Claridad

95

La estructura es lógica, la terminología técnica es precisa y las explicaciones de la ventana de tiempo de evento y de la semántica transaccional de facturación son concisas e inequívocas.

2 GPT-6 Luna

Media (sobre 10) 8.47

Diseño y capacidad

Utilice un registro de ingesta duradero y replicado entre las pasarelas orientadas a medidores y los servicios posteriores. Las pasarelas autentican los medidores, validan la marca temporal del intervalo y la carga útil, y publican las lecturas con clave (meter_id, interval_start). Particione el registro por ID de medidor para que los registros de un mismo medidor se mantengan ordenados, distribuyendo a la vez los medidores entre las particiones. Confirme una carga solo después de que el registro se haya replicado de forma duradera en las réplicas requeridas. Si se pierde la confirmación,...

Mostrar respuesta completa ▼

Diseño y capacidad

Utilice un registro de ingesta duradero y replicado entre las pasarelas orientadas a medidores y los servicios posteriores. Las pasarelas autentican los medidores, validan la marca temporal del intervalo y la carga útil, y publican las lecturas con clave (meter_id, interval_start). Particione el registro por ID de medidor para que los registros de un mismo medidor se mantengan ordenados, distribuyendo a la vez los medidores entre las particiones. Confirme una carga solo después de que el registro se haya replicado de forma duradera en las réplicas requeridas. Si se pierde la confirmación, el medidor puede reintentar; el sistema acepta el duplicado en lugar de arriesgar la pérdida de datos.

La tasa en estado estable es:

  • 1.200.000 medidores ÷ 900 segundos por intervalo = 1.333,3 lecturas/segundo.
  • 1.200.000 × 96 intervalos/día = 115.200.000 lecturas/día.
  • 115.200.000 × 200 bytes = 23.040.000.000 bytes/día = 23,04 GB/día.
  • Durante 400 días: 23,04 GB × 400 = 9.216 GB = 9,216 TB de lecturas sin procesar. Con tres réplicas: 9,216 TB × 3 = 27,648 TB.

Estas cifras usan el tamaño de registro especificado en la red y unidades decimales; excluyen índices, sobrecarga del formato de almacenamiento y margen operativo. Almacene el historial completo de lecturas sin procesar en un archivo replicado y particionado por tiempo, y conserve el registro de ingesta el tiempo suficiente para cubrir la recuperación normal de los consumidores, en lugar de usarlo como archivo de 400 días.

Para la tormenta indicada, 30% × 1.200.000 = 360.000 medidores se ven afectados. Seis horas contienen 6 × 4 = 24 intervalos, por lo que los medidores que se reconectan suben 360.000 × 24 = 8.640.000 lecturas almacenadas en búfer. Distribuidas en 10 minutos, son 8.640.000 ÷ 600 = 14.400 lecturas/segundo. Sumando el tráfico en vivo de todos los medidores, 1.333,3 lecturas/segundo, se obtiene un pico nominal de aproximadamente 15.733 lecturas/segundo. La carga de llegada de 10 minutos es de unos 9,44 millones × 200 bytes = 1,888 GB, incluidas aproximadamente 800.000 lecturas en vivo.

Dimensione la capacidad de las pasarelas y de escritura en el registro para al menos 32.000 lecturas/segundo sostenidas, aproximadamente el doble del pico calculado, y reserve capacidad de cola para al menos toda la ventana de llegada de 9,44 millones de registros, con espacio adicional para reintentos y retraso de procesamiento. El registro replicado absorbe la ráfaga mientras los consumidores se ponen al día; después, consumidores escalables de forma independiente escriben el archivo, el almacén de facturación, la vista del panel y el estado de alertas. Esta capacidad absorbe la ráfaga descrita sin descartar lecturas aceptadas. El límite de sobrescritura de 48 horas del medidor es una limitación ascendente: las lecturas sobrescritas antes de la reconexión no pueden recuperarse en el backend.

Corrección y servicio

La facturación utiliza una tabla canónica de lecturas con una restricción de unicidad aplicada por la base de datos sobre (meter_id, interval_start). Su destino realiza una operación de inserción o conflicto: la primera copia inserta la lectura, y los reintentos o cargas repetidas con la misma clave no crean otro intervalo facturable. La facturación agrega únicamente esta tabla canónica. El destino confirma la lectura y su progreso en el consumidor del registro de forma transaccional, o usa escrituras seguras ante repetición, de modo que un fallo y una reproducción no puedan contar dos veces. Un duplicado con valores en conflicto debe marcarse para investigación en lugar de contarse silenciosamente como otro intervalo.

Un consumidor independiente mantiene una vista materializada orientada al cliente. Realiza upserts con la misma clave de intervalo y actualiza la última lectura mostrada según el tiempo del intervalo, no según el orden de llegada. Supervise la latencia de extremo a extremo desde la llegada hasta la vista y escale consumidores y particiones para cumplir el objetivo en operación normal de que el 99% sea visible en cinco minutos. Durante la ráfaga especificada, la vista puede retrasarse hasta 60 minutos; el registro duradero y el archivo permanecen intactos mientras se pone al día. Puede mostrarse a los clientes información de actualidad para que una vista retrasada no se confunda con una lectura actual.

La detección de fugas es un cálculo de tiempo de evento agrupado por medidor y ordenado por interval_start. Deduplique cada intervalo antes de evaluarlo, y conserve los resultados de los intervalos para que una lectura tardía pueda actualizar el estado y provocar el recálculo de la serie de intervalos afectada. No decida que un intervalo falta solo porque llegó antes un intervalo posterior. Avance una marca de completitud solo después de que se hayan procesado todos los registros del registro recibidos hasta el tiempo de ingesta correspondiente, y sitúela al menos 48 horas por detrás del tiempo de ingesta, con margen operativo adicional para el retraso de las colas. Esto tiene en cuenta el máximo período de almacenamiento en búfer del medidor.

Un intervalo faltante se trata como si no mostrara flujo distinto de cero: una vez que queda por detrás de esa marca de completitud y no existe ninguna lectura, rompe una serie consecutiva. Antes de ese momento está sin resolver, no es un cero. Cuando 96 intervalos consecutivos finalizados muestren todos flujo distinto de cero, emita una sola alerta para esa racha. Persista una identidad de alerta basada en el medidor y la racha, y use una bandeja de salida de notificaciones idempotente para que la reproducción no envíe otra alerta para la misma racha. Esperar la completitud puede retrasar una alerta hasta el horizonte de tardanza, pero evita que una lectura tardía y desordenada produzca un resultado incorrecto.

Exactamente tres compensaciones

  1. Elegido: registro replicado antes de los consumidores. Descartado: escrituras síncronas desde las pasarelas a todos los destinos. El registro añade infraestructura y algo de latencia, pero amortigua las ráfagas de reconexión y aísla la ingesta de servicios lentos de facturación o del panel.
  2. Elegido: vistas materializadas del panel actualizadas de forma asíncrona. Descartado: distribución síncrona hacia el panel durante la ingesta. Las actualizaciones eventuales cumplen los objetivos indicados de cinco minutos en operación normal y 60 minutos durante la ráfaga, mientras mantienen rápidas las consultas de los clientes; la distribución síncrona acoplaría la aceptación de los medidores a la disponibilidad del panel y a la carga de la ráfaga.
  3. Elegido: alertas de fugas basadas en marcas de agua y conscientes de datos tardíos. Descartado: alertas inmediatas basadas en el orden de llegada. Esperar la ventana de tardanza acotada cuesta velocidad de alerta, pero permite rachas correctas basadas en intervalos y un tratamiento explícito de los datos faltantes.
Claude Opus 5.5 8.09

Un diseño sólido y bien organizado. Todas las cifras de capacidad coinciden con los valores esperados: 1.333/s, 23,04 GB/día, 9,216 TB en bruto y 27,648 TB replicados. El pico de ráfaga de 15.733/s incluye correctamente la carga constante, y el diseño indica un aprovisionamiento 2x y capacidad de cola para la ventana de 9,44 M de registros. La facturación de exactamente una vez se garantiza mediante una restricción de unicidad de la base de datos y un sink de inserción o conflicto, con confirmación solo después de una escritura duradera. Las alertas de fuga usan estado en tiempo de evento con una regla explícita y coherente para los intervalos ausentes. Debilidades: nunca se distingue entre las solicitudes de carga y las lecturas, por lo que no se alcanza el umbral de 9 o más. Las alertas de fuga siempre se retrasan por la marca de agua de 48 horas, incluso cuando una racha ya está completamente presente. Las ventajas y desventajas son válidas, pero se inclinan hacia patrones comunes.

Puntuación por criterio

Calidad de la arquitectura

80

El pipeline es coherente: pasarelas, un registro replicado particionado por medidor, y consumidores independientes para el archivo, la facturación, el panel y las alertas. La facturación exactamente-una-vez se aplica en la tabla canónica mediante una restricción de unicidad sobre (meter_id, interval_start), con confirmaciones de desplazamiento transaccionales y confirmación tras la replicación duradera. El estado de fuga es de tiempo de evento, se recalcula ante rellenos tardíos, y tiene un buzón de alertas idempotente. La debilidad menor es que las alertas siempre esperan la marca de agua de 48 horas, incluso cuando los 96 intervalos ya han llegado, lo que retrasa innecesariamente alertas legítimas.

Integridad

85

Los cinco requisitos se abordan de forma concreta. Se muestra el cálculo de capacidad, la ráfaga se calcula y se absorbe, se nombra el componente que aplica la exactitud única, la regla de intervalos faltantes es explícita y se dan exactamente tres compensaciones. Con 818 palabras, la respuesta está dentro del rango de 800 a 1.100. La respuesta se mantiene por debajo de 9 porque el plan de ráfagas no distingue las solicitudes de carga de las lecturas.

Análisis de compromisos

75

Hay exactamente tres compensaciones, cada una nombra la opción elegida y la descartada y se relaciona con los objetivos de ráfaga y latencia. Las dos primeras (registro frente a escrituras síncronas, panel asíncrono frente a síncrono) son patrones bastante estándar y no muy específicos del sistema. La compensación de las alertas de fuga está bien fundamentada en este sistema.

Escalabilidad y fiabilidad

83

Todos los valores esperados son correctos y el pico incluye el tráfico constante, con unos 1,888 GB de carga útil en la ventana de ráfaga. El diseño aprovisiona 32.000/s, reserva capacidad de cola para la ventana completa de 9,44 millones de registros, describe un retraso del panel de hasta 60 minutos con indicadores de frescura, y confirma solo después de la replicación. Omite la tasa de solicitudes de carga (unas 600 solicitudes/s), por lo que no alcanza 9+.

Claridad

83

Las secciones están claramente organizadas y la aritmética se presenta paso a paso. Las compensaciones están claramente etiquetadas como elegidas y descartadas. Algunas frases de la sección de alertas de fuga sobre la mecánica de la marca de agua son densas, pero siguen siendo precisas.

GPT-6.1 Sol 8.61

El diseño cumple los requisitos principales: aritmética de capacidad correcta, almacenamiento en búfer duradero para ráfagas, deduplicación de facturación aplicada por la base de datos y detección explícita de fugas basada en el tiempo del evento. También ofrece exactamente tres compromisos (trade-offs) específicos del sistema y respeta el límite de palabras. Las principales limitaciones son la ausencia de dimensionamiento de las solicitudes de carga y el escaso detalle cuantitativo sobre la capacidad de recuperación de los sistemas posteriores, el margen para reintentos y la holgura de almacenamiento de la cola.

Puntuación por criterio

Calidad de la arquitectura

87

El registro de ingesta replicado, los acuses de recibo duraderos, la tabla de facturación canónica con una clave única por intervalo, las escrituras seguras ante reproducción y la bandeja de salida de notificaciones idempotente forman una arquitectura coherente. La detección de fugas vuelve a evaluar explícitamente las lecturas tardías y distingue los huecos no resueltos de los intervalos faltantes finalizados. La recuperación de consumidores y la identidad de las alertas están descritas de forma adecuada, aunque los detalles operativos siguen siendo algo generales.

Integridad

88

Se abordan los cinco elementos requeridos, incluida la aritmética de replicación, el pico de ráfaga en vivo más almacenado en búfer, el componente de facturación que aplica la regla, una regla explícita de intervalos faltantes y exactamente tres compensaciones elegidas frente a rechazadas. La respuesta de 818 palabras cumple el rango solicitado. No distingue entre solicitudes de carga y lecturas individuales, lo que impide una puntuación superior a 9 según la política.

Análisis de compromisos

83

Exactamente tres compensaciones nombran tanto las opciones elegidas como las rechazadas y relacionan las decisiones con el aislamiento de ráfagas, la latencia del panel y la corrección de datos tardíos. La compensación sobre la latencia de la alerta de fuga es especialmente clara. Las dos primeras compensaciones se solapan considerablemente en su argumento a favor del desacoplamiento asíncrono, lo que limita la amplitud del razonamiento.

Escalabilidad y fiabilidad

85

Todos los valores de capacidad esperados son correctos, incluidos aproximadamente 15.733 lecturas por segundo durante la reconexión y 27,648 TB de retención replicada de datos brutos. La respuesta especifica una capacidad de ingesta de 32.000 lecturas por segundo, una reserva de cola para toda la ventana de ráfaga, acuses de recibo duraderos y degradación del panel a 60 minutos. No dimensiona por separado las solicitudes de carga ni cuantifica las tasas de vaciado de los consumidores posteriores ni el margen de reintentos y almacenamiento, por lo que algunas suposiciones operativas de capacidad quedan sin verificar.

Claridad

88

La respuesta es concisa, está bien organizada y hace que la aritmética y los mecanismos de corrección sean fáciles de seguir. La regla de intervalos faltantes y el número exacto de compensaciones son especialmente explícitos. La explicación de la marca de agua es relativamente densa, y las cargas por lotes frente a los registros individuales podrían distinguirse con más claridad.

Gemini 3.8 Flash 8.72

El diseño cumple todos los requisitos del enunciado con exactitud matemática, una separación arquitectónica limpia y una lógica sólida de procesamiento por tiempo de evento. Los cálculos para el estado estable (1.333,3 lecturas/s, 23,04 GB/día, 27,65 TB replicados) y para el pico de ráfaga (15.733 lecturas/s) son precisos. La deduplicación para la facturación se basa en restricciones a nivel de base de datos con clave (meter_id, interval_start), y la marca de agua de la detección de fugas gestiona explícitamente los intervalos que faltan tras la ventana de búfer de 48 horas. La única omisión que impide una puntuación máxima en el dimensionamiento de la ráfaga es que no se distingue entre las solicitudes de carga HTTP/de red por lotes y las lecturas individuales.

Puntuación por criterio

Calidad de la arquitectura

88

El pipeline de extremo a extremo está bien pensado: un log de ingesta particionado desacopla la puerta de enlace de los sumideros de almacenamiento, la deduplicación de facturación se aplica estrictamente mediante una restricción canónica de unicidad en la base de datos sobre (meter_id, interval_start), y los paneles de clientes quedan detrás de los búferes del log de forma segura. El motor de alertas usa correctamente una marca de agua de completitud de 48 horas para evaluar rachas en tiempo de evento en lugar del orden de llegada.

Integridad

86

Las cinco tareas requeridas se abordan dentro del límite de 800 a 1.100 palabras. Se muestra cada paso aritmético, la lógica de brechas en la detección de fugas está completamente definida y se presentan exactamente tres compensaciones (trade-offs) con opciones elegidas y descartadas. Sin embargo, no analiza el volumen a nivel de solicitudes (por ejemplo, distinguir las solicitudes de carga por lotes de las lecturas individuales) durante las ráfagas de reconexión.

Análisis de compromisos

88

Se presentan exactamente tres compensaciones, cada una identifica claramente las alternativas elegida y descartada. El razonamiento es específico del dominio de medidores de agua y de las restricciones de ingesta (por ejemplo, log con búfer frente a fan-out síncrono, vista de panel materializada frente a actualizaciones en línea, alertas retrasadas por marca de agua frente a evaluación inmediata por orden de llegada).

Escalabilidad y fiabilidad

85

Todos los cálculos de estado estable y de pico de ráfaga coinciden exactamente con los valores esperados, incluido el tráfico base sumado a la ráfaga de tormenta. El búfer de backlog de la cola y el margen de rendimiento sostenido están dimensionados adecuadamente. Según la política de evaluación de 9+, se queda ligeramente corto al dimensionar el rendimiento únicamente en lecturas/segundo, sin distinguir el número de conexiones/solicitudes de carga si los medidores agrupan sus 24 lecturas.

Claridad

90

La prosa es directa, muy organizada y evita relleno innecesario, manteniendo la precisión técnica en todas las secciones.

3 Claude Opus 5.5

Media (sobre 10) 8.39

1. Estimaciones de capacidad

Tasa en régimen estable

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

Volumen bruto por día

  • Lecturas por día: 1.200.000 × 96 intervalos = 115,2 M
  • Bytes por día: 115,2 M × 200 B = 23,04 × 10^9 B = 23,04 GB/día

Almacenamiento bruto para la retención

  • Una copia: 23,04 GB × 400 días = 9.216 GB = 9,216 TB
  • Con 3 réplicas: 9,216 TB × 3 = 27,65 TB

Los índices y la sobrecarga de compactación se suman a esta cifra. La compresión columnar probablemente la reducirá mucho.

2. Ráfaga de reconexión

Tasa máxima...

Mostrar respuesta completa ▼

1. Estimaciones de capacidad

Tasa en régimen estable

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

Volumen bruto por día

  • Lecturas por día: 1.200.000 × 96 intervalos = 115,2 M
  • Bytes por día: 115,2 M × 200 B = 23,04 × 10^9 B = 23,04 GB/día

Almacenamiento bruto para la retención

  • Una copia: 23,04 GB × 400 días = 9.216 GB = 9,216 TB
  • Con 3 réplicas: 9,216 TB × 3 = 27,65 TB

Los índices y la sobrecarga de compactación se suman a esta cifra. La compresión columnar probablemente la reducirá mucho.

2. Ráfaga de reconexión

Tasa máxima

  • Medidores fuera de línea: 30% × 1,2 M = 360.000
  • Lecturas almacenadas en búfer por medidor: 6 h × 4 intervalos/h = 24
  • Backlog total: 360.000 × 24 = 8,64 M lecturas
  • Todos los medidores se reconectan en 600 s, distribuidos uniformemente: 8,64 M ÷ 600 = 14.400 lecturas/s
  • Se suma el tráfico en vivo: 14.400 + 1.333 = 15.733 lecturas/s. Eso equivale a unas 11,8 veces el régimen estable, o aproximadamente 3,15 MB/s.
  • Si las confirmaciones se ralentizan, los reintentos podrían duplicar esta cifra, por lo que dimensiono para unas 32.000 lecturas/s.

Cómo absorbe el diseño la ráfaga

  1. Pasarelas sin estado (MQTT/HTTPS detrás de un balanceador de carga) verifican las credenciales de los medidores y el esquema de la carga útil. Se dimensionan para 32 k/s más capacidad de reserva N+1.
  2. Registro duradero (Kafka, factor de replicación 3, acks=all, particionado por meter_id). La pasarela envía al medidor su confirmación solo después de que la escritura en el registro esté confirmada. Por tanto, toda lectura confirmada es duradera, y una lectura no confirmada la reintenta el medidor. En ambos casos no se pierde nada. Unos pocos MB/s son trivialles para Kafka, así que las escrituras siguen siendo rápidas y las confirmaciones llegan muy por debajo del tiempo de espera de 30 s, lo que mantiene los reintentos poco frecuentes.
  3. Dos temas. La pasarela envía las lecturas con interval_start en los últimos 30 minutos a live, y todo lo anterior a backfill. Los consumidores vacían primero live, de modo que el objetivo de 5 minutos del panel se cumple para los datos en vivo incluso durante una tormenta.
  4. Los consumidores posteriores absorben el backlog. No necesitan seguir el ritmo del pico. A 5.000 lecturas/s, el backlog de 8,64 M se vacía en unos 29 minutos, dentro del límite relajado de 60 minutos del panel. La retención de Kafka es de 7 días, así que incluso una caída del consumidor no pierde datos.
  5. Variabilidad en el lado del medidor. El firmware añade un retardo aleatorio al reconectar y al reintentar, lo que suaviza aún más la ráfaga.

3. Facturación exactamente una vez

La base de datos del libro de facturación garantiza el conteo exactamente una vez. Utiliza la clave primaria (meter_id, interval_start).

  • El consumidor de facturación escribe con INSERT … ON CONFLICT (meter_id, interval_start) DO NOTHING.
  • Las subidas reintentadas, las repeticiones de la pasarela y el reprocesamiento del consumidor tras una caída simplemente chocan con el conflicto y no cambian nada.
  • Los offsets de Kafka se confirman solo después de que la escritura en la base de datos tenga éxito. Esto produce entrega al menos una vez en un destino idempotente, lo que en la práctica equivale a exactamente una vez.
  • Si llega un duplicado con un valor distinto, se conserva el primer valor almacenado y el conflicto pasa a una cola de conciliación. Nunca se suma.
  • Los totales de facturación se calculan únicamente a partir de esta tabla deduplicada.
  • El almacén del panel (una base de datos de series temporales) usa la misma clave como upsert, de modo que sus gráficos también están libres de duplicados.

4. Alertas de fuga en tiempo de evento

Un procesador de flujos con estado (por ejemplo Flink), agrupado por meter_id, lee ambos temas y trabaja en tiempo de evento (interval_start), no en tiempo de llegada.

Estado por medidor

  • Un mapa de bits sobre los últimos 296 intervalos (48 h más 24 h de historial más margen). Cada ranura es distinta de cero, cero o desconocida.
  • Las rachas actuales, cada una identificada por su primer intervalo.
  • Un indicador para cada racha que registra si ya ha generado una alerta.

Reglas

  • Una lectura tardía rellena su ranura, esté donde esté. El orden de llegada no importa, y un duplicado no tiene efecto.
  • Una alerta se dispara solo cuando 96 ranuras consecutivas están todas presentes y son todas distintas de cero. Como cada ranura debe estar rellena con datos confirmados, una llegada posterior nunca puede invalidar una alerta ya generada.
  • Intervalo ausente. Mientras una ranura tenga menos de 48 h de antigüedad (más 1 h de gracia), es desconocida. No extiende ni rompe una racha, y la alerta simplemente espera. Una vez que haya pasado interval_start + 49 h, la lectura ya no puede llegar, así que la ranura se finaliza como ausente, lo que rompe la racha. Nunca se genera una alerta sobre datos no verificados.
  • Una alerta por racha. El registro de alerta se identifica por (meter_id, streak_start) en una tabla de alertas con restricción de unicidad, de modo que un evento reprocesado no puede enviar una segunda alerta. Una racha termina con una lectura cero o con un hueco finalizado. Si una lectura tardía rellena un hueco y une dos rachas, la racha fusionada conserva el streak_start más antiguo y hereda el indicador de "ya alertada", por lo que sigue recibiendo solo una alerta.
  • El estado se guarda en un punto de control en almacenamiento duradero. Tras un reinicio, el procesador se reproduce desde los offsets confirmados y reconstruye el mismo estado.

5. Compensaciones

  1. Cuándo confirmar una lectura

    • Elegido: confirmar tras la escritura replicada en el registro. Esto garantiza que ninguna lectura se pierda y cuesta unos pocos milisegundos por confirmación.
    • Descartado: confirmar al recibir, desde memoria. Es más rápido, pero una caída de la pasarela eliminaría en silencio lecturas que el medidor ya borró de su búfer.
  2. Cómo eliminar duplicados

    • Elegido: escrituras idempotentes con una clave única en el libro de facturación. Es sencillo, fácil de comprobar y sobrevive a cualquier repetición desde cualquier origen.
    • Descartado: transacciones exactamente una vez de extremo a extremo en Kafka. No detectan duplicados creados antes de Kafka, como un medidor que reintenta tras perder una confirmación. Además añaden coste de coordinación y son difíciles de operar.
  3. Cómo tratar un intervalo ausente en la detección de fugas

    • Elegido: un hueco finalizado rompe la racha. Así no hay falsas alertas basadas en datos supuestos, y cada alerta puede respaldarse ante el cliente. El coste es que una fuga real con un corte de conectividad de 48 horas puede detectarse con retraso.
    • Descartado: tratar los huecos como continuación de la racha, o rellenarlos a partir de lecturas vecinas. Esto detecta más fugas, pero genera alertas basadas en lecturas que nunca existieron y vuelve poco clara la regla de "una alerta por racha".

Resumen

  • Capacidad: 1.333 lecturas/s en régimen estable, 23,04 GB/día, 27,65 TB almacenados con 3 réplicas.
  • Ráfaga: pico de 15.733 lecturas/s, absorbido por un registro duradero que confirma solo tras una escritura verificada, y por prioridad para los datos en vivo.
  • Facturación: el conteo exactamente una vez se garantiza mediante la clave única del libro de facturación.
  • Alertas de fuga: calculadas en tiempo de evento, nunca generadas sobre datos no verificados, y limitadas a una por racha.
Claude Opus 5.5 8.44

Este es un diseño sólido y bien organizado. Todos los valores esperados son correctos: 1.333 lecturas/s, 23,04 GB/día, 9,216 TB en bruto y 27,65 TB replicados, además de una ráfaga de 15.733 lecturas/s (aproximadamente 11,8 veces el nivel estable). La facturación logra exactly-once mediante un libro de registro idempotente con clave (meter_id, interval_start), con confirmación solo después de una escritura duradera en el log. La detección de fugas se ejecuta en tiempo de evento y tiene una regla explícita y coherente para los intervalos que faltan. Hay exactamente tres compromisos (trade-offs) específicos del sistema. La principal deficiencia es que el plan para ráfagas nunca distingue las solicitudes de carga o los lotes de las lecturas individuales, lo que descarta puntuaciones de 9 o más. Además, la capacidad del gateway se expresa solo en lecturas/s, no en conexiones o solicitudes.

Puntuación por criterio

Calidad de la arquitectura

85

El libro mayor de facturación figura como componente que hace cumplir la regla, usando INSERT ON CONFLICT sobre (meter_id, interval_start). Los desplazamientos se confirman solo después de la escritura en la base de datos, y los duplicados conflictivos pasan a reconciliación. El procesador de fugas mantiene un estado por contador en tiempo de evento, con ranuras de tres estados, fusiona las rachas ante llegadas tardías y usa una clave única (meter_id, streak_start) para las alertas. La división de temas en tiempo real/recarga es concreta y está respaldada por cifras. No alcanza 9 o más porque no se cumple la condición de 9 o más que exige que el plan de ráfagas separe las solicitudes de carga de las lecturas.

Integridad

85

Se abordan los cinco puntos de la lista de verificación: aritmética de capacidad, pico de ráfaga y absorción, facturación exactamente-una-vez con su componente de cumplimiento, una regla de fugas en tiempo de evento con una regla explícita para intervalos ausentes, y exactamente tres compensaciones. Con 1.033 palabras está dentro del rango requerido. No alcanza 9 o más porque nunca distingue las solicitudes de carga de las lecturas (por ejemplo, unas 600 solicitudes/s).

Análisis de compromisos

85

Hay exactamente tres compensaciones, y cada una indica la opción elegida y la descartada, con consecuencias específicas de este sistema. Cubren confirmar tras la escritura en el registro frente a confirmar desde memoria, el sink idempotente frente a las transacciones de Kafka (señalando correctamente que los reintentos previos a Kafka escapan a las transacciones), y los huecos que rompen las rachas frente al relleno de huecos. Son específicas y no genéricas, pero no se cumple la condición de 9 o más en conjunto.

Escalabilidad y fiabilidad

82

La aritmética de capacidad y de ráfagas es correcta e incluye la carga estable. Reservar margen de aprovisionamiento para reintentos es una adición acertada. La tasa de vaciado del backlog (5.000/s lo limpia en unos 29 minutos, dentro del límite de 60 minutos), la retención de Kafka de 7 días y la degradación del panel están indicadas. El razonamiento de no pérdida es sólido porque la confirmación sigue a la escritura replicada. Sin embargo, no se distinguen las solicitudes ni los lotes de las lecturas, y el dimensionamiento de la pasarela omite el recuento de conexiones y solicitudes.

Claridad

85

Las secciones numeradas corresponden directamente a los requisitos, la aritmética se presenta paso a paso y las reglas son precisas. El resumen es conciso. Hay pequeños aspectos mejorables, como la redacción imprecisa sobre la compresión y la elección del mapa de bits de 296 ranuras, que queda algo sin explicar.

GPT-6.1 Sol 7.76

La respuesta ofrece una aritmética de capacidad correcta, una vía de ingesta duradera creíble y una facturación idempotente bien especificada dentro del límite de palabras. Su principal debilidad es la corrección de las alertas de fuga: fusionar tramos que ya generaron alerta puede vulnerar la regla de una alerta por racha, y la caducidad del búfer del medidor no establece que una lectura ya no pueda llegar desde la canalización de ingesta. El dimensionamiento de las ráfagas es en su mayor parte sólido, pero no se cuantifican la capacidad de la cola ni las tasas de solicitudes de carga, y la aritmética del vaciado del retraso omite el procesamiento en vivo concurrente.

Puntuación por criterio

Calidad de la arquitectura

65

El límite de confirmación del registro replicado y la clave primaria del libro de facturación respaldan correctamente la ingesta duradera y los efectos de facturación exactamente una vez. Las ranuras de tiempo de evento y una regla explícita para intervalos faltantes son cimientos adecuados. Sin embargo, dos ejecuciones pueden activar cada una una alerta antes de que una lectura tardía que rellena el hueco las fusione en una sola racha; heredar una marca de alertada no puede deshacer las dos notificaciones ya enviadas. Además, declarar imposible una lectura tras 49 horas confunde la sobrescritura en el lado del medidor con el retraso de entrega en el lado descendente: una lectura ya subida a Kafka aún puede llegar al procesador más tarde. Estos son defectos significativos en la semántica requerida de fugas.

Integridad

85

Se abordan explícitamente las cinco áreas solicitadas, incluidos el cálculo de replicación, el cálculo de ráfagas, el componente de cumplimiento de facturación nombrado, una regla de intervalos faltantes y exactamente tres compensaciones elegidas frente a rechazadas. Las 1.033 palabras medidas cumplen el requisito de longitud. La respuesta no cumple las condiciones adicionales de puntuación máxima porque omite el dimensionamiento de las solicitudes de carga y el dimensionamiento explícito de la capacidad de la cola y del backlog.

Análisis de compromisos

86

Se presentan exactamente tres compensaciones, cada una con opciones elegidas y rechazadas claras. El límite de confirmación y el manejo de duplicados generados por el medidor son especialmente relevantes para este sistema. La compensación sobre datos faltantes también es concreta, aunque su análisis minimiza que las lecturas sobrescritas puedan nunca estar disponibles, en lugar de solo retrasar su detección.

Escalabilidad y fiabilidad

76

La tasa constante, el volumen diario, el almacenamiento de retención replicado y el pico de ráfaga de 15.733 lecturas/s son correctos. El aprovisionamiento para reintentos, confirmaciones duraderas y priorización de tiempo real frente a recarga histórica son útiles. Sin embargo, siete días de retención no equivalen a una estimación explícita de capacidad de cola aprovisionada, y el rendimiento de solicitudes no se distingue del rendimiento de lecturas. Si 5.000 lecturas/s es la capacidad descendente total, el tráfico concurrente en tiempo real deja unas 3.667 lecturas/s para la recarga histórica, de modo que el tiempo de vaciado conservador es de unos 39 minutos y no 29; aun así, encaja en el objetivo relajado del panel.

Claridad

87

La estructura numerada sigue de cerca la tarea, la aritmética es fácil de auditar y las reglas de facturación y alertas se expresan de forma concreta. La respuesta se mantiene dentro del rango de palabras solicitado. Algunas afirmaciones categóricas, como que 'nada se pierde' y que una lectura 'nunca puede llegar' tras 49 horas, ocultan supuestos que deberían haberse indicado, y el alcance de la capacidad de consumo de 5.000 lecturas/s es ambiguo.

Gemini 3.8 Flash 8.98

El diseño aborda a fondo todos los requisitos funcionales y no funcionales, con cálculos que coinciden exactamente con las cifras esperadas. El pipeline de ingesta, los mecanismos de deduplicación para la facturación y la detección de fugas basada en el tiempo del evento, con una regla explícita de intervalos faltantes, están bien diseñados. Sin embargo, el dimensionamiento de las ráfagas analiza el rendimiento únicamente en términos de lecturas por segundo y omite la distinción entre las solicitudes de red de carga (procesamiento por lotes) y las lecturas individuales, lo que mantiene las puntuaciones de escalabilidad por debajo del umbral de 9.0 según la política.

Puntuación por criterio

Calidad de la arquitectura

88

La arquitectura es robusta, aprovechando pasarelas sin estado, un log de Kafka replicado dividido en temas en vivo y de relleno (backfill), y un sumidero de facturación idempotente. El diseño de detección de fugas opera correctamente en tiempo de evento, con un manejo de estado explícito para llegadas tardías y fuera de orden.

Integridad

92

Se cumplen todos los requisitos del prompt: cálculos aritméticos completos para los estados estable y de ráfaga, componente y lógica de facturación exactamente una vez, una regla explícita de huecos para las alertas de fuga, exactamente tres compensaciones específicas del sistema, y cumplimiento de los límites de palabras.

Análisis de compromisos

92

Se presentan exactamente tres compensaciones muy relevantes y específicas del dominio (momento de la confirmación, ubicación de la deduplicación e interpretación de huecos en la detección de fugas). Cada una contrasta claramente un enfoque elegido con una alternativa descartada.

Escalabilidad y fiabilidad

87

Los cálculos de capacidad y de pico son matemáticamente precisos (incluida la suma del tráfico de estado estable durante las ráfagas). El drenaje del backlog y la degradación del SLA del panel se abordan bien, pero el análisis no distingue las solicitudes de carga HTTP/MQTT (p. ej., 600 lotes/s) de las lecturas individuales, lo que limita este criterio por debajo de 9.0.

Claridad

92

La respuesta está bien estructurada, es concisa y fácil de seguir, con encabezados de sección claros y derivaciones claras.

4 Claude Sonnet 5.5

Media (sobre 10) 8.20

1. Estimaciones de capacidad

Estado estable

  • Intervalos por día: 24 h × 4 = 96.
  • Lecturas por segundo: 1,200,000 / 900 s = ≈1,333 lecturas/s. Esto equivale a unos 267 KB/s en la red.
  • Lecturas por día: 1,200,000 × 96 = 115.2 M.
  • Volumen bruto por día: 115.2 M × 200 B = 23.04 GB, es decir, ≈23 GB/día.
  • Retención: 23.04 GB × 400 días = 9,216 GB ≈ 9.2 TB de una copia.
  • Con 3 réplicas: 9.216 TB × 3 = ≈27.6 TB (27,648 GB).
  • Esto excluye índices y compresión. Añadiría alrededor de un 30% de margen, lo que da una cifra aprovisionada de unos 36 TB.

2. Ráfaga por reconexión

  • Medidores afec...
Mostrar respuesta completa ▼

1. Estimaciones de capacidad

Estado estable

  • Intervalos por día: 24 h × 4 = 96.
  • Lecturas por segundo: 1,200,000 / 900 s = ≈1,333 lecturas/s. Esto equivale a unos 267 KB/s en la red.
  • Lecturas por día: 1,200,000 × 96 = 115.2 M.
  • Volumen bruto por día: 115.2 M × 200 B = 23.04 GB, es decir, ≈23 GB/día.
  • Retención: 23.04 GB × 400 días = 9,216 GB ≈ 9.2 TB de una copia.
  • Con 3 réplicas: 9.216 TB × 3 = ≈27.6 TB (27,648 GB).
  • Esto excluye índices y compresión. Añadiría alrededor de un 30% de margen, lo que da una cifra aprovisionada de unos 36 TB.

2. Ráfaga por reconexión

  • Medidores afectados: 30% × 1.2 M = 360,000.
  • Intervalos almacenados en búfer por medidor: 6 h × 4 = 24.
  • Backlog: 360,000 × 24 = 8.64 M lecturas, que son 1.73 GB.
  • Ventana de subida: 10 min = 600 s, distribuidos uniformemente, así que la tasa del backlog es 8.64 M / 600 = 14,400/s.
  • El tráfico en vivo continúa a 1,333/s.
  • Pico = 14,400 + 1,333 ≈ 15,733 lecturas/s, unas 11.8× el estado estable, o unos 3.1 MB/s.

Los reintentos se suman a esto. Si los acuses de recibo se retrasan más de 30 s, los medidores reenvían. Por ello dimensiono la ruta de ingesta para 2× el pico, unos 32,000/s. En la práctica, eso significa 8 nodos de ingesta sin estado a unos 5,000/s cada uno, con N+2 de reserva.

Cómo no se pierde nada

  1. La pasarela de ingesta valida una lectura y la añade a un registro duradero particionado, como Kafka. Usa acks=all, factor de replicación 3 y min.insync.replicas=2. Envía al medidor su acuse de recibo solo después de que la escritura tenga éxito.
  2. El registro tiene 48 particiones indexadas por meter_id y conserva 7 días de datos. La ráfaga es de unos 3 MB/s, así que es trivial para el registro. Los consumidores pueden retrasarse minutos u horas sin pérdida.
  3. Si la pasarela o el registro están sobrecargados, devuelven 503 o no envían acuse. El medidor conserva la lectura y reintenta. Su búfer de 48 horas cubre una interrupción de 6 horas más la recuperación, lo que deja unas 42 horas de margen. Por tanto, la contrapresión nunca descarta datos.
  4. Los consumidores posteriores (escritor de facturación, proyector del panel y procesador de fugas) tienen grupos de consumidores separados. Confirman los offsets solo después de que sus escrituras tengan éxito, de modo que un fallo provoca repetición, no pérdida.
  5. Los consumidores están dimensionados para unos 30,000/s. El backlog de 8.64 M se vacía entonces en unos 5 minutos, muy dentro del presupuesto relajado de 60 minutos del panel. En funcionamiento normal, el retraso se mantiene en segundos, lo que cumple el objetivo de 5 minutos para el 99% de las lecturas.

3. Facturación exactamente una vez

La entrega es al menos una vez en todas partes: reintentos de medidores, reintentos de la pasarela y repeticiones del registro. El efecto exactamente una vez lo garantiza un componente: el almacén de lecturas, un almacén SQL replicado (3 réplicas, particionado por meter_id). Tiene una clave primaria (meter_id, interval_start).

  • El escritor de facturación ejecuta INSERT … ON CONFLICT DO NOTHING. Un duplicado no tiene efecto, ya provenga de un reintento del medidor, de una repetición o de un reinicio del consumidor.
  • Los totales de facturación se calculan consultando esta tabla. Nunca se guardan como contadores de flujo que podrían incrementarse dos veces.
  • interval_start lo establece el medidor y está alineado a la cuadrícula de 15 minutos. La pasarela rechaza los valores desalineados y los pone en cuarentena.
  • Si llega una clave duplicada con una carga distinta, gana la primera escritura. El conflicto se registra en una tabla de discrepancias para revisión, de modo que la facturación nunca se altera en silencio.
  • Los consumidores posteriores actúan solo sobre las filas que la inserción indica como recién creadas. Por tanto, el panel y el procesador de fugas también están deduplicados.

Este almacén es también el almacén bruto. Sus 27.6 TB son la cifra replicada calculada arriba.

4. Alertas de fugas con datos tardíos y desordenados

La regla se evalúa según interval_start, así que el procesador usa tiempo de evento y no mantiene ventanas por tiempo de llegada. Es un trabajo de flujo con estado indexado por meter_id que consume solo las lecturas recién insertadas.

Estado por medidor (unos 70 bytes):

  • Un anillo de 2 bits por intervalo, que cubre los últimos 288 intervalos (72 horas). Los tres valores son desconocido, cero y no cero.
  • alerted_range = [start, end] para la última racha alertada.

En cada lectura en el intervalo t:

  1. Establecer la ranura de t.
  2. Si no es cero, recorrer hacia la izquierda y hacia la derecha desde t para encontrar la serie contigua máxima de intervalos no cero que contiene t.
  3. Si la longitud de la serie es ≥ 96 y no se solapa con alerted_range, emitir una alerta. Después, establecer alerted_range como la serie.
  4. Si la serie se solapa con alerted_range, ampliar alerted_range y no emitir nada.

Como el estado depende solo del conjunto de lecturas y no de su orden, un lote que llega en orden inverso da el mismo resultado que una llegada en orden. Una lectura tardía que rellena un hueco puede unir dos series más cortas en una de 96, y entonces se dispara la alerta. Una lectura cero termina la racha. La siguiente serie que cumpla la condición es una racha nueva y puede volver a alertar.

Las alertas se escriben en una tabla de salida (outbox) en la misma transacción que alerted_range, y una clave única (meter_id, streak_start) lo respalda. Por tanto, las repeticiones y los reinicios no pueden enviar una segunda alerta.

Intervalos ausentes. Un intervalo ausente es desconocido. No es cero ni no cero, y nunca se interpola. Rompe la contigüidad, así que no se lanza ninguna alerta a través de un hueco. La racha se reevalúa automáticamente si la lectura que falta llega más tarde, lo que puede ocurrir hasta 48 horas después del intervalo. Pasadas 48 horas, se pierde de forma permanente y la racha queda rota. Esto favorece que no haya falsas alarmas, a costa de una posible alerta retrasada o perdida tras una interrupción larga. Si resulta que las alertas perdidas son peores que las falsas, se puede añadir un aviso separado de "hueco de datos".

El estado de más de 72 horas se desaloja. Las lecturas más antiguas que el límite de 48 horas no pueden llegar legítimamente, así que se registran y se ignoran.

5. Compromisos

1. Cuándo confirmar al medidor.

  • Elegido: confirmar después de la escritura duradera en el registro.
  • Descartado: confirmar después de la escritura en el almacén SQL.
  • Motivo: la escritura en el registro es un añadido rápido que no se ve afectado por la carga de la base de datos. Así, una ráfaga no puede alargar la latencia de confirmación más allá de 30 s ni desencadenar tormentas de reintentos.
  • Coste: los datos no son consultables todavía en el momento de la confirmación. Es aceptable porque la facturación tolera el retraso y el panel permite 60 minutos durante una ráfaga.

2. Dónde deduplicar.

  • Elegido: una restricción de clave primaria en la base de datos con inserción idempotente.
  • Descartado: deduplicación a nivel de flujo, es decir, transacciones de Kafka o una caché de "vistos" en memoria o basada en filtro de Bloom.
  • Motivo: las transacciones de Kafka cubren solo el salto del registro, no los reintentos del medidor que crean mensajes nuevos. Una caché es limitada y puede perderse al reiniciar, y un filtro de Bloom tiene falsos positivos, lo que descartaría una lectura facturable.
  • Coste: cada duplicado cuesta una inserción conflictiva barata. Con 2× el pico, esto está muy dentro de la capacidad del almacén.

3. Cómo evaluar las fugas.

  • Elegido: un mapa de bits por medidor dirigido por eventos, evaluado en cada nueva lectura.
  • Descartado: un escaneo periódico por lotes o ventanas cerradas por marcas de agua.
  • Motivo: el mapa de bits es independiente del orden y tolera un retraso de 48 horas sin ningún retardo de marca de agua, así que las alertas se disparan en cuanto llega el último intervalo que faltaba. Las ventanas necesitarían una marca de agua de 48 horas y retrasarían cada alerta, o emitirían resultados incorrectos que requerirían corrección posterior.
  • Coste: unos 85 MB de estado indexado (1.2 M × unos 70 B) y una recuperación cuidadosa del estado desde los puntos de control.
Claude Opus 5.5 8.36

Un diseño sólido y numéricamente preciso. Todos los valores esperados de capacidad y ráfagas son correctos, con la aritmética mostrada. La facturación de exactamente una vez se garantiza mediante una inserción idempotente con clave primaria en el almacén de lecturas, con confirmación únicamente después de una anexión duradera al registro. La lógica de detección de fugas por tiempo de evento es independiente del orden y tiene una regla explícita para intervalos faltantes. Los tres compromisos son específicos del sistema y cada uno nombra las opciones elegidas y las descartadas. Puntos débiles: nunca se distingue entre las solicitudes de carga y las lecturas (no hay ninguna cifra de tasa de solicitudes), lo que impide alcanzar un 9 o más en todos los criterios. Además, con 1.161 palabras, la respuesta supera el límite de 1.100 palabras.

Puntuación por criterio

Calidad de la arquitectura

85

Los componentes son concretos y están numerados: Kafka con acks=all, RF3, min.insync=2, 48 particiones y retención de 7 días; un almacén SQL particionado con clave (meter_id, interval_start) y ON CONFLICT DO NOTHING; y un procesador de fuga con estado que usa un anillo de 2 bits y un outbox con una clave única de racha. El aplicador de exactamente una vez está claramente nombrado. El manejo de cargas útiles en conflicto y la distribución de tipo 'solo recién insertados' son acertados. No se cumplen todas las condiciones para 9 o más, por lo que la puntuación se mantiene por debajo de 9.

Integridad

85

Los cinco puntos de la lista de verificación se abordan por completo. Están presentes la aritmética de capacidad, el pico de ráfaga, la facturación exactamente una vez con su componente aplicador, la regla de fuga por tiempo de evento con una regla explícita para huecos, y exactamente tres compromisos. La extensión supera las 1.100 palabras pero está por debajo de 1.210, por lo que no se aplica la penalización de completitud de la política. La falta de distinción entre solicitudes y lecturas impide obtener 9 o más.

Análisis de compromisos

85

Hay exactamente tres compromisos, cada uno específico de este sistema: confirmar tras el log frente a confirmar tras la BD, deduplicación por clave de BD frente a deduplicación por stream o Bloom, y mapa de bits basado en eventos frente a ventanas de marca de agua. Cada uno nombra las opciones elegidas y descartadas y declara su coste. El razonamiento es sólido, incluida la observación de que las transacciones de Kafka no cubren los reintentos de los medidores. Limitado por debajo de 9 por la condición global de 9 o más.

Escalabilidad y fiabilidad

83

Las cifras son correctas: 1.333/s, 23,04 GB/día, 9,216 TB y 27,6 TB; la ráfaga es de 8,64 millones de lecturas, 14.400 + 1.333 = 15.733/s, aproximadamente 11,8 veces el estado estable. La respuesta añade un margen de reintentos de 2x, dimensionamiento de nodos, un backlog de 1,73 GB frente a la retención de log de 7 días, un tiempo de vaciado de unos 5 minutos, objetivos de retraso de los paneles y contrapresión mediante reintentos sin confirmación dentro del búfer de 48 horas. Nunca calcula por separado las tasas de solicitudes de carga frente a las lecturas (por ejemplo, unos 600 lotes/s), por lo que no califica para 9 o más.

Claridad

75

Bien organizada, con secciones numeradas, viñetas y cifras clave en negrita, y fácil de seguir. La extensión es de 1.161 palabras frente a un límite de 800-1.100; esta infracción no está nombrada en la política, por lo que se descuenta aquí (-1).

GPT-6.1 Sol 7.19

La respuesta ofrece una aritmética de capacidad y de ráfagas correcta, una ruta de ingesta duradera y concreta, una deduplicación de facturación aplicada por la base de datos y exactamente tres compromisos (trade-offs) específicos del sistema. Sin embargo, el algoritmo de detección de fugas puede emitir varias alertas para una racha a la que luego se une una lectura retrasada, y el traspaso de las inserciones exitosas a los procesadores posteriores no es resistente a fallos tal como se describe. Además, la respuesta supera el límite de palabras solicitado y omite el dimensionamiento de las solicitudes de carga.

Puntuación por criterio

Calidad de la arquitectura

55

El registro duradero y la restricción de clave primaria proporcionan una base sólida para efectos de facturación exactamente una vez. La corrección de la detección de fugas no está garantizada: dos ejecuciones que cumplen la condición, separadas por un intervalo desconocido, pueden emitir cada una una alerta y luego convertirse en una sola racha cuando llegue ese intervalo con un valor distinto de cero. Además, conservar solo el último rango alertado pierde el historial de deduplicación cuando llegan desordenadas ejecuciones disjuntas. Asimismo, consumir solo las filas recién insertadas requiere un outbox transaccional o un traspaso CDC; de lo contrario, una caída después de la inserción pero antes de la publicación posterior provoca que la repetición genere un no-op duplicado y potencialmente omita el procesamiento del panel o de fugas. El outbox de alertas aborda la persistencia del estado local, pero no corrige estos problemas.

Integridad

80

Los cinco temas solicitados se abordan explícitamente, incluidos la retención con replicación, el tráfico en vivo en el pico de ráfaga, el componente de cumplimiento de facturación, una regla para intervalos faltantes y exactamente tres compensaciones elegido frente a rechazado. Las 1.161 palabras medidas superan el máximo de 1.100 palabras, lo que cuesta un punto. Las solicitudes de carga no se distinguen de las lecturas, y no se indica el aprovisionamiento numérico de almacenamiento para colas o acumulación, lo que impide obtener una puntuación perfecta.

Análisis de compromisos

80

Se presentan exactamente tres compensaciones, cada una con opciones elegidas y rechazadas explícitas y costes relevantes. La ubicación de los acuses de recibo y la deduplicación duradera están especialmente bien vinculadas a las tormentas de reintentos y a la seguridad de la facturación. La compensación de fugas exagera la necesidad de retrasar cada alerta basada en marcas de agua 48 horas, y su afirmación de corrección inmediata e independiente del orden queda socavada por el problema de fusión de rachas.

Escalabilidad y fiabilidad

75

Toda la aritmética esperada es correcta: aproximadamente 1.333 lecturas/s, 23,04 GB/día, 27,648 TB de retención replicada y 15.733 lecturas/s durante la reconexión. La respuesta especifica el rendimiento de ingesta y de consumidores, el margen para reintentos, el registro replicado, la retención de siete días y la degradación y recuperación del panel. Sin embargo, la capacidad de la cola no se cuantifica en bytes ni en registros, se omite el rendimiento de las solicitudes de carga, y una reserva fija de 2x para reintentos no establece por sí misma protección frente a la amplificación sostenida de reintentos. La afirmación de que la contrapresión nunca pierde datos es demasiado absoluta dado el búfer finito de 48 horas del medidor.

Claridad

84

Las secciones numeradas, la aritmética visible y las etiquetas explícitas de elegido/rechazado hacen que el diseño sea fácil de revisar. La terminología distingue en general bien la entrega al menos una vez de los efectos exactamente una vez. Algunas afirmaciones son más fuertes que los mecanismos que las respaldan, en particular que los resultados de fugas son independientes del orden y que la contrapresión nunca descarta datos; además, la relación entre grupos de consumidores de registro separados y el consumo solo de filas recién insertadas no está clara.

Gemini 3.8 Flash 9.04

La respuesta está excepcionalmente bien estructurada, es precisa y aborda con rigor todos los requisitos del enunciado. Las estimaciones de capacidad y los cálculos de la ráfaga de reconexión coinciden con las cifras exactas esperadas. El mecanismo de deduplicación y la máquina de estados de detección de fugas están cuidadosamente diseñados en torno a la semántica del tiempo del evento, y las tres contrapartidas son concretas y están adaptadas al escenario. La escalabilidad queda ligeramente por debajo de la banda superior únicamente porque no se distinguieron las solicitudes HTTP/de red de carga de las lecturas individuales durante la ráfaga.

Puntuación por criterio

Calidad de la arquitectura

92

La arquitectura separa limpiamente las responsabilidades: el log de ingesta proporciona resiliencia ante contrapresión (back-pressure), el almacén relacional aplica deduplicación idempotente sobre (meter_id, interval_start), y una máquina de estados en memoria con tiempo de evento evalúa las rachas de fuga sin depender del orden de llegada.

Integridad

88

Las cinco secciones requeridas están respondidas en profundidad, incluyendo la aritmética, la absorción de ráfagas, la semántica de exactly-once, la evaluación de fugas con reglas explícitas para intervalos faltantes y tres compensaciones específicas del sistema. La respuesta supera ligeramente el objetivo de 1.100 palabras (1.161 palabras), pero se mantiene holgadamente por debajo del umbral de penalización de 1.210 palabras.

Análisis de compromisos

93

La respuesta ofrece exactamente tres compensaciones, nombrando opciones concretas elegidas y descartadas para cada una (momento del acuse de recibo, ubicación de la deduplicación y estrategia de evaluación de fugas), con justificaciones realistas y costes de compensación claros en lugar de comparaciones genéricas.

Escalabilidad y fiabilidad

87

Los cálculos de capacidad y de ráfaga son completamente exactos (1.333 lecturas/s en régimen estable, 15.733 lecturas/s en el pico de ráfaga). El almacenamiento en cola duradero y la degradación del panel durante las ráfagas están bien abordados. Sin embargo, no cumple la condición para 9+, ya que no distingue entre solicitudes de carga (por ejemplo, medidores que suben 24 lecturas en un único lote a ~600 solicitudes/s) y lecturas brutas por segundo.

Claridad

92

La redacción es concisa, está claramente organizada en secciones y es fácil de seguir. Las fórmulas, los detalles del estado del sistema y los pasos algorítmicos para evaluar las rachas se explican con una claridad excepcional.

5 Gemini 3.8 Flash

Media (sobre 10) 7.90

Arquitectura Regional de Ingesta de Contadores de Agua Inteligentes

1. Estimaciones de Capacidad y Aritmética

Lecturas por Segundo en Estado Estable
  • Flota de contadores: $1,200,000$ contadores.
  • Intervalo: Cada 15 minutos ($15 \times 60 = 900$ segundos).
  • Cálculos:
    $$\text{Rendimiento en Estado Estable} = \frac{1,200,000\text{ lecturas}}{900\text{ segundos}} = 1,333.33\text{ lecturas/segundo}$$
Volumen de Datos Brutos por Día
  • Lecturas por contador por día: $\frac{24\text{ horas} \times 60\text{ minutos}}{15\text{ minutos}} = 96\text{ lecturas/día}$.
  • **Total de lecturas di...
Mostrar respuesta completa ▼

Arquitectura Regional de Ingesta de Contadores de Agua Inteligentes

1. Estimaciones de Capacidad y Aritmética

Lecturas por Segundo en Estado Estable
  • Flota de contadores: $1,200,000$ contadores.
  • Intervalo: Cada 15 minutos ($15 \times 60 = 900$ segundos).
  • Cálculos:
    $$\text{Rendimiento en Estado Estable} = \frac{1,200,000\text{ lecturas}}{900\text{ segundos}} = 1,333.33\text{ lecturas/segundo}$$
Volumen de Datos Brutos por Día
  • Lecturas por contador por día: $\frac{24\text{ horas} \times 60\text{ minutos}}{15\text{ minutos}} = 96\text{ lecturas/día}$.
  • Total de lecturas diarias: $1,200,000 \times 96 = 115,200,000\text{ lecturas/día}$.
  • Tamaño de la carga útil: $200\text{ bytes/lectura}$ en la red.
  • Cálculos (usando unidades decimales donde $1\text{ GB} = 10^9\text{ bytes}$):
    $$\text{Volumen de Ingesta Diario} = 115,200,000 \times 200\text{ bytes} = 23,040,000,000\text{ bytes} = 23.04\text{ GB/día}$$
Almacenamiento Bruto para Retención de 400 Días (con 3 Réplicas)
  • Almacenamiento de 400 días con una sola copia:
    $$400\text{ días} \times 23.04\text{ GB/día} = 9,216\text{ GB} = 9.216\text{ TB}$$
  • Almacenamiento con replicación triple:
    $$9,216\text{ GB} \times 3 = 27,648\text{ GB} = 27.648\text{ TB}$$

2. Dimensionamiento y Absorción de Ráfagas por Reconexión

Cálculos del Pico de Ráfaga
  • Contadores afectados: $30% \text{ de } 1,200,000 = 360,000\text{ contadores}$.
  • Duración de la interrupción: 6 horas = $6 \times 4 = 24\text{ intervalos}$ acumulados por contador.
  • Total de lecturas almacenadas en búfer: $360,000 \times 24 = 8,640,000\text{ lecturas}$.
  • Ventana de reconexión: 10 minutos = $600\text{ segundos}$ (distribuidos uniformemente).
  • Tasa de llegada de la ráfaga desde el backlog:
    $$\text{Tasa de Ráfaga} = \frac{8,640,000\text{ lecturas}}{600\text{ segundos}} = 14,400\text{ lecturas/segundo}$$
  • Tráfico concurrente de estado estable en vivo: $1,333.33\text{ lecturas/segundo}$.
  • Rendimiento máximo combinado:
    $$\text{Tasa Pico} = 14,400 + 1,333.33 = 15,733.33\text{ lecturas/segundo} \approx 15,734\text{ lecturas/segundo}$$
  • Ancho de banda de ingreso máximo:
    $$15,734\text{ lecturas/s} \times 200\text{ bytes} = 3,146,800\text{ bytes/s} \approx 3.15\text{ MB/s (25.2 Mbps)}$$
Estrategia de Absorción
  1. Terminación en el Borde y ACK Rápido: Una flota de API Gateways sin estado y escalados horizontalmente da entrada al endpoint de ingesta. Dado que los contadores reintentan tras 30 segundos sin ACK, el gateway verifica la estructura del lote y añade inmediatamente la carga útil a un registro de confirmación distribuido (Apache Kafka) antes de confirmar HTTP 202/200 en menos de 50 milisegundos. Esto elimina los timeouts de cliente no confirmados y los reintentos en cascada.
  2. Desacoplamiento mediante Cola: Kafka actúa como un amortiguador de choques duradero. Las particiones se distribuyen estrictamente por hash de meter_id (usando 64 particiones para manejar cómodamente hasta $50,000\text{ msgs/seg}$). Aunque el procesamiento de los consumidores aguas abajo se ralentiza durante la ráfaga, la ruta de ingreso persiste el flujo de datos de 3.15 MB/s directamente en disco sin aplicar contrapresión a los gateways del borde.
  3. Limitación de Consumo para el Dashboard del Cliente: Los workers de proyección del dashboard del cliente limitan el consumo de ingesta, cumpliendo fácilmente el SLO de ráfaga relajado de 60 minutos y permitiendo que los procesadores de facturación y de flujos de alertas críticas dispongan de capacidad de consumo dedicada.

3. Ingesta de Facturación con Exactly-Once

Los reintentos de red producen inevitablemente mensajes duplicados con el mismo (meter_id, interval_start). El diseño garantiza el conteo exactly-once en la Capa de Carga de Almacenamiento de Facturación (Pipeline de Ingesta de Facturación) mediante una combinación de upserts idempotentes y restricciones de clave primaria relacional.

Mecanismo
  • Clave Natural: La clave primaria del libro mayor de staging de facturación es (meter_id, interval_start).
  • Frontera de Deduplicación: Un cargador de lotes transaccional consume eventos de Kafka y los escribe en una base de datos de libro mayor de facturación inmutable de solo anexado, usando semántica de upsert determinista (INSERT ... ON CONFLICT (meter_id, interval_start) DO NOTHING).
  • Idempotencia en Dos Fases:
    1. Antes del staging, un procesador de flujo con estado (por ejemplo, Apache Flink) utiliza una tabla de estado respaldada por RocksDB que mantiene un filtro de deduplicación deslizante de 48 horas (coincidiendo con el búfer máximo de 48 horas del contador). Los reintentos de red duplicados que ocurran dentro de esta ventana se descartan de inmediato.
    2. Cualquier reintento que eluda lo anterior o que se recargue tras reinicios de workers choca con la restricción del índice único de la base de datos sobre (meter_id, interval_start). Las consultas de agregación de facturación suman únicamente sobre este libro mayor deduplicado, haciendo matemáticamente imposible el sobreconteo.

4. Motor de Alertas de Fugas con Lecturas Fuera de Orden / Faltantes

Lógica de Detección

Una fuga continua se define como 96 intervalos consecutivos de 15 minutos (24 horas continuas) de flujo distinto de cero, evaluados estrictamente por interval_start.

Pipeline de Procesamiento de Flujos
  1. Marcas de Agua y Retraso Permitido: Una topología de streaming (Apache Flink) mantiene un estado con clave por contador que rastrea intervalos contiguos. Dado que los contadores pueden almacenar en búfer hasta 48 horas, el job de streaming configura un umbral de retraso permitido de 48 horas. Las lecturas tardías se redirigen al estado con clave del contador en lugar de descartarse.
  2. Bitset de Contigüidad / Árbol de Rangos: Cada contador mantiene una estructura de estado de intervalos que contiene los intervalos evaluados más recientes ordenados por interval_start. Cuando llega una ráfaga fuera de orden, los intervalos ocupan sus ranuras correspondientes en la línea temporal cronológica.
  3. Tratamiento de Intervalos Faltantes:
    • Si un intervalo falta debido a pérdida de paquetes, desfase de reloj o por superar el límite de sobrescritura del búfer de 48 horas del contador, se trata como un flujo contiguo desconocido/interrumpido.
    • Dado que la especificación exige 96 intervalos consecutivos de flujo confirmado distinto de cero, un intervalo faltante reinicia la racha activa a cero. El motor nunca asume flujo ni flujo cero para datos faltantes.
  4. Garantía de Alerta Única:
    • La máquina de estados rastrea streak_count y un indicador booleano alert_emitted_for_current_streak.
    • Cuando streak_count alcanza 96, el motor evalúa si alert_emitted_for_current_streak es false. Si lo es, emite la alerta de fuga y establece el indicador en true.
    • Los intervalos consecutivos distintos de cero posteriores incrementan streak_count pero suprimen nuevas alertas. Solo cuando lectura cero (o intervalo faltante) rompe la racha se limpia streak_count y se restablece alert_emitted_for_current_streak a false.

5. Compensaciones Arquitectónicas

Compensación 1: Momento de la Confirmación de Ingesta
  • Opción Elegida: Confirmar la recepción en cuanto las lecturas brutas se confirman en la cola de mensajes distribuida (Kafka).
  • Opción Descartada: Confirmar la recepción solo después de que las escrituras se confirmen en la base de datos histórica de largo plazo y en las tablas de facturación.
  • Justificación: Un ACK completo de extremo a extremo durante una tormenta de reconexión de 15,734 rps arriesga alcanzar cuellos de botella de E/S de la base de datos. Si las respuestas superan el timeout de 30 segundos del contador, los contadores reintentan, multiplicando exponencialmente la carga de ingreso. El ACK a nivel de cola garantiza la persistencia en milisegundos y apaga los reintentos de inmediato.
Compensación 2: Arquitectura de Cómputo para la Detección de Fugas
  • Opción Elegida: Procesador de streaming con tiempo de evento y estado (Apache Flink con backend de estado RocksDB).
  • Opción Descartada: Consultas SQL por lotes periódicas sobre tablas de la base de datos analítica (por ejemplo, ejecutadas cada 15 minutos).
  • Justificación: Los escaneos SQL por lotes sobre millones de contadores con llegadas tardías fuera de orden requieren consultar ventanas deslizantes masivas de varios días sobre miles de millones de filas para reconstruir huecos y rachas. El motor de streaming con estado evalúa el estado deslizante de forma incremental al llegar, manteniendo la latencia mínima y eliminando los escaneos repetidos de tablas.
Compensación 3: Almacenamiento de Datos del Dashboard del Cliente
  • Opción Elegida: Almacén de series temporales/NoSQL preagregado y optimizado para lectura (por ejemplo, Apache Cassandra / ScyllaDB).
  • Opción Descartada: Consultas bajo demanda directamente sobre la base de datos relacional normalizada de facturación.
  • Justificación: Las consultas del dashboard presentan alta concurrencia de lectura y requisitos de consistencia laxos (permitiendo hasta 60 minutos de retraso durante las ráfagas). Desacoplar las lecturas del dashboard del almacén de facturación protege las transacciones financieras de los picos de consultas de clientes y permite el escalado horizontal con más de 23 GB por día.
Claude Opus 5.5 7.56

La aritmética de capacidad y de ráfagas es totalmente correcta, la deduplicación de la facturación es concreta y está bien ubicada, y hay exactamente tres compromisos (trade-offs) específicos del sistema. Los puntos débiles son la lógica de las alertas de fuga, el plan de ráfagas y las condiciones de la puntuación 9+. La lógica de fugas reinicia la racha cuando hay un hueco y, al mismo tiempo, permite rellenos tardíos de hasta 48 horas, lo que arriesga efectos del orden de llegada y alertas duplicadas. El plan de ráfagas omite el número de solicitudes de carga y el dimensionamiento de la cola acumulada (backlog), por lo que no se cumplen las condiciones de la puntuación 9+.

Puntuación por criterio

Calidad de la arquitectura

68

La exactly-once de facturación está bien especificada: un upsert ON CONFLICT DO NOTHING con clave (meter_id, interval_start) en el libro mayor de facturación, más un filtro de deduplicación de Flink de 48 horas, con el ACK enviado solo después de la escritura duradera en Kafka. El diseño de fugas tiene estado por medidor con clave interval_start y un permiso de retraso de 48 horas. Sin embargo, depende de un streak_count en ejecución que un intervalo faltante reinicia de inmediato. Eso entra en conflicto con llamar 'desconocido' al hueco y con las cargas tardías, y no muestra cómo se recalcula la racha cuando un hueco se completa después. Reiniciar la bandera de alerta en un hueco que luego se completa también podría producir una alerta duplicada.

Integridad

80

Se abordan los cinco elementos requeridos, incluida una regla explícita para intervalos faltantes y todas las cifras de capacidad. Con 984 palabras, la respuesta está dentro del límite. Alguno detalle es escaso: no hay dimensionamiento a nivel de solicitudes ni volumen de backlog.

Análisis de compromisos

80

Hay exactamente tres compromisos, cada uno con una opción elegida y una rechazada. Están ligados al sistema: el momento del ACK frente al reintento de 30 s, la detección de fugas en streaming frente a batch con datos tardíos, y un almacén separado para el panel. El tercero es algo genérico en su justificación.

Escalabilidad y fiabilidad

76

Todos los valores esperados son correctos: 1.333/s, 23,04 GB/día, 9,216 TB y 27,648 TB, y una ráfaga de 14.400 + 1.333 = 15.733/s. Se indican el buffering de Kafka, el ACK rápido, el dimensionamiento de particiones y la limitación del panel al SLO de 60 minutos. Faltan la tasa de solicitudes de carga (unas 600 req/s) como algo distinto de la tasa de lecturas, y el tamaño del backlog o la capacidad de retención, por lo que la respuesta no cumple el umbral de 9+.

Claridad

80

Bien estructurado, con secciones numeradas y aritmética claramente mostrada. Hay inconsistencias menores de redacción, como un libro mayor 'solo de adición' escrito con upserts, y intervalos faltantes descritos como 'desconocidos' pero tratados como rupturas.

GPT-6.1 Sol 7.37

La respuesta acierta en toda la aritmética de capacidad y de picos, y ofrece una arquitectura de registro duradero creíble, con deduplicación de la facturación garantizada por la base de datos. Sus principales puntos débiles son un plan de acumulación de trabajo pendiente y de recuperación insuficientemente especificado, una cobertura incompleta de los SLO del panel de control, y un estado de las alertas de fugas que no explica cómo las lecturas tardías fusionan rachas previamente separadas sin generar alertas duplicadas. Los tres compromisos (trade-offs) son claros y pertinentes.

Puntuación por criterio

Calidad de la arquitectura

65

El límite de ingesta con registro duradero y la clave única del libro de facturación resuelven correctamente los reintentos y el conteo de exactamente una vez. El procesamiento de fugas usa interval_start y trata explícitamente los intervalos ausentes como cortes, pero el contador y el indicador de alerta reiniciable no garantizan la corrección cuando datos tardíos unen rachas antes separadas. El diseño necesita recalcular las rachas históricas y conciliar las alertas ya emitidas, además de una emisión de alertas duradera o transaccional para evitar duplicados tras una recuperación. El orden de los puntos de control (checkpoints) del consumidor y la implementación de la retención de datos sin procesar también están insuficientemente especificados.

Integridad

75

Está presente toda la aritmética solicitada, incluido el almacenamiento replicado de 400 días y el tráfico en vivo en el pico de ráfaga. La respuesta nombra el componente de deduplicación de facturación, enuncia una regla para los intervalos ausentes, ofrece exactamente tres compensaciones entre opción elegida y descartada, y cumple el rango de palabras medido. Sin embargo, no aborda explícitamente el requisito de operación normal de que el 99 % de las lecturas sea visible en cinco minutos, y el objetivo del panel durante ráfagas se afirma sin un presupuesto de procesamiento.

Análisis de compromisos

83

Exactamente tres compensaciones identifican tanto la opción elegida como la descartada. El momento del ACK se vincula directamente con el tiempo de espera de reintento de 30 segundos, el procesamiento por tiempo de evento con las llegadas almacenadas en búfer, y el aislamiento del panel protege las cargas de facturación. Parte de la justificación está exagerada: los reintentos no tienen por qué crecer exponencialmente, y la detección por lotes indexada o incremental no tiene por qué recorrer miles de millones de filas. Los costes de las opciones elegidas, en particular la complejidad operativa y el mantenimiento de proyecciones separadas, reciben poca atención.

Escalabilidad y fiabilidad

71

Todos los valores de capacidad esperados son correctos, incluidos aproximadamente 15 733 lecturas/s en el pico y 27,648 TB de retención replicada de datos sin procesar. El objetivo de ingesta de 50 000 mensajes/s aporta margen, y una cola duradera es un amortiguador de ráfagas adecuado. La explicación de la absorción de ráfagas sigue siendo vaga, lo que justifica una deducción de un punto: no hay capacidad de cola/backlog, ni rendimiento sostenido del consumidor, ni cálculo del tiempo de drenaje. No se especifican la replicación ni los ajustes de confirmación necesarios para la aceptación duradera en Kafka. Tampoco se distingue entre solicitudes de carga por lotes y lecturas, y un ACK de menos de 50 ms no puede eliminar todos los escenarios de reintento.

Claridad

84

Las secciones numeradas, las ecuaciones explícitas y las etiquetas de elegido/descartado hacen que la respuesta sea fácil de auditar. La terminología y las unidades son, en general, claras. Entre las debilidades menores están la frase redundante «partitions are partitioned», el uso ambiguo de mensajes frente a lecturas, y describir los huecos como desconocidos y a la vez como cortes inmediatos de la racha, sin explicar cómo las llegadas tardías posteriores revisan ese estado.

Gemini 3.8 Flash 8.76

El diseño es exhaustivo, técnicamente sólido y responde plenamente al enunciado. Los cálculos de capacidad y de ráfagas son completamente precisos, y muestran una aritmética clara del rendimiento en estado estable, el volumen diario, la retención replicada y la carga máxima de ráfaga. La deduplicación para la facturación y la máquina de estados de detección de fugas (incluidas las llegadas tardías y una política explícita de gestión de huecos) están bien diseñadas. Los tres compromisos (trade-offs) están adaptados directamente al dominio del problema. La única omisión menor respecto a los criterios de máximo nivel es que no se distingue de forma explícita entre la tasa de solicitudes HTTP de carga (por ejemplo, ~600 solicitudes/segundo si los medidores envían por lotes sus 24 lecturas) y el rendimiento de lecturas individuales.

Puntuación por criterio

Calidad de la arquitectura

88

La arquitectura separa las responsabilidades de forma limpia entre la ingesta en el borde, la idempotencia basada en streams y el almacenamiento duradero. Garantizar la facturación exactamente una vez mediante una restricción de clave primaria sobre (meter_id, interval_start), respaldada por un filtro de deduplicación deslizante de 48 horas en RocksDB, es robusto y evita antipatrones comunes como depender únicamente de la semántica de entrega de la cola.

Integridad

87

Las cinco secciones requeridas se tratan en detalle dentro del rango prescrito de 800 a 1.100 palabras. El único detalle que falta para una puntuación perfecta es un desglose explícito de las tasas de solicitudes de carga frente a las tasas de lecturas individuales durante la ráfaga de reconexión.

Análisis de compromisos

88

Se presentan exactamente tres compromisos, cada uno nombra claramente la opción elegida y la descartada, junto con justificaciones concretas ligadas a los requisitos del sistema (ACK a nivel de cola frente a ACK de base de datos, estado de stream frente a SQL por lotes para la detección de fugas, y almacenamiento separado de paneles de modelo de lectura frente a consultar el RDBMS de facturación).

Escalabilidad y fiabilidad

87

Las estimaciones de capacidad coinciden exactamente con los valores esperados (1.333,33 rps en estado estacionario, 23,04 GB/día, 27.648 TB de almacenamiento bruto replicado; 14.400 de ráfaga + 1.333 de estado estacionario = 15.733,33 rps en el pico). El dimensionamiento y las estrategias de absorción de ráfagas mediante Kafka particionado y limitación de consumidores son sólidos, aunque no calcula explícitamente la tasa de solicitudes por lote (p. ej., 600 solicitudes/s).

Claridad

88

La respuesta está estructurada de forma lógica, con encabezados claros, fórmulas matemáticas explícitas y descripciones técnicas concisas. La extensión (984 palabras) se ajusta cómodamente a los límites objetivo.

6 Gemini 3.5 Flash-Lite

Media (sobre 10) 7.41

Arquitectura de ingesta de contadores inteligentes de agua

1. Estimaciones de capacidad y aritmética

Para construir un back-end robusto para 1,2 millones de contadores inteligentes, comenzamos con un dimensionamiento determinista de capacidad y almacenamiento.

  • Lecturas por segundo en estado estable: Cada contador transmite una lectura cada 15 minutos (900 segundos). Para 1.200.000 contadores, la tasa media de ingesta es $1.200.000 / 900 = 1.333,33$ lecturas por segundo.
  • Volumen de datos brutos por día: A 1.333,33 lecturas por segundo, el número total de lecturas diarias es $1.333,33 \times 86....
Mostrar respuesta completa ▼

Arquitectura de ingesta de contadores inteligentes de agua

1. Estimaciones de capacidad y aritmética

Para construir un back-end robusto para 1,2 millones de contadores inteligentes, comenzamos con un dimensionamiento determinista de capacidad y almacenamiento.

  • Lecturas por segundo en estado estable: Cada contador transmite una lectura cada 15 minutos (900 segundos). Para 1.200.000 contadores, la tasa media de ingesta es $1.200.000 / 900 = 1.333,33$ lecturas por segundo.
  • Volumen de datos brutos por día: A 1.333,33 lecturas por segundo, el número total de lecturas diarias es $1.333,33 \times 86.400 = 115.200.000$ lecturas/día. Con cada lectura de 200 bytes en la red, el volumen de datos brutos diario es $115.200.000 \times 200 \text{ bytes} = 23.040.000.000 \text{ bytes/día}$ (o 23,04 GB/día).
  • Almacenamiento bruto para todo el período de retención incluyendo replicación: Los datos deben conservarse durante 400 días con 3 réplicas. El cálculo de almacenamiento total es $23,04 \text{ GB/día} \times 400 \text{ días} \times 3 \text{ réplicas} = 27.648 \text{ GB}$ (o 27,64 TB).

2. Ruta de ingesta y dimensionamiento de la ráfaga por reconexión

Cuando ocurre una tormenta importante, el 30% de los contadores ($360.000$ contadores) pierde conectividad durante 6 horas. Durante 6 horas, cada contador desconectado almacena en búfer $6 \times 4 = 24$ lecturas. Cuando se restablece la conectividad, los 360.000 contadores suben sus 24 lecturas almacenadas repartidas uniformemente en una ventana de 10 minutos (600 segundos).

  • Tasa de subida almacenada en búfer: La tasa de lecturas históricas durante la ráfaga es $(360.000 \text{ contadores} \times 24 \text{ lecturas}) / 600 \text{ segundos} = 8.640.000 / 600 = 14.400$ lecturas por segundo.
  • Tasa de datos en vivo concurrente: Simultáneamente, los 1.200.000 contadores continúan enviando sus lecturas normales en vivo a $1.333,33$ lecturas por segundo.
  • Tasa máxima de ingesta: La tasa máxima total es $14.400 + 1.333,33 = 15.733,33$ lecturas por segundo (aproximadamente 15,7k rps).

Para absorber esta oleada sin descartar ninguna lectura, la capa de ingesta utiliza un broker de mensajes distribuido y escalable horizontalmente (como Apache Kafka) particionado en 64 particiones. Una flota de API Gateway, colocada detrás de un balanceador de carga, termina TLS, realiza una validación rápida del esquema y escribe directamente en el broker de mensajes. Dado que las particiones de Kafka desacoplan la ingesta del procesamiento posterior, la oleada se almacena de forma segura en búfer en registros de confirmación respaldados por disco. Los workers consumidores escalan dinámicamente según el retraso del consumidor (consumer lag), gestionando la oleada temporal sin pérdida de datos.

3. Idempotencia y facturación exactamente una vez

Los contadores reintentan las subidas si no reciben una confirmación en 30 segundos, lo que significa que los duplicados llegarán con toda seguridad. Para garantizar que la facturación cuente cada (meter_id, interval_start) exactamente una vez, aplicamos idempotencia dentro del Procesador de flujo de facturación.

Cada carga útil de lectura entrante contiene una clave natural compuesta: meter_id e interval_start. El procesador de flujo de facturación consume lecturas del broker de mensajes y utiliza una operación de upsert atómica contra un almacén de datos columnar distribuido o un almacén de estado de deduplicación (como RocksDB integrado en Apache Flink).

Cuando llega una lectura, el procesador comprueba si ya se ha procesado y facturado un registro para (meter_id, interval_start). Si la clave existe, la carga útil duplicada se descarta de forma segura o se marca como duplicada, garantizando cero doble conteo. Si la clave no existe, la tabla de facturación se actualiza y se envía una confirmación de vuelta al broker de ingesta.

4. Datos tardíos y alertas de fuga

La detección de fugas requiere identificar cuándo un contador muestra un flujo distinto de cero en cada uno de 96 intervalos consecutivos de 15 minutos (que cubren un período completo de 24 horas), evaluado estrictamente por interval_start en lugar del tiempo de llegada. Para garantizar que las alertas de fuga sigan siendo correctas cuando las lecturas almacenadas en búfer llegan tarde y fuera de orden, empleamos procesamiento de flujos en tiempo de evento con marcas de agua (watermarking).

  • Gestión de datos tardíos: El procesador de flujos mantiene ventanas de estado indexadas por meter_id. Dado que los contadores pueden almacenar datos en búfer durante hasta 48 horas, las ventanas de procesamiento de flujos se configuran con un umbral de retraso permitido de 48 horas. Esto garantiza que, cuando lleguen subidas por lotes retrasadas o tras una reconexión, se inserten retroactivamente en sus intervalos cronológicos correctos de 15 minutos según sus marcas de tiempo interval_start.
  • Intervalos ausentes: Si un intervalo de 15 minutos falta por completo en el flujo y su ventana de retraso de 48 horas se cierra sin recibir datos, dicho intervalo se trata explícitamente como flujo cero (o como datos ausentes que rompen una racha contigua). Una lectura ausente rompe la racha de flujo distinto de cero, reiniciando el contador consecutivo de 96 intervalos para ese contador.
  • Disparo de alertas: Una vez que un contador acumula 96 intervalos contiguos distintos de cero, el sistema dispara exactamente una alerta por racha. Las lecturas distintas de cero posteriores en la misma ejecución continua no generan alertas duplicadas, gracias a indicadores de deduplicación con estado almacenados junto al contador de la racha activa.

5. Compensaciones arquitectónicas

Para finalizar el diseño del sistema, evaluamos tres decisiones arquitectónicas críticas:

  1. Protocolo de ingesta: opción elegida (HTTP/REST con JSON sobre TLS) frente a opción descartada (MQTT / sockets TCP personalizados). Aunque los sockets TCP personalizados o MQTT ofrecen una menor sobrecarga de carga útil, HTTP/REST con JSON está universalmente soportado por los módulos de pasarela celular e IoT, simplifica la depuración, se integra de forma nativa con los cortafuegos de gestión de API existentes y acomoda fácilmente el requisito de tamaño de 200 bytes en la red sin pilas de protocolos de firmware especializadas.
  2. Paradigma de almacenamiento: opción elegida (archivos Parquet en almacenamiento de objetos para datos fríos + log distribuido para datos calientes) frente a opción descartada (clúster SQL relacional distribuido tradicional). Mantener 400 días de datos históricos de series temporales más 3 réplicas en un clúster de base de datos relacional tradicional introduce costes de infraestructura prohibitivos y límites complejos de sharding horizontal. Al volcar las lecturas brutas compactadas en archivos Parquet columnares en almacenamiento de objetos (por ejemplo, AWS S3), consultados mediante motores de consulta sin servidor, logramos una retención a largo plazo rentable mientras la ruta operativa activa se mantiene rápida.
  3. Consistencia del panel: opción elegida (consistencia eventual mediante proyecciones de modelo de lectura) frente a opción descartada (consultas síncronas de lectura directa a la base de datos). Para garantizar que las consultas del panel sigan siendo ágiles durante las masivas ráfagas de reconexión (15,7k rps), elegimos proyecciones asíncronas de modelo de lectura que actualizan los paneles de los clientes en un plazo de 5 minutos en condiciones de carga normales (y se relajan hasta 60 minutos durante tormentas). Descartamos las consultas síncronas de lectura directa porque bloquear o consultar el almacén transaccional principal durante ráfagas de ingesta máxima provocaría tiempos de espera en cascada, agotamiento del pool de conexiones de la base de datos y un posible fallo de la ingesta.
Claude Opus 5.5 6.74

Todas las cifras esperadas son correctas y aparecen reflejadas: 1.333 lecturas/s, 23,04 GB/día, unos 27,65 TB replicados y una ráfaga de 15.733 lecturas/s que incluye la carga constante. Están presentes todas las secciones requeridas y la respuesta se mantiene dentro del límite de palabras. Los puntos débiles son la profundidad y la precisión. El plan de absorción de ráfagas no ofrece un dimensionamiento del backlog ni de la retención, no distingue entre solicitudes de carga y lecturas, y omite la degradación del panel de control durante la ráfaga. La ruta de confirmación para la facturación con semántica exactly-once es confusa, ya que el ack se envía al «broker» en lugar de al medidor tras una escritura duradera. Algunos de los compromisos (trade-offs) son bastante genéricos.

Puntuación por criterio

Calidad de la arquitectura

63

El flujo es claro: una API gateway, un clúster de Kafka con 64 particiones, un procesador de facturación en Flink que deduplica por (meter_id, interval_start) en un almacén de estado RocksDB o mediante upsert, y detección de fugas por tiempo de evento con 48 horas de tolerancia de retraso. El componente que aplica la regla está nombrado. Sin embargo, la semántica de la confirmación está confusa: el ack se 'envía de vuelta al broker de ingesta' en lugar de al medidor solo después de una escritura duradera. No se especifica la duración del estado de deduplicación. La reevaluación de la racha de fuga cuando un hueco se rellena tarde se describe solo de forma vaga.

Integridad

75

Se abordan los cinco requisitos: la aritmética de capacidad, el pico de la ráfaga, el componente de facturación exactly-once, el manejo de fugas con datos tardíos con una regla explícita para huecos (un hueco rompe la racha una vez cerrada la ventana de tolerancia de 48 horas) y tres compromisos. La respuesta está dentro del rango de palabras. Varios puntos son escasos, en particular los detalles de absorción de la ráfaga y la garantía de ack tras escritura duradera.

Análisis de compromisos

65

Hay exactamente tres compromisos, cada uno nombra una opción elegida y una descartada. El compromiso entre el read-model del panel y las consultas síncronas se relaciona con la ráfaga y el SLA de 5/60 minutos. Los compromisos HTTP frente a MQTT y Parquet/almacenamiento de objetos frente a SQL relacional son bastante genéricos, y el razonamiento sobre HTTP con el tamaño de 200 bytes es débil.

Escalabilidad y fiabilidad

65

Todos los valores esperados son correctos y el pico incluye la carga constante. La absorción solo se afirma mediante el búfer en disco de Kafka y el autoescalado de consumidores. No hay dimensionamiento de backlog ni de retención, no hay comprobación de throughput por partición, no hay distinción entre unas 600 solicitudes de subida/s y las lecturas/s, y no hay un plan explícito de degradación del panel dentro de la sección de ráfaga. La garantía de no pérdida mediante ack duradero antes de la confirmación al medidor no se indica con claridad.

Claridad

75

La respuesta está bien organizada, con encabezados que corresponden a los requisitos y aritmética presentada paso a paso. La redacción es en su mayor parte precisa. Hay una confusión menor en la redacción sobre los intervalos ausentes ('flujo cero (o datos ausentes...)') y en la descripción del ack.

GPT-6.1 Sol 7.00

La respuesta acierta con la aritmética de capacidad y de ráfagas, se mantiene dentro del límite de palabras y presenta exactamente tres compromisos entre la opción elegida y la rechazada. Sin embargo, el plan de almacenamiento en búfer para las ráfagas no está dimensionado cuantitativamente, el diseño de facturación no establece una garantía de exactamente una vez a prueba de fallos y la lógica de las alertas de fugas no explica del todo la reconciliación de rachas con datos tardíos.

Puntuación por criterio

Calidad de la arquitectura

60

La ruta de ingesta basada en broker y la clave natural de facturación son adecuadas. Sin embargo, la comprobación de un almacén de deduplicación y la actualización de facturación no son explícitamente una única operación atómica y duradera, por lo que los fallos podrían perder actualizaciones de facturación o contarlas dos veces. El acuse de recibo descrito es hacia el broker, no un acuse del medidor tras una ingesta duradera. Se proporcionan bins de tiempo de evento y una regla de intervalos faltantes, pero la reevaluación de rachas históricas y la identidad de las alertas cuando las lecturas tardías se unen a ejecuciones previamente separadas están poco especificadas.

Integridad

80

La respuesta de 941 palabras cubre las cinco áreas solicitadas, incluye aritmética de capacidad, suma explícitamente el tráfico en vivo a la ráfaga, nombra el componente de aplicación de facturación, establece una regla para intervalos faltantes y ofrece exactamente tres compensaciones. También se reconocen los objetivos de latencia del panel. La cobertura es estructuralmente completa, aunque varias garantías se afirman sin establecerse por completo.

Análisis de compromisos

75

Exactamente tres compensaciones identifican claramente las opciones elegidas y descartadas, con conexiones útiles con el costo de retención y el aislamiento del panel durante ráfagas. La comparación de protocolos no justifica que JSON y HTTP encajen en el supuesto de tamaño de mensaje dado, y las comparaciones de almacenamiento y de panel exageran las desventajas inherentes del almacenamiento relacional y de las consultas síncronas. Los costos de las opciones elegidas reciben poca atención.

Escalabilidad y fiabilidad

65

La tasa estable, el volumen diario, el almacenamiento de retención replicado y la ráfaga de aproximadamente 15.733 lecturas/s están calculados correctamente. Sin embargo, 64 particiones y el escalado dinámico de consumidores no establecen un rendimiento de ingesta aprovisionado ni una capacidad de backlog suficiente. No hay dimensionamiento cuantitativo de colas, cálculo de tiempo de vaciado, margen para reintentos ni una política explícita de acuse de escrituras replicadas. Además, no se distingue el rendimiento de lecturas en búfer del rendimiento de solicitudes de carga.

Claridad

80

La respuesta está bien organizada, es legible y lo bastante concisa para el rango requerido, con aritmética claramente mostrada y compensaciones etiquetadas. Algunas descripciones técnicas siguen siendo ambiguas, en particular las alternativas intercambiables para el almacén de facturación y los acuses enviados al broker. Usar 'rps' para lecturas en lugar de distinguir solicitudes también oscurece el dimensionamiento de la ingesta.

Gemini 3.8 Flash 8.49

El diseño aborda a fondo los cinco requisitos del enunciado, con cálculos matemáticos completamente precisos tanto para el escenario de régimen estable como para el de ráfagas. Ofrece mecanismos arquitectónicos sólidos para la deduplicación de facturación con semántica de exactamente una vez y para la detección de fugas por tiempo de evento con llegada tardía, junto con una política explícita de gestión de huecos. La respuesta se queda ligeramente por debajo del umbral de 9,0 o más porque no distingue las solicitudes HTTP de carga del rendimiento de lecturas individuales durante las ráfagas de reconexión, ni cuantifica la capacidad total de acumulación de la cola.

Puntuación por criterio

Calidad de la arquitectura

85

La arquitectura separa claramente las responsabilidades entre la puerta de enlace de ingesta, los registros de confirmación de Kafka, el procesamiento de flujos con tiempo de evento y los almacenes de facturación. El procesamiento exactamente una vez para la facturación usa correctamente la clave compuesta (meter_id, interval_start) en un upsert atómico o almacén de estado, en lugar de depender únicamente de las garantías de transporte. La arquitectura de alertas de fugas maneja correctamente los datos fuera de orden mediante ventanas de tiempo de evento y establece una regla clara de huecos de retraso de 48 horas.

Integridad

88

Se abordan todos los puntos esenciales de la lista de verificación: la aritmética se muestra y es correcta, la ráfaga se modela con tráfico en vivo concurrente, la responsabilidad de deduplicación se asigna explícitamente, el comportamiento ante intervalos faltantes se indica con claridad y se proporcionan exactamente tres compensaciones con opciones elegidas y descartadas. El recuento de 941 palabras está dentro del rango de 800 a 1.100 palabras.

Análisis de compromisos

82

La respuesta presenta exactamente tres compensaciones, identificando claramente las alternativas elegidas y descartadas con justificaciones técnicas. Aunque las elecciones de protocolo y de proyección para el panel están bien ligadas a los parámetros operativos, la compensación de almacenamiento resulta algo genérica (Parquet en almacenamiento de objetos frente a SQL relacional) en lugar de examinar alternativas específicas de series temporales (por ejemplo, un TSDB dedicado frente a almacenes basados en LSM-tree).

Escalabilidad y fiabilidad

83

Todos los cálculos coinciden perfectamente con los valores esperados, incluido el volumen diario bruto (23,04 GB/día), el almacenamiento replicado 3x durante 400 días (27,65 TB) y el pico combinado de ráfaga (15.733 rps). Sin embargo, no distingue el volumen de solicitudes de carga (por ejemplo, ~600 solicitudes/s si se agrupan por lotes) de las lecturas individuales por segundo, y trata el almacenamiento en cola de forma cualitativa sin calcular explícitamente el volumen numérico del backlog ni la huella en disco.

Claridad

88

La respuesta está organizada con encabezados claros en Markdown, explicaciones concisas y formulaciones matemáticas transparentes, lo que facilita su lectura y evaluación.

Sobre este género

En este género, las capacidades que más se intentan medir son Calidad de la arquitectura, Integridad, Análisis de compromisos.

A diferencia de coding, este género pesa más la arquitectura, la escala, la fiabilidad y los trade-offs que los detalles de implementación ejecutable.

Una puntuación alta aquí no significa que el modelo vaya a escribir el mejor código funcional ni la explicación más sencilla.

Para qué sirve un modelo fuerte en este género

propuestas de arquitectura, diseño de servicios y conversaciones sobre escalabilidad.

Lo que este género por sí solo no alcanza a mostrar

calidad de implementación de bajo nivel, corrección exacta o escritura para público no técnico.

Qué se evalúa en Diseño de sistemas

Criterios y pesos usados para este ranking por género.

Calidad de la arquitectura

30.0%

Este criterio se incluye para comprobar Calidad de la arquitectura en la respuesta. Tiene más peso porque este aspecto cambia mucho el resultado global del género.

Integridad

20.0%

Este criterio se incluye para comprobar Integridad en la respuesta. Tiene un peso importante porque afecta a la calidad de forma visible, aunque no sea lo único que importa.

Análisis de compromisos

20.0%

Este criterio se incluye para comprobar Análisis de compromisos en la respuesta. Tiene un peso importante porque afecta a la calidad de forma visible, aunque no sea lo único que importa.

Escalabilidad y fiabilidad

20.0%

Este criterio se incluye para comprobar Escalabilidad y fiabilidad en la respuesta. Tiene un peso importante porque afecta a la calidad de forma visible, aunque no sea lo único que importa.

Claridad

10.0%

Este criterio se incluye para comprobar Claridad en la respuesta. Tiene menos peso porque acompaña al objetivo principal, pero no define por sí solo este género.

Enlaces relacionados

X f L