Playbook

CQRS (Segregación de Responsabilidad de Consulta de Comando) en Producción: Coherencia, Errores y Estrategias de Recuperación (CQRS Segregacion DE Responsabilidad DE Consulta DE Comando EN Produccion Coherencia Errores Y Estrategias DE Recuperacion)

¿Cómo funciona CQRS de forma segura en un entorno de producción? Retraso de consistencia, evento duplicado, corrupción de secuencia, recuperación de proyección, reintento, estrategias DLQ y Saga.

CQRS (Segregación de responsabilidad de consulta de comando): anatomía de las decisiones

Parte 4 de 4

CQRS production recovery flow for retries, projections, and consistency

How these failures look to a user

If a banking balance is delayed by two seconds, a user may think money disappeared. If a like count is delayed by two seconds, most users may accept it. The same technical lag creates two different product risks.

Likewise, if the same OrderPlaced message arrives twice, inventory can be reduced twice. Production concepts should therefore be read not only as definitions, but through their effect on the user and the business.

La verdadera cuestión en Producción

El camino feliz es simple: comando aceptado, evento liberado, proyección actualizada. En Producción, el mensaje llega dos veces, el consumidor se queda atrás, la proyección se rompe o el usuario no puede ver el orden que escribió en la lista.```text Command accepted → event published → projection delayed → user refreshes "Siparişim kayboldu mu?"


## Conceptos en la primera mención```text
📦 Consistency lag
Write başarılı olduktan sonra read modelin güncellenmesine kadar geçen süre.

📦 Retry
Geçici teknik hatada aynı işi kontrollü biçimde yeniden deneme.

📦 Dead-letter queue (DLQ)
Normal akışta işlenemeyen mesajların incelenmek üzere ayrıldığı kuyruk.

📦 Checkpoint
Projection'ın güvenle işlediği son event konumu.
```**La coherencia final** no significa que los datos sean incorrectos; diferentes modelos llegan a la misma verdad en diferentes momentos. Si esto es aceptable, el producto debe explicárselo correctamente al usuario; de lo contrario, debería elegir una estrategia de coherencia diferente para la consulta crítica.

## Every defence has a reason

- We keep a **checkpoint** **because** a replay needs to know where a projection can safely resume.
- We need **idempotency** **because** applying a duplicate event twice corrupts real business effects such as inventory or payment.
- We limit **retry** **because** repeating a malformed message cannot repair it; it can only amplify load and incorrect impact.
- We use a **DLQ** **because** a message unresolved by the normal flow needs visible ownership and investigation.
- The **partition key is the aggregate ID** **because** the causal order of one aggregate matters more than global event order.
- We **replay** **because** verified event history remains correct even when a projection is broken.

## El retraso en la coherencia es una decisión del producto, no técnica

Si un pago no aparece en la lista de pedidos durante dos segundos después de haber sido recibido, el usuario puede sentir como una pérdida de datos. Primero determine el contrato visible: ¿Qué pantalla debe actualizarse y cuánto tiempo después de la transacción?```text
POST /orders → 202 Accepted + orderId + version
GET /orders/{id}?minVersion=42
  → projection 42'ye ulaştıysa güncel görünüm
  → henüz ulaşmadıysa "işleniyor" durumu
```Se puede utilizar una interfaz de usuario optimista, sondeo o espera de versión. Estos no restablecen el retraso; **porque** el verdadero trabajo es mostrar honestamente al usuario el significado del retraso. Para decisiones críticas, el resultado del lado del mando sigue siendo válido.

## Corrupción de secuencia y evento duplicado

La entrega al menos una vez normaliza la repetición del mismo mensaje. Procesar el mismo evento de pedido por segunda vez puede reducir el recuento de inventario dos veces. El consumidor debe verificar el ID del evento y la versión agregada.```text
if event.id already processed: ignore
if event.version <= projection.version: ignore
apply event
store checkpoint and event id
```Este control conlleva un costo promedio O(1) u O(log n) con búsqueda indexada. Si el orden se garantiza sólo dentro de una partición, la clave de partición debe ser un ID agregado; **porque** el orden causal del mismo orden es importante desde el orden global.

## Reintento, DLQ y momento de decisión del operador

No todos los errores deben intentarse nuevamente. El tiempo de espera de la red puede ser temporal; El esquema de evento no válido es un error permanente.

| Tipo de error | Reacción | Por qué |
| --- | --- | --- |
| Tiempo de espera / 503 | Reintentar con retroceso exponencial | La adicción se puede recuperar |
| Límite de tarifa | Reintento retrasado | Recuperarse sin aumentar la carga |
| Error de validación del esquema | DLQ + alarma | Reintentar no puede corregir el mensaje |
| Violación de reglas comerciales | Guardar, revisar, compensar | El reintento automático puede magnificar el impacto falso |

DLQ no es un basurero. Cada mensaje debe tener un propietario, tiempo de revisión, procedimiento de reproducción y alarma.

## ¿Cómo recuperarse si la proyección está dañada?

La proyección no es un caché, es una vista empresarial reproducible.```text
1. Consumer'ı durdur veya yeni projection sürümü oluştur
2. Son güvenli checkpoint'i doğrula
3. Event stream'i kontrollü replay et
4. Sayım ve örnek veri doğrulaması yap
5. Trafiği yeni projection'a yönlendir
6. Lag ve hata oranını izle
```El costo de repetición es O(n), lineal con el número de eventos. La reproducción instantánea o segmentada puede reducir esto; Pero la fuente de la instantánea no es real. **Porque** el registro en el que confiar para la recuperación es el historial de eventos verificado.

## El camino del fracaso de Saga

Cuando el pago falla en el comercio electrónico, las existencias no deben permanecer reservadas para siempre. Saga no es una reversión técnica, sino una compensación que tiene sentido comercial.```text
Reserve inventory → Capture payment → Create shipment
                 payment fails → Release inventory
