Skip to Content
Go Realm v1 is released 🎉
RabbitMQDay 10: Mini Project

Day 10

Mini Project: Order Event Pipeline with Go and RabbitMQ

āφāϜāϕ⧇ āĻĒ⧁āϰ⧋ āĻŸā§āĻ°ā§āϝāĻžāϕ⧇āϰ concepts āĻāĻ•āĻ¤ā§āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦāĨ¤ goal āĻšāϞ⧋ āĻāĻ•āϟāĻŋ āϛ⧋āϟ āĻ•āĻŋāĻ¨ā§āϤ⧁ realistic event pipeline āĻ•āĻ˛ā§āĻĒāύāĻž āĻ“ structure āĻ•āϰāĻžāĨ¤

Mini Project Architecture

Suggested Topology

ComponentDesign
Exchangeorders.topic
Routing keyorder.created
Queuespayment.q, inventory.q, notification.q, orders.dlq
Retryoptional 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 āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧇āĨ¤

Next steps after this course

Checkpoint

āĻāχ ā§§ā§Ļ āĻĻāĻŋāύ⧇āϰ āĻļ⧇āώ⧇ āϤ⧁āĻŽāĻŋ āĻ•āĻŋ āĻāχ āĻĒā§āϰāĻļā§āύ⧇āϰ āωāĻ¤ā§āϤāϰ confidently āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧋: 'āϕ⧋āύ use case-āĻ work queue, āϕ⧋āύ use case-āĻ pub/sub, āφāϰ āϕ⧋āĻĨāĻžā§Ÿ DLQ āϞāĻžāĻ—āĻŦ⧇?'

  • āϝāĻĻāĻŋ āĻšā§āϝāĻžāρ, āϤāĻžāĻšāϞ⧇ foundation strong
  • āϝāĻĻāĻŋ āύāĻž, Day 4, 6, 8 āφāĻŦāĻžāϰ āĻĒā§œā§‹
  • āύāĻŋāĻœā§‡ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ use case āύāĻŋā§Ÿā§‡ topology design āĻ•āϰ⧇ āĻĻ⧇āĻ–ā§‹