RabbitMQ(十)顺序消费

一,前言

对于一些业务来说,需要确保消息被消费时候的顺序性。例如,有前后关系的查询-新增-删除这么三个消息,消费者必须按照这个顺序来消费,如果乱序就会出现结果不符合预期。

二,解决方式

前提是:必须要使用   生产者-队列-消费者    这种单消费者模式,为的就是防止消费者争抢消息导致顺序不一样。

1,使用多队列的模式,例如我上边的那个例子,把它分发给三个队列,一个查询队列,一个新增队列,一个删除队列,每个队列对应一个消费者,这样子就可以保证顺序性。

2.使用分组的思想。也是我上边那个例子,把查询-新增-删除操作,看成一个分组。

具体步骤:

第一步,在发送消息的时候,查询该消息在同分组中的上一个消息id,如果是第一个消息,则查询结果为空。在上述例子中,新增的上一个消息是查询,在发送新增消息的时候,需要带上查询消息的id

第二部,消费者接收到消息之后,尝试获取 同分组内上一个消息的消息id

如果不能获取,则当普通消息处理(因为这个是第一个消息,他没有上一个消息,顺序没问题,直接处理即可)

如果能够获取,则查询消息的消费记录,看看是否消费过这个消息。如果消费过了,则继续处理逻辑。没有消费过,则让消息回到队列,等待下次消费(上一个消息没有消费过,也就是说这个时候顺序乱了,先不消费消息,把消息放回队列等待下一次消费)

========================================================================

2022.08.24  更新

最近发现,其实这些顺序操作都是有问题的。就算是分成了多个队列,对应多个消费者,这个时候,也会有因为网络波动或者RabbitMq消息丢失导致重发,最后都会导致消息到达的顺序不一样。

然后我查了一下资料,现在比较多的解决方法是两种

①一个 queue 对应一个 consumer,然后这个 consumer 内部用内存队列做排队,然后分发给底层不同的 worker 来处理。这种做法就是在consumer那里再做一层逻辑处理,按照新增-查询-删除的一组消息为一个单位。
②通过一个顺序id来分组实现 。大概的思路就是,消息体里边带上这个消息的顺序,然后消费者在消费的时候按照消息体里的顺序id去消费。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值