```La compensación también debería ser idempotente: el inventario no debería aumentar dos veces si ReleaseInventory se ejecuta dos veces. La coreografía es ligera en pequeños flujos locales; La orquestación proporciona una máquina de estado y un único punto de monitoreo en un proceso de varios pasos.

## Observabilidad

Mida el retraso del consumidor, el recuento de reintentos, la profundidad de DLQ, la antigüedad del punto de control, la tasa de duplicados y el tiempo de procesamiento de un extremo a otro. Mueva el ID de seguimiento del comando al evento, al consumidor y a la consulta que regresa al usuario. La alarma cobra significado en el impacto en el usuario, no en métricas técnicas.

## Coincidencias que crean falsa confianza```text
❌ Retry = güvenilirlik
✓ Retry, yalnızca geçici hatada ve idempotent işlemde güvenlidir.

❌ DLQ = kurtarma
✓ DLQ, inceleme ve replay sürecinin başlangıcıdır.

❌ Replay = her zaman güvenli
✓ Sürümleme ve yan etkiler ayrılmadan replay etkiyi tekrar üretebilir.

❌ Eventual consistency = rastgele gecikme
✓ Gecikme ölçülmeli, ürünle kabul edilmeli ve kullanıcıya açıklanmalıdır.

Verificación de preparación para la producción

  1. ¿Tiene un objetivo de retraso de coherencia visible para el usuario?
  2. ¿Es seguro para los consumidores eventos duplicados y fuera de orden?
  3. ¿La política de reintento distingue entre errores temporales y permanentes?
  4. ¿Están definidos el propietario del mensaje DLQ y el runbook de reproducción?
  5. ¿Se puede reconstruir Projection de forma segura a partir de datos de producción?
  6. ¿Son idempotentes las compensaciones de Saga?

Si no puede responder cada una de estas preguntas con evidencia, el sistema puede parecer imposible de escalar; pero aún no está operativo.

¿Qué deberías recordar de este artículo?

  1. La coherencia eventual es un contrato que debe gestionarse mediante la experiencia del usuario.
  2. Los duplicados y la corrupción de pedidos son normales en la entrega distribuida, no en casos extremos.
  3. Retry es un sistema de recuperación diseñado junto con DLQ y repetición.
  4. Si la Proyección no es reconstruible, se convierte en deuda operativa.
  5. Saga no retrocede; compensa el impacto empresarial.

La arquitectura de producción no se trata de que los mensajes lleguen bien la primera vez; Se manifiesta en cómo actúas cuando llegan dos veces, tarde o en turnos inesperados.

FAQ

Frequently asked questions

¿Qué es el retraso en la coherencia?

El tiempo hasta que se actualiza el modelo de lectura después de que la escritura sea exitosa.

¿Qué es reintentar?

Reintentar el mismo trabajo de forma controlada en caso de error técnico temporal.

¿Es correcto "Reintentar = confiabilidad"?

El reintento es seguro sólo en caso de error transitorio y operación idempotente.

¿Qué soluciona esta sección?

La falla parcial en los sistemas distribuidos no es una excepción. Este artículo no pretende eliminar el error; Se centra en cómo mantener la precisión de los datos, la confianza del usuario y el tiempo de recuperación cuando se producen errores. La coherencia eventual es un contrato que debe gestionarse a través de la experiencia del usuario. El camino feliz es simple: comando aceptado, evento liberado, proyección actualizada. En Producción, el mensaje llega dos veces, el consumidor se queda atrás, la proyección se rompe o el usuario no puede ver el orden que escribió en la lista.

Principios de ingeniería aprendidos

  • El retraso de consistencia debe ser un contrato aceptado por el producto y visible para el usuario.
  • El diseño de consumidor idempotente es obligatorio para la duplicación, interrupción de secuencia y repetición.
  • Recuperación; Es una capacidad prediseñadas con punto de control, runbook y observabilidad.

Continuar leyendo

Continuar leyendo

Siguiente en la serie

Misma serie

Misma serie

Paylaş