confirm机制和ack机制如何使用可见文章golang如何使用RabbitMQ
1. 消息投递
生产者向MQ发送消息,确保MQ接收到消息。RabbitMQ提供了两种方式来保证消息投递的可靠性
- confirm 确认模式
producer -> exchange
- return 退回模式
exchange -> queue
1.1 confirm
生产者向MQ发送消息,MQ成功接收到消息后,会向生产者发送确认,我们可以监听对应channel来处理相应情况
err = mq.Channel.Confirm(false)
if err != nil {
log.Fatalln(err)
}
confirm := mq.Channel.NotifyPublish(make(chan amqp.Confirmation))
for {
select {
case c, ok := <-confirm:
// TO DO ...
}
}
1.2 return
MQ中exchange -> queue
交换机路由到队列,开启退回模式后,如果路由失败,可以回退消息
rChan := mq.Channel.NotifyReturn(make(chan amqp.Return))
for {
select {
case r, ok := <-rChan:
// TO DO ...
}
}
2. 消息确认
MQ发送消息到消费者,可以通过消息确认机制来确保消费者成功消费消息
msgChan, err := mq.Channel.Consume(
mq.QueueName, // 队列名
"", // 消费者名,用来区分多个消费者,以实现公平分发或均等分发策略
false, // 是否自动应答,false表示手动应答
false, // 是否排他
false, // 是否接收只同一个连接中的消息,若为true,则只能接收一个conn中发送的消息
false, // 队列消费是否阻塞
nil, // 额外属性
)
if err != nil {
log.Println("获取消息失败", err)
return
}
for msg := range msgChan {
msg.Ack(false) // 手动应答
}