Playbook

Trabajos compatibles con bases de datos con arrendamiento (Trabajos Compatibles Con Bases DE Datos Con Arrendamiento)

Arrendamiento con ACTUALIZACIÓN condicional, observador que salva trabajos estancados y por qué simplemente mostrar el mensaje no es suficiente para pagar la producción.

Motor de pago distribuido

Parte 13 de 22

Una serie de arquitecturas de pago distribuidas que cierran la brecha entre la captura y la finalización.

Distributed payment engine architecture diagram

Establecimos el algoritmo de reintento en la sección anterior; pero este algoritmo suponía qué trabajador estaba a cargo de un trabajo. Si varios trabajadores están saliendo de la misma cola de trabajos, ¿pueden dos trabajadores procesar el mismo trabajo de pago al mismo tiempo?

Los corredores de mensajes resuelven este problema con 'tiempo de espera de visibilidad' o 'ack/nack'. Pero en una cola de trabajos respaldada por una base de datos (el enfoque preferido en muchos sistemas de pago, porque el estado del trabajo ya se encuentra en la base de datos) se proporciona la misma garantía a través del patrón arrendamiento.```text Worker A Worker B │ SELECT ... FOR UPDATE? │ │ ya da conditional UPDATE │ ▼ ▼ Job'ı kilitlemeye çalışır Job'ı kilitlemeye çalışır → sadece biri kazanır


## Conceptos en la primera mención```text
📦 Lease
Bir worker'ın bir işi belirli bir süre için 'sahiplendiğini' işaretleyen zaman damgalı kayıt.

📦 Conditional UPDATE
Sadece beklenen koşul (örn. status = Pending) doğruysa satırı güncelleyen atomik SQL işlemi.

📦 Lease süresi (Lease TTL)
Bir worker'ın işi ne kadar süreyle sahiplenebileceğinin üst sınırı; bu süre geçince iş tekrar alınabilir hale gelir.

📦 Stuck Watcher
Lease'i süresi dolmuş ama tamamlanmamış işleri periyodik olarak tarayıp yeniden kuyruğa alan arka plan süreci.
```El arrendamiento no es un candado; Si el proceso que mantiene el bloqueo falla, el bloqueo puede permanecer indefinidamente. Dado que el contrato de arrendamiento tiene una duración, incluso si el trabajador falla, el trabajo se libera automáticamente después de un tiempo.

## Forma atómica de conseguir un contrato de arrendamiento

Leer y luego actualizar (lectura y escritura) para recuperar un trabajo está abierto a una condición de carrera: dos trabajadores pueden leer la misma línea, ambos ven "vacío", ambos intentan actualizar. La forma correcta es mover la lectura y la condición a la misma expresión atómica:```sql
UPDATE payment_jobs
SET status = 'Processing',
    lease_owner = :workerId,
    lease_until = now() + interval '60 seconds'
WHERE id = :jobId
  AND (status = 'Pending' OR (status = 'Processing' AND lease_until < now()))
RETURNING id;
```Si esta ACTUALIZACIÓN no devuelve filas, el trabajo ya está a cargo de otro trabajador o todavía tiene un contrato de arrendamiento válido: el trabajador pasa silenciosamente al siguiente trabajo. Si se devuelve la fila, ese trabajador ahora es el único propietario del trabajo; hasta que expire el contrato de arrendamiento.

## ¿Por qué debería ampliarse el período de arrendamiento con Heartbeat?

Un período de arrendamiento fijo (por ejemplo, 60 segundos) puede no ser suficiente para cada transacción. Una operación que puede tardar mucho tiempo (por ejemplo, una llamada de PSP se vuelve inesperadamente larga) debe extenderse con un latido antes de que expire el contrato de arrendamiento:```text
Worker işe başlar → lease_until = now + 60s
  ... iş sürüyor ...
Worker heartbeat gönderir → lease_until = now + 60s (yenilenir)
  ... iş tamamlanır ...
Worker status = Completed olarak işaretler
```Un trabajador que no puede enviar un latido (caída, desconectado de la red) no puede renovar el contrato de arrendamiento; El tiempo expira y el trabajo vuelve a estar disponible. Este es el mecanismo que garantiza que el escenario de fallo se maneje automáticamente.

## Vigilante atascado: quién detecta trabajos con contratos de arrendamiento vencidos

El trabajo no se "recupera" automáticamente cuando expira el contrato de arrendamiento; un trabajador debe `SELECT` volver a hacerlo. Por lo tanto, un proceso de vigilancia que se ejecuta periódicamente busca trabajos cuyo contrato haya expirado pero que aún se encuentren en el estado `Processing` y los hace recuperables (o los asigna directamente a un nuevo trabajador).```text
Watcher (her 30 saniyede bir)
  SELECT id FROM payment_jobs
  WHERE status = 'Processing' AND lease_until < now()
  → bu işler 'stuck' olarak işaretlenir veya doğrudan Pending'e döndürülür
```Sin Watcher, el trabajo dejado por un trabajador accidentado puede parecer que está "Procesándose" para siempre; Un pago nunca se completa sin que nadie se dé cuenta.

## Por qué el Nack del corredor por sí solo no es suficiente

Si un trabajador en un intermediario de mensajes `Nack` el mensaje (o el tiempo de espera de visibilidad expira), el mensaje regresa a la cola. Esto es muy similar a un arrendamiento en una base de datos, pero hay dos diferencias importantes: primero, la propia ventana de visibilidad del corredor a menudo no está sincronizada con el registro persistente del estado de su negocio (el mensaje puede perderse o entregarse dos veces); segundo, `Nack` simplemente dice "dejar este mensaje", sin saber permanentemente *en qué etapa* el trabajo está bloqueado o cuántas veces se ha intentado. El arrendamiento respaldado por una base de datos mantiene el estado del trabajo y el historial de prueba dentro del mismo límite de transacciones y es consultable.

## Distinciones frecuentemente confusas```text
❌ Lease = kilit (lock)
✓ Lease süresi dolan bir zaman sınırıdır; kilit process çökerse sonsuza kalabilir

❌ Read-then-write yeterlidir
✓ Read-then-write yarış durumuna açıktır; conditional UPDATE atomik olmalıdır

❌ Nack, lease'in yerini tamamen tutar
✓ Nack mesaj görünürlüğünü yönetir; lease iş durumunu ve deneme geçmişini kalıcı olarak tutar
```## Comparación del tiempo de espera de visibilidad del corredor y el arrendamiento respaldado por base de datos

| Criterio | Tiempo de espera de visibilidad del corredor | Arrendamiento respaldado por DB |
| --- | --- | --- |
| Cuestionabilidad del estatus | Limitado | Completo con SQL |
| Persistencia del historial de ensayos | Depende del corredor | Fácilmente en la misma línea |
| Detección de trabajos atascados | Indirecto | Con consulta directa |

## Lista de verificación al diseñar un contrato de arrendamiento

1. ¿El arrendamiento es una única declaración atómica `UPDATE ... WHERE` o lectura y escritura?
2. ¿El período de arrendamiento es realmente más largo que el tiempo de procesamiento más largo esperado?
3. ¿Existe una renovación de arrendamiento con heartbeat para transacciones que pueden demorar mucho tiempo?
4. ¿El observador Stuck trabaja periódicamente o los trabajos cuyo contrato de arrendamiento ha expirado permanecen en "Procesamiento" para siempre?
5. ¿El campo `lease_owner` almacena para diagnóstico qué instancia de trabajador recibió el trabajo?
6. ¿Se aumenta el número de pruebas con cada arrendamiento y se mantiene de forma permanente?

## Lo que debes recordar de este artículo

1. El arrendamiento no es un candado; Es un reclamo de propiedad por tiempo limitado y termina automáticamente.
2. Obtener un contrato de arrendamiento requiere una ACTUALIZACIÓN condicional atómica; La lectura y escritura es propensa a condiciones de carrera.
3. Las transacciones largas deben renovar el contrato de arrendamiento con latido del corazón; De lo contrario, el contrato de arrendamiento podrá rescindirse anticipadamente.
4. Stuck Watcher es un proceso en segundo plano obligatorio que recupera los trabajos que dejaron los trabajadores bloqueados.

> La confiabilidad de una cola de trabajos no va por buen camino; Se prueba cuando un trabajador choca en el medio.

En la siguiente sección, examinamos un tipo de trabajador que se basa en este mecanismo de arrendamiento: el trabajador de conciliación, que tiene éxito en el PSP pero mejora los pagos aún pendientes en el sistema.

FAQ

Frequently asked questions

¿Qué es un arrendamiento?

Un registro con marca de tiempo que marca que un trabajador es "propietario" de un trabajo durante un período de tiempo específico.

¿Qué es la ACTUALIZACIÓN condicional?

Operación de SQL atómico que actualiza la fila solo si la condición esperada (por ejemplo, estado = Pendiente) es verdadera.

¿Es correcto "Arrendar = bloquear (bloquear)"?

Un contrato de arrendamiento es un límite de tiempo que vence; El bloqueo puede persistir para siempre si el proceso falla

¿Qué soluciona esta sección?

Los corredores de mensajes resuelven este problema con 'tiempo de espera de visibilidad' o 'ack/nack'. Pero en una cola de trabajos respaldada por una base de datos (el enfoque preferido en muchos sistemas de pago, porque el estado del trabajo ya se encuentra en la base de datos) se proporciona la misma garantía a través del patrón **arrendamiento**. El arrendamiento no es un candado; Es un reclamo de propiedad por tiempo limitado y termina automáticamente. Establecimos el algoritmo de reintento en la sección anterior; pero este algoritmo suponía *qué trabajador* estaba a cargo de un trabajo. Si varios trabajadores están saliendo de la misma cola de trabajos, ¿pueden dos trabajadores procesar el mismo trabajo de pago al mismo tiempo?

Principios de ingeniería aprendidos

  • El arrendamiento no es un candado; Tiene un límite de tiempo y finaliza automáticamente.
  • Obtener un contrato de arrendamiento requiere una ACTUALIZACIÓN condicional atómica, no una lectura y luego escritura.
  • Sin un vigilante atascado, el trabajo del trabajador accidentado puede perderse para siempre.

Continuar leyendo

Continuar leyendo

Siguiente en la serie

Siguiente en la serie

Misma serie

ENSAYO

Pagado pero sin pedido: mejora

Guía de respuesta a incidentes: se cobra al cliente pero no se realiza ningún pedido; desorden de cestas multiintencional; Limpiar el deduplicado con…

Paylaş