{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
Eventos parte 1
- 81