一、场景介绍
1、消息严格有序场景
比如客户开车出事故了需要保险公司来处理,至少要有以下几个步骤: 报案、查勘定损、立案、收单理算支付、结案等环节,这些环节是严格有序的。保险公司每完成一个环节,需要给中保信(监管保险公司的)推送数据,如果推送顺序有问题,会返回错误,比如上一个环节还没有完成。
同样电商行业也是如此,下单、支付、发货都是有序的。
2、消息无序场景
当然也有一些场景是无序的,比如给同一个案件下给客户推送一条信息,给理赔员推送一条消息,这两个没有先后关系。
再比如给客户发送短信,微信,邮件和语音电话,这些消息推送先后也没有要求顺序。
我们今天只说一下如何保证有序吧。
二、如何保证消息有序
假设这里有一个 Topic (8个队列),4个消费者(因为我的消费者项目有4台机器),然后每个消费者可以平均分到2个队列,这就使得每个队列对应一个消费者。
生产者往这个 Topic 里发3条消息,如果不指定发送到哪个队列,默认是会随机发的,然后很可能3条消息被多个不同消费者消费了。而不同队列当然堆积的消息不尽相同,有的堆积很多,有的堆积很少,堆积多的往往要等一段时间才能被执行,就可能会出现第1条消息最后被执行,那就尴尬了。
所以,解决这个问题很简单,把消息放到同一个队列就行,比如根据案件号或者订单号求模来指定放到哪个队列,像RokcetMQ可以根据key来决定,同一个案件号的消息的key都用案件号,RocketMQ根据 key 的哈希值定位存储到哪个队列。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