对消息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对象,可能就有问题了。
022021-03-19
相似问题