请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

在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的吗?怎么知道的?

正在回答 回答被采纳积分+3

1回答

Moody 2021-03-18 09:23:45

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

0 回复 有任何疑惑可以回复我~
  • 提问者 慕沐3053333 #1
    1、3个orderservice微服务实例是生产者,restaurantService微服务是消费者,生产者和消费者的channel肯定不是同一个channel的是吧?
    2、而且这里问题不是发送端确认机制的问题,怎么还分异步和同步的?是误解我的意思了还是我的理解问题?
    回复 有任何疑惑可以回复我~ 2021-03-18 21:17:37
  • Moody 回复 提问者 慕沐3053333 #2
    哦,我明白你的意思了,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 09:54:45
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信