Documentation for a newer release is available. View Latest

¿Cómo puedo mantener el orden causal de extremo a extremo de los eventos de dominio en un recorrido de pago?

Poder determinar el orden causal de los eventos en un sistema distribuido es crucial al construir proyecciones de lado de lectura de una unidad de trabajo basadas en los eventos de dominio de sus flujos constituyentes. El DSL proporciona esta funcionalidad de forma predeterminada intercambiando un EventId cada vez que los flujos se comunican entre sí como parte de un recorrido de pago.

El EventId contiene el Lamport timestamp del flujo en el que fue creado por primera vez (el flujo llamador). Cuando el EventId se pasa a otro flujo (el flujo llamado), este flujo continúa incrementando la marca de tiempo según sea necesario. Al pasar un EventId de un flujo a otro, habilitamos que los eventos de dominio —pertenecientes a diferentes flujos dentro de una única unidad lógica de trabajo— se ordenen en un orden causal, de "ocurrió antes".

Cada Action generado en flo-lang proporciona acceso al EventId actual a través de su método getCurrentEventId, y cada Input.Builder proporciona un withCausedByEventId que puede usarse para pasar el EventId del flujo colaborador:

@Override
public CompletionStage<Void> execute(SampleExternalDomainAction action) {
    var externalDomainDto = convertToExternalDomain(action);
    return AnotherDomain.appropriateDomain().handle(new AppropriateDomainResponseInput
                .Builder(id, AppropriateDomainResponseCodes.OK)
                .withCausedByEventId(action.getCurrentEventId())
                .build());
}

Sin EventIds y sus Lamport timestamps, las proyecciones se verían obligadas a usar marcas de tiempo del reloj del sistema en su lugar. Como los diferentes nodos o procesos típicamente no están perfectamente sincronizados, probablemente se produciría desviación del reloj, resultando en un orden de eventos no secuencial.

Como se mencionó anteriormente, el DSL proporciona esta funcionalidad de forma predeterminada y no se requiere trabajo manual para asegurar el orden causal de extremo a extremo de los eventos de dominio en un recorrido de pago.