{Eventos}

Lo que pasó, pasó

Eventos de dominio

Hecho relevante

Suceso acontecido dentro

de nuestro sistema, que ha producido una mutación del estado de nuestra aplicación.

1.

2.

Negocio

Los eventos hablan el lenguaje de negocio y se originan en el dominio (casos de uso).

3.

Inmutables

Al ser hechos ya ocurridos, éstos no se pueden a modificar.

¿Qué son?

¿Qué problemas resuelven?

SOLID

- Reduce el acoplamiento.

- Aumenta la mantenibilidad y extensión.

1.

2.

Resiliencia

Mayor robustez ante los fallos y mejor capacidad para reponernos de ellos.

3.

Escalabilidad

Capacidad para distribuir la carga entre diferentes instancias de manera asíncrona.

4.

Trazabilidad

Mejora la visualización de los casos de uso y sus efectos colaterales. 

¿Cuando?

1. Diferentes verticales de negocio relacionadas.

2. Falta de independencia entre los equipos

3. Falta de auditoría en los flujos

Cuidado

Consistencia eventual

Eventos desordenados

Eventos duplicados

Exchange

Intercambiador de mensajes basado en diferentes estrategias de enrutado

Multicast

Fanout

Regex

Topic

P2P

Direct

  • Genera el evento
  • Lo publica en el exchange con una routing key
  • Testeable unitariamente

Producer

Queues

Es el destino de nuestros eventos.

Se suscriben mediante una binding key.

  • Se vinculan a las colas
  • Reciben los mensajes y los procesan
  • Devuelven ACK/nACK

Consumers

  • DTO
  • Payload
  • Id único
  • Metadatos
  • Serializables
  • Versionados
  • Atómicos

Messages

Show me this magic

export const domainEvents = {
  vehicle: {
    activated: 'bipi.event.vehicle.activated',
    deactivated: 'bipi.event.vehicle.deactivated',
  },
}
# PRESENTING CODE

Convención de nombres

<context>.event.<module>.<event_name>

El nombre de los eventos siempre en pasado

Eventos

Queues / consumers

@registerEventSubscriber()
export class VehicleNotifyOnVehicleDeactivated extends EventSubscriber<VehicleTypes.Vehicle> {
  constructor () {
    super({
      route: domainEvents.vehicle.deactivated,
      queue: 'notify_slack_on_vehicle_deactivated',
    })
  }

  protected async _handle (event: DomainEventDefinition<VehicleTypes.Vehicle>): Promise<void> {
    const updatedVehicle = event.payload
    Slacker.vehicleActivationStatusChanged(updatedVehicle, updatedVehicle.city, event.author).catch(err => {
      Utils.captureException(err)
    })
  }
}

El nombre de las colas/consumers siempre en presente

Convención de nombres en

Available on

Eventos parte 1

By Daniel Cañada García