Pub/Sub āĻŽāĻžāύ⧠āĻā§?
āĻāĻāĻāĻŋ event publish āĻšāϞ⧠multiple independent consumers āϏā§āĻāĻŋ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖ:
- order created -> payment
- order created -> analytics
- order created -> email notification
Fanout Example
err := ch.ExchangeDeclare("orders.broadcast", "fanout", true, false, false, false, nil)
if err != nil {
log.Fatal(err)
}
err = ch.Publish("orders.broadcast", "", false, false, amqp.Publishing{
ContentType: "application/json",
Body: []byte(`{"order_id":77,"status":"created"}`),
})
if err != nil {
log.Fatal(err)
}Command vs Event
| Type | Meaning | Example |
|---|---|---|
| Command | âāĻāĻāĻŋ āĻāϰā§â | send.invoice.email |
| Event | âāĻāĻāĻŋ āĻšā§ā§ āĻā§āĻā§â | invoice.generated |
Architecture Choice
Situation: User signup āĻšāϞ⧠profile service, email service, analytics service, audit log service react āĻāϰāĻŦā§āĨ¤
Goal: Work queue āύāĻž pub/sub?
What to think about:
- āϏāĻŦ consumer event āĻĒāĻžāĻŦā§
- āĻāĻ consumer-āĻāϰ failure āĻ āύā§āϝāĻāĻžāĻā§ block āĻāϰāĻŦā§ āύāĻž
- Future-āĻ āύāϤā§āύ subscriber āϝā§āĻ āĻšāϤ⧠āĻĒāĻžāϰā§
āϏāĻŽā§āĻāĻžāĻŦā§āϝ āϏāĻŽāĻžāϧāĻžāύ āĻĻā§āĻā§āύ
Pub/sub pattern bestāĨ¤ Fanout āĻŦāĻž topic exchange āĻĻāĻŋā§ā§ multiple independent queue bind āĻāϰāĻž āϝāĻžāĻŦā§āĨ¤ Work queue āĻšāϞ⧠event āĻāĻ worker consume āĻāϰā§āĻ āĻļā§āώ āĻšā§ā§ āϝāĻžāĻŦā§, āϝāĻž āĻā§āϞ behaviourāĨ¤
Checkpoint
āύāĻŋāĻā§ āĻā§āĻŦā§ āĻĻā§āĻā§: same payload payment āĻāϰ analytics service āĻāĻŋāύā§āύāĻāĻžāĻŦā§ consume āĻāϰāϞ⧠producer-āĻāϰ āĻāĻŋāĻā§ āĻŦāĻĻāϞāĻžāύ⧠āϞāĻžāĻāĻž āĻāĻāĻŋāϤ āĻāĻŋ?
- āύāĻž, ideally āύāĻž
- consumer-specific logic producer-āĻ leak āĻšāĻā§āĻž āĻāĻāĻŋāϤ āύāĻž
- āĻāĻāĻžāĻ loose coupling-āĻāϰ value