在一些证券和购票的场景中,按照交易逻辑,谁先出价谁先交易的原则,针对相同的报价单,使用MQ处理订单时,就需要严格按照出价顺序处理订单,也就要保证消息的顺序性。
RocketMQ本身是支持顺序消息的,但其实也是有一定限制的:

官方文档中提到,顺序消息的是利用队列先进先出的特性,通过消息组实现的,也就是说只有在相同消息组中,才能够实现消息的顺序性。
生产顺序性
RocketMQ通过生产者和服务端协议保障每个生产者串行发送消息,并按顺序存储和持久化,如需保证消息生产的顺序性,则必须满足以下条件:
-
单一生产者:消息生产的顺序性仅支持单一生产者,不同的生产者分布在不同的系统,即使设置相同的消息组,不同生产者之间产生的消息也无法判断其生产的先后顺序。
-
串行发送:如果生产者使用多线程并行发送,不同线程之间的消息顺序是没有办法保证先后的。因此,需要保证消息被串行发送。
消费顺序性
在保证生产顺序性后,消息在消息组中就是顺序存储的了,此时我们只需要将消息顺序取出消费就可以了,这里需要注意的是:
-
串行消费:如果是并行消费,可能会因为网络延迟导致后取出的消息比先取出的消息先消费完,同样无法保证消息的顺序性,而串行消费能够确保只有当前一个消息被消费完,才会去消费下一个消息。
-
有限重试:RocketMQ顺序消息的投递失败的重试是有次数限制的,当超过最大重试次数后,会跳过这条消息,不阻塞后续消息的处理,因此需要设置合理的重试次数,避免参数不合理导致消费乱序。
总结
-
RocketMQ中,单个消费组中的消息是有序的,因此,实现消息顺序的前提是要将消息顺序投递到同一个消费组中。比如,自定义一个路由算法,确保同一个商品的订单能被路由到同一个消息组中。
-
单一生产者串行发送消息,确保消息被顺序发送。同一个商品的订单消息由同一个生产者发送。
-
消费者串行消费,避免并行消费导致消息被乱序消费。
-
合理设置重试次数,避免跳过部分消息导致消费乱序。
794

被折叠的 条评论
为什么被折叠?



