confirm机制和ack机制如何使用可见文章golang如何使用RabbitMQ

1. 消息投递

生产者向MQ发送消息,确保MQ接收到消息。RabbitMQ提供了两种方式来保证消息投递的可靠性

  • confirm 确认模式 producer -> exchange
  • return 退回模式 exchange -> queue

1.1 confirm

生产者向MQ发送消息,MQ成功接收到消息后,会向生产者发送确认,我们可以监听对应channel来处理相应情况

  1. err = mq.Channel.Confirm(false)
  2. if err != nil {
  3. log.Fatalln(err)
  4. }
  5. confirm := mq.Channel.NotifyPublish(make(chan amqp.Confirmation))
  6. for {
  7. select {
  8. case c, ok := <-confirm:
  9. // TO DO ...
  10. }
  11. }

1.2 return

MQ中exchange -> queue交换机路由到队列,开启退回模式后,如果路由失败,可以回退消息

  1. rChan := mq.Channel.NotifyReturn(make(chan amqp.Return))
  2. for {
  3. select {
  4. case r, ok := <-rChan:
  5. // TO DO ...
  6. }
  7. }

2. 消息确认

MQ发送消息到消费者,可以通过消息确认机制来确保消费者成功消费消息

  1. msgChan, err := mq.Channel.Consume(
  2. mq.QueueName, // 队列名
  3. "", // 消费者名,用来区分多个消费者,以实现公平分发或均等分发策略
  4. false, // 是否自动应答,false表示手动应答
  5. false, // 是否排他
  6. false, // 是否接收只同一个连接中的消息,若为true,则只能接收一个conn中发送的消息
  7. false, // 队列消费是否阻塞
  8. nil, // 额外属性
  9. )
  10. if err != nil {
  11. log.Println("获取消息失败", err)
  12. return
  13. }
  14. for msg := range msgChan {
  15. msg.Ack(false) // 手动应答
  16. }