当前位置:   article > 正文

消息队列并发消费时保证部分消息的顺序性_消息队列如何保证有序消费

消息队列如何保证有序消费

本文以go语言和nats消息队列为例,探讨多实例部署且每个实例都是多线程消费消息时如何确保部分消息的有序性。

应用场景

队列中会存在对同一条数据(如id一样)的增删改查,如果直接使用多线程消费会存在顺序错乱的可能,或者并发消费的可能性,导致最终状态不一致。

方案探讨

1.使用分布式锁

如果对同一条id的数据进行加redis分布式锁,确实可以保证消息不会并发消费,但是无法保证顺序,如123可能会变为132。

2.发消息时带时间戳

比对此次消费时间戳和上次时间戳,大了就消费,小了就丢弃。这种方法可以先来的后消费,但是会存在丢消息的情况如123变为13,将2丢弃。这种方案如果后一次是全量的操作则不会影响,但是依然不够优雅。

解决方案

1.解决多节点的并发消费问题

要多节点不会并发消费同一个id的消息,核心思路是将同一个id的消息全部发往同一个节点,这里以nats举例,将在topic中包含id字段,nats通过设置可以对topic进行hash运算,从而确定发往哪一个节点,这样同一个id必然会发往同一个节点。

2.解决单节点多线程的并发消费问题

我们的思路依然是通过hash计算,将同一个id固定使用同一个线程消费,这样就不会存在并发问题,在go语言中可以使用20个协程,并发消费20个管道,每个协程只消费自己对应的管道,在接受到消息时根据id字段hash取模后放入对应的管道中即可。

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

闽ICP备14008679号