广东专业商城网站建设,如何做英文系统下载网站,网站的毕业设计怎么做,wordpress3d标签顺序消息为 Apache RocketMQ 中的高级特性消息#xff0c;本文为您介绍顺序消息的应用场景、功能原理、使用限制、使用方法和使用建议。
应用场景
在有序事件处理、撮合交易、数据实时增量同步等场景下#xff0c;异构系统间需要维持强一致的状态同步#xff0c;上游的事…顺序消息为 Apache RocketMQ 中的高级特性消息本文为您介绍顺序消息的应用场景、功能原理、使用限制、使用方法和使用建议。
应用场景
在有序事件处理、撮合交易、数据实时增量同步等场景下异构系统间需要维持强一致的状态同步上游的事件变更需要按照顺序传递到下游进行处理。在这类场景下使用 Apache RocketMQ 的顺序消息可以有效保证数据传输的顺序性。 功能原理
什么是顺序消息
顺序消息是 Apache RocketMQ 提供的一种高级消息类型支持消费者按照发送消息的先后顺序获取消息从而实现业务场景中的顺序处理。 相比其他类型消息顺序消息在发送、存储和投递的处理过程中更多强调多条消息间的先后顺序关系。
Apache RocketMQ 顺序消息的顺序关系通过消息组MessageGroup判定和识别发送顺序消息时需要为每条消息设置归属的消息组相同消息组的多条消息之间遵循先进先出的顺序关系不同消息组、无消息组的消息之间不涉及顺序性。
基于消息组的顺序判定逻辑支持按照业务逻辑做细粒度拆分可以在满足业务局部顺序的前提下提高系统的并行度和吞吐能力。
如何保证消息的顺序性
Apache RocketMQ 的消息的顺序性分为两部分生产顺序性和消费顺序性。 生产顺序性 Apache RocketMQ 通过生产者和服务端的协议保障单个生产者串行地发送消息并按序存储和持久化。 如需保证消息生产的顺序性则必须满足以下条件 单一生产者消息生产的顺序性仅支持单一生产者不同生产者分布在不同的系统即使设置相同的消息组不同生产者之间产生的消息也无法判定其先后顺序。 串行发送Apache RocketMQ 生产者客户端支持多线程安全访问但如果生产者使用多线程并行发送则不同线程间产生的消息将无法判定其先后顺序。 满足以上条件的生产者将顺序消息发送至 Apache RocketMQ 后会保证设置了同一消息组的消息按照发送顺序存储在同一队列中。服务端顺序存储逻辑如下 相同消息组的消息按照先后顺序被存储在同一个队列。 不同消息组的消息可以混合在同一个队列中且不保证连续。 如上图所示消息组1和消息组4的消息混合存储在队列1中 Apache RocketMQ 保证消息组1中的消息G1-M1、G1-M2、G1-M3是按发送顺序存储且消息组4的消息G4-M1、G4-M2也是按顺序存储但消息组1和消息组4中的消息不涉及顺序关系。 消费顺序性 Apache RocketMQ 通过消费者和服务端的协议保障消息消费严格按照存储的先后顺序来处理。 如需保证消息消费的顺序性则必须满足以下条件 投递顺序 Apache RocketMQ 通过客户端SDK和服务端通信协议保障消息按照服务端存储顺序投递但业务方消费消息时需要严格按照接收---处理---应答的语义处理消息避免因异步处理导致消息乱序。 备注 消费者类型为PushConsumer时 Apache RocketMQ 保证消息按照存储顺序一条一条投递给消费者若消费者类型为SimpleConsumer则消费者有可能一次拉取多条消息。此时消息消费的顺序性需要由业务方自行保证。消费者类型的具体信息请参见消费者分类。 有限重试 Apache RocketMQ 顺序消息投递仅在重试次数限定范围内即一条消息如果一直重试失败超过最大重试次数后将不再重试跳过这条消息消费不会一直阻塞后续消息处理。 对于需要严格保证消费顺序的场景请务设置合理的重试次数避免参数不合理导致消息乱序。 生产顺序性和消费顺序性组合
如果消息需要严格按照先进先出FIFO的原则处理即先发送的先消费、后发送的后消费则必须要同时满足生产顺序性和消费顺序性。
一般业务场景下同一个生产者可能对接多个下游消费者不一定所有的消费者业务都需要顺序消费您可以将生产顺序性和消费顺序性进行差异化组合应用于不同的业务场景。例如发送顺序消息但使用非顺序的并发消费方式来提高吞吐能力。更多组合方式如下表所示 使用限制
顺序消息仅支持使用MessageType为FIFO的主题即顺序消息只能发送至类型为顺序消息的主题中发送的消息的类型必须和主题的类型一致。
使用示例
创建主题
Apache RocketMQ 5.0版本下创建主题操作推荐使用mqadmin工具需要注意的是对于消息类型需要通过属性参数添加。示例如下
sh mqadmin updateTopic -n nameserver_address -t topic_name -c cluster_name -a message.typeFIFO
发送消息
和普通消息发送相比顺序消息发送必须要设置消息组。消息组的粒度建议按照业务场景尽可能细粒度设计以便实现业务拆分和并发扩展。
创建FIFO主题
./bin/mqadmin updateTopic -c DefaultCluster -t FIFOTopic -o true -n 127.0.0.1:9876
-c 集群名称-t Topic名称-n nameserver地址-o 创建顺序消息
以Java语言为例收发顺序消息的示例代码如下
使用建议
串行消费避免批量消费导致乱序
消息消费建议串行处理避免一次消费多条消费否则可能出现乱序情况。
例如发送顺序为1-2-3-4消费时批量消费消费顺序为1-23批量处理失败-23重试处理-4此时可能由于消息3的失败导致消息2被重复处理最后导致消息消费乱序。
消息组尽可能打散避免集中导致热点
Apache RocketMQ 保证相同消息组的消息存储在同一个队列中如果不同业务场景的消息都集中在少量或一个消息组中则这些消息存储压力都会集中到服务端的少量队列或一个队列中。容易导致性能热点且不利于扩展。一般建议的消息组设计会采用订单ID、用户ID作为顺序参考即同一个终端用户的消息保证顺序不同用户的消息无需保证顺序。
因此建议将业务以消息组粒度进行拆分例如将订单ID、用户ID作为消息组关键字可实现同一终端用户的消息按照顺序处理不同用户的消息无需保证顺序。