Skip to Content
Go Realm v1 is released 🎉
RabbitMQDay 3: Message Lifecycle and Ack

Day 3

Message Lifecycle: Publish, Deliver, Ack, Nack, Requeue

āφāϜāϕ⧇āϰ āĻĢā§‹āĻ•āĻžāϏ āĻšāϞ⧋ message success āφāϰ failure pathāĨ¤ RabbitMQ āĻļ⧇āĻ–āĻžāϰ āϏāĻŦāĻšā§‡ā§Ÿā§‡ critical āϜāĻžā§ŸāĻ—āĻžāϗ⧁āϞ⧋āϰ āĻāĻ•āϟāĻŋ āĻšāĻšā§āϛ⧇ acknowledgement behaviorāĨ¤

Message Lifecycle

Ack Strategy Table

SituationRecommended Actionāϕ⧇āύ
SuccessAckmessage safe āĻ­āĻžāĻŦ⧇ complete
Temporary DB timeoutNack(requeue=true) āĻŦāĻž retry queueāĻĒāϰ⧇ āφāĻŦāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻž āϝāĻžāĻŦ⧇
Invalid payloadNack(requeue=false) + DLQendless retry useless
Consumer crash before ackRabbitMQ redelivery āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇reliability āĻŦāĻžā§œā§‡
Successful vs failed processing
Publish

Producer message publish āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϏ⧇āϟāĻž queue-āϤ⧇ stored āĻŦāĻž routed āĻšā§ŸāĨ¤

msgs, err := ch.Consume("orders.queue", "", false, false, false, false, nil) if err != nil { log.Fatal(err) } for msg := range msgs { if err := process(msg.Body); err != nil { _ = msg.Nack(false, true) continue } if err := msg.Ack(false); err != nil { log.Printf("ack failed: %v", err) } }
Auto Ack āϕ⧇āύ production-āĻ risky?

Checkpoint

āύāĻŋāĻœā§‡ āĻāχ āĻĒā§āϰāĻļā§āύ⧇āϰ āωāĻ¤ā§āϤāϰ āĻĻāĻžāĻ“: 'ack āĻŽāĻžāύ⧇ success signal, retry policy āύāĻž' — āϕ⧇āύ?

  • Ack āĻļ⧁āϧ⧁ current message fate finalize āĻ•āϰ⧇
  • Retry strategy application āĻŦāĻž topology design-āĻāϰ āĻ…āĻ‚āĻļ
  • Ack/Nack decision business error type-āĻāϰ āĻ“āĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰāĻļā§€āϞ