RocketMQ简介
Apache RocketMQ 是一个开源的分布式消息中间件,最初由阿里巴巴开发,并于 2016 年捐赠给 Apache 软件基金会。RocketMQ 以其高性能、低延迟和高可靠性在业界广泛使用,尤其是在金融和电子商务领域。
核心特性
- 高性能和低延迟:
- RocketMQ 设计为高吞吐量和低延迟的消息系统,适合处理大规模并发消息。
- 支持顺序消息和延迟消息的高效传递。
- 分布式架构:
- 采用分布式架构,具有高可用性和可扩展性。
- 支持水平扩展,可以通过增加 Broker 节点来提升性能和容量。
- 可靠性和一致性:
- 提供消息的多副本存储,确保数据的可靠性和持久性。
- 支持事务消息,保证消息的一致性和完整性。
- 灵活的消息模型:
- 支持多种消息模型,包括发布-订阅和点对点。
- 提供丰富的消息过滤和路由功能,支持按属性过滤消息。
- 易于管理和监控:
- 提供友好的管理工具和监控系统,支持集群的管理和运行状态的实时监控。
- 支持 Web 界面管理,便于操作和维护。
- 多语言支持:
- 提供多种编程语言的客户端,包括 Java、C++、Python 等,方便不同语言的应用集成。
- 强大的社区支持:
- 作为 Apache 顶级项目,RocketMQ 拥有活跃的社区和广泛的用户基础,提供持续的更新和支持。
应用场景
- 金融交易系统:RocketMQ 的高可靠性和事务支持使其非常适合用于金融交易系统,确保交易数据的准确性和一致性。
- 电商平台:在电商场景中,RocketMQ 用于订单处理、库存管理和用户通知等,支持高并发的请求处理。
- 日志聚合和处理:可以用作日志数据的聚合和处理平台,支持实时数据分析和监控。
- 微服务架构:在微服务架构中,RocketMQ 作为异步通信的中间件,支持服务之间的解耦和扩展。
优势
- 高吞吐量和低延迟:适合处理海量数据和高并发请求。
- 高可靠性和一致性:通过多副本和事务支持,保证数据的可靠传递。
- 灵活的部署和管理:支持多种部署模式,提供便捷的管理和监控工具。
RocketMQ的架构
RocketMQ工作流程
整体架构中包含四种角色
- NameServer:名字服务是是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。它是一个非常简单的 Topic 路由注册中心,其角色类似 Dubbo 中的 zookeeper ,支持 Broker 的动态注册与发现。
- BrokerServer:Broker主要负责消息的存储、投递和查询以及服务高可用保证 。
- Producer:消息发布的角色,Producer 通过 MQ 的负载均衡模块选择相应的 Broker 集群队列进行消息投递,投递的过程支持快速失败并且低延迟。
- Consumer:消息消费的角色,支持以 push 推,pull 拉两种模式对消息进行消费。
RocketMQ 集群工作流程:
- 启动 NameServer,NameServer 起来后监听端口,等待 Broker、Producer 、Consumer 连上来,相当于一个路由控制中心。
- Broker 启动,跟所有的 NameServer 保持长连接,定时发送心跳包。心跳包中包含当前 Broker信息( IP+端口等 )以及存储所有 Topic 信息。注册成功后,NameServer 集群中就有 Topic 跟 Broker 的映射关系。
- 收发消息前,先创建 Topic,创建 Topic 时需要指定该 Topic 要存储在哪些 Broker 上,也可以在发送消息时自动创建 Topic。
- Producer 发送消息,启动时先跟 NameServer 集群中的其中一台建立长连接,并从 NameServer 中获取当前发送的 Topic 存在哪些 Broker 上,轮询从队列列表中选择一个队列,然后与队列所在的 Broker 建立长连接从而向 Broker 发消息。
- Consumer 跟 Producer 类似,跟其中一台 NameServer 建立长连接,获取当前订阅 Topic 存在哪些 Broker 上,然后直接跟 Broker 建立连接通道,开始消费消息。
发布订阅
RocketMQ 的传输模型是:发布订阅模型 。发布订阅模型具有如下特点:
- 消费独立相比队列模型的匿名消费方式,发布订阅模型中消费方都会具备的身份,一般叫做订阅组(订阅关系),不同订阅组之间相互独立不会相互影响。
- 一对多通信基于独立身份的设计,同一个主题内的消息可以被多个订阅组处理,每个订阅组都可以拿到全量消息。因此发布订阅模型可以实现一对多通信。
RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )。
集群消费
同一 Topic 下的一条消息只会被同一消费组中的一个消费者消费。也就是说,消息被负载均衡到了同一个消费组的多个消费者实例上。
广播消费
当使用广播消费模式时,每条消息推送给集群内所有的消费者,保证消息至少被每个消费者消费一次。
RocketMQ的适合场景
下面是 RocketMQ、Kafka 和 Pulsar 的特点及适用场景的对比表格:
特性/场景 | RocketMQ | Kafka | Pulsar |
高吞吐量 | 高性能和低延迟,适合高吞吐量场景。 | 设计用于高吞吐量的实时数据流处理。 | 通过分区和分片实现高吞吐量,适合大规模数据处理。 |
消息顺序 | 原生支持顺序消息消费。 | 通过分区保证分区内消息顺序,但不保证全局顺序。 | 支持分区顺序,提供灵活的顺序消费选项。 |
事务消息 | 支持分布式事务消息,适合金融等需要事务保证的场景。 | 不支持原生事务消息,但有一些社区解决方案。 | 提供事务支持,适合需要事务一致性的场景。 |
延迟消息 | 支持定时和延迟消息,适合需要消息延迟投递的场景。 | 不支持原生延迟消息,需通过外部机制实现。 | 支持定时和延迟消息,通过内置功能实现。 |
扩展性 | 通过分区实现水平扩展,适合大规模分布式系统。 | 高度可扩展,通过分区和集群扩展支持大规模应用。 | 支持多租户和分层存储,具备良好的扩展性。 |
生态系统 | 提供丰富的客户端和管理工具,生态系统相对较小。 | 拥有丰富的生态系统和社区支持,适合大数据集成。 | 提供强大的多租户支持和内置流处理功能。 |
持久化 | 支持持久化消息存储,确保消息可靠性。 | 消息持久化到磁盘,支持消息回溯。 | 支持持久化存储,内置冷热数据分离存储。 |
多租户支持 | 不支持多租户。 | 不支持多租户。 | 支持多租户架构,便于资源隔离和管理。 |
适用场景 | 金融支付系统、需要低延迟和高可靠性的业务场景。 | 实时数据流处理、日志收集、大数据平台中的数据管道。 | 云原生应用、需要多租户和长时间消息保留的场景。 |
总结
- RocketMQ:适合需要高性能、低延迟、事务支持和顺序消费的场景,尤其是在金融支付和订单处理等对可靠性和一致性要求较高的应用中表现优异。
- Kafka:以高吞吐量和丰富的生态系统著称,适合实时数据流处理和大数据相关的应用。其社区支持和工具链非常丰富,适合大规模数据集成和分析。
- Pulsar:凭借其多租户支持和内置的分层存储功能,适合云原生应用和需要大规模扩展的场景。适合需要灵活管理和资源隔离的多租户架构。
参考链接: