对消息Ack时,关于deliveryTag唯一性的疑问

来源:8-9 消息消费失败重试流程分析

慕沐3053333

2021-03-17

在4-3节课中,老师说过这么一段话:

deliveryTag和channel相关,而且不是全局唯一的,如果起了多个横向扩展的orderservice,多个同时发送的消息之中,deliveryTag是很可能重复的。
假如两个线程并发调用com.imooc.food.orderservicemanager.service.OrderService#createOrder方法,deliveryTag是我这个channel发送的第几条消息,那如果我同时有两个业务线程在跑的话,也就是调用createOrder方法,该方法内connection.createChannel(),channel是不一样的,那么deliveryTag是有可能重复的。

假设现在有3个orderservice微服务实例,同时有3个请求分别到达,按您说的会有deliveryTag重复。那么在(restaurant微服务的)AbstractMessageListener通过deliveryTag去对消息进行ACK,此时队列知道哪个消息是需要被ACK的吗?怎么知道的?

写回答

1回答

Moody

2021-03-18

此时应该是知道的,因为用的同一个channel对象,这样就不会有并发问题。如果是异步执行,不是同一个channel对象,可能就有问题了。

0
2
Moody
回复
慕沐3053333
哦,我明白你的意思了,delivery tag并不是消息的固有属性,是和channel有关的。消费者收到消息时,delivery tag已经变成消费者channel的最新值了,不会保持发送方的delivery tag。 假设3个发送方发了3个消息,tag都是1。那么消费者收到的tag就会是1,2,3。确认时也是按照1 2 3的tag进行确认,rabbit也是知道确认的是哪个消息,因为rabbit内部也是知道每个channel的tag状态。 这是个很好的问题,更详细的说明可以看这个: https://www.rabbitmq.com/confirms.html#consumer-acks-delivery-tags
2021-03-19
共2条回复

RabbitMQ精讲,提升工程实践能力,培养架构思维

消息驱动架构+订单状态机,二次开发,手写分布式事务框架。

470 学习 · 205 问题

查看课程