当前位置:   article > 正文

RabbitMQ(十)顺序消费_rabbitmq 顺序消费

rabbitmq 顺序消费

一,前言

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

二,解决方式

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

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

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

具体步骤:

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

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

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

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

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

2022.08.24  更新

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/705624
推荐阅读
相关标签
  

闽ICP备14008679号