【消息队列】5-如何保证消息的顺序性?

avatar 2020年11月20日11:38:16 6 3505 views
博主分享免费Java教学视频,B站账号:Java刘哥

一、场景介绍

1、消息严格有序场景

比如客户开车出事故了需要保险公司来处理,至少要有以下几个步骤: 报案、查勘定损、立案、收单理算支付、结案等环节,这些环节是严格有序的。保险公司每完成一个环节,需要给中保信(监管保险公司的)推送数据,如果推送顺序有问题,会返回错误,比如上一个环节还没有完成。

同样电商行业也是如此,下单、支付、发货都是有序的。

2、消息无序场景

当然也有一些场景是无序的,比如给同一个案件下给客户推送一条信息,给理赔员推送一条消息,这两个没有先后关系。

再比如给客户发送短信,微信,邮件和语音电话,这些消息推送先后也没有要求顺序。

我们今天只说一下如何保证有序吧。

二、如何保证消息有序

假设这里有一个 Topic (8个队列),4个消费者(因为我的消费者项目有4台机器),然后每个消费者可以平均分到2个队列,这就使得每个队列对应一个消费者。

生产者往这个 Topic 里发3条消息,如果不指定发送到哪个队列,默认是会随机发的,然后很可能3条消息被多个不同消费者消费了。而不同队列当然堆积的消息不尽相同,有的堆积很多,有的堆积很少,堆积多的往往要等一段时间才能被执行,就可能会出现第1条消息最后被执行,那就尴尬了。

所以,解决这个问题很简单,把消息放到同一个队列就行,比如根据案件号或者订单号求模来指定放到哪个队列,像RokcetMQ可以根据key来决定,同一个案件号的消息的key都用案件号,RocketMQ根据 key 的哈希值定位存储到哪个队列。

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0