Suggested Topology
| Component | Design |
|---|---|
| Exchange | orders.topic |
| Routing key | order.created |
| Queues | payment.q, inventory.q, notification.q, orders.dlq |
| Retry | optional orders.retry |
type OrderCreated struct {
OrderID string `json:"order_id"`
UserID string `json:"user_id"`
Amount int64 `json:"amount"`
OccurredAt time.Time `json:"occurred_at"`
EventID string `json:"event_id"`
}
func publishOrderCreated(ch *amqp.Channel, evt OrderCreated) error {
body, err := json.Marshal(evt)
if err != nil {
return err
}
return ch.Publish("orders.topic", "order.created", false, false, amqp.Publishing{
ContentType: "application/json",
DeliveryMode: amqp.Persistent,
Body: body,
Timestamp: time.Now(),
MessageId: evt.EventID,
})
}for msg := range msgs {
if alreadyProcessed(msg.MessageId) {
_ = msg.Ack(false)
continue
}
if err := handleOrderCreated(msg.Body); err != nil {
if isTemporary(err) {
_ = msg.Nack(false, true)
} else {
_ = msg.Nack(false, false)
}
continue
}
markProcessed(msg.MessageId)
_ = msg.Ack(false)
}Final Design Check
Situation: Notification consumer fail āĻāϰāϞā§āĻ payment āĻāϰ inventory success āĻšāϤ⧠āĻšāĻŦā§āĨ¤
Goal: āĻāĻāĻāĻŋ topology decision justify āĻāϰāĻžāĨ¤
What to think about:
- same event multiple independent services āĻĒāĻžāĻŦā§
- one failure āĻ āύā§āϝāĻā§ block āĻāϰāĻŦā§ āύāĻž
- consumer-specific retry policy āĻāϞāĻžāĻĻāĻž āĻšāϤ⧠āĻĒāĻžāϰā§
āϏāĻŽā§āĻāĻžāĻŦā§āϝ āϏāĻŽāĻžāϧāĻžāύ āĻĻā§āĻā§āύ
āĻĒā§āϰāϤāĻŋāĻāĻŋ service-āĻāϰ own queue āĻĨāĻžāĻāĻž āĻāĻāĻŋāϤāĨ¤ Shared queue āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϞ⧠first consumer message āύāĻŋā§ā§ āύāĻŋāϞ⧠āĻ āύā§āϝāϰāĻž message āĻĒāĻžāĻŦā§ āύāĻžāĨ¤ Separate queue per service true fanout/event-driven behaviour āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰā§āĨ¤
Checkpoint
āĻāĻ ā§§ā§Ļ āĻĻāĻŋāύā§āϰ āĻļā§āώ⧠āϤā§āĻŽāĻŋ āĻāĻŋ āĻāĻ āĻĒā§āϰāĻļā§āύā§āϰ āĻāϤā§āϤāϰ confidently āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§: 'āĻā§āύ use case-āĻ work queue, āĻā§āύ use case-āĻ pub/sub, āĻāϰ āĻā§āĻĨāĻžā§ DLQ āϞāĻžāĻāĻŦā§?'
- āϝāĻĻāĻŋ āĻšā§āϝāĻžāĻ, āϤāĻžāĻšāϞ⧠foundation strong
- āϝāĻĻāĻŋ āύāĻž, Day 4, 6, 8 āĻāĻŦāĻžāϰ āĻĒā§ā§
- āύāĻŋāĻā§ āĻāĻāĻāĻŋ āύāϤā§āύ use case āύāĻŋā§ā§ topology design āĻāϰ⧠āĻĻā§āĻā§