RabbitMQ 消息重复 和 消息顺序消费

RabbitMQ 消息重复 和 消息顺序消费

 1.【消息重复】:要不保证消息幂等性,要不就用map记录任务状态.

首先我们可以确认的是,触发消息重复执行的条件会是很苛刻的! 也就说 在大多数场景下不会触发该条件!!! 一般出在任务超时,或者没有及时返回状态,引起任务重新入队列,重新消费!  在rabbtimq里连接的断开也会触发消息重新入队列。  

消费任务类型最好要支持幂等性,这样的好处是 任务执行多少次都没关系,顶多消耗一些性能! 如果不支持幂等,比如发送信息? 那么需要构建一个map来记录任务的执行情况! 不仅仅是成功和失败,还要有心跳!!!  这个map在消费端实现就可以了!!!    这里会出现一个问题,有两个消费者 c1, c2 ,一个任务有可能被c1消费,如果再来一次,被c2执行? 那么如何得知任务的情况? 任务派发!  任务做成hash,固定消费者!

坚决不要想方设法在mq扩展这个future。

一句话,要不保证消息幂等性,要不就用map记录任务状态.

2.【消息顺序消费】 :主动去分配队列,单个消费者

我们遇到的大多数场景都不需要消息的有序的,如果对于消息顺序敏感,那么我们这里给出的方法是 消息体通过hash分派到队列里,每个队列对应一个消费者,多分拆队列。

为什么要这么设计?  同一组的任务会被分配到同一个队列里,每个队列只能有一个worker来消费,这样避免了同一个队列多个消费者消费时,乱序的可能! t1, t2 两个任务, t1 虽然被c1先pop了,但是有可能c2先把 t2 任务给完成了。

一句话,主动去分配队列,单个消费者。

3.【参考文献】:解决rabbitmq消息队列的顺序及重复消费问题 

 

你可能感兴趣的:(RabbitMQ)