Rocket MQ「2」架构

一 职业/职能

NameServer 命名服务器

    Rocket MQ自带的注册中心,因此Rocket MQ可自行完成集群部署,而无需同Kafka一流借助Zookeeper来实现集群。

  • 接受BrokerServer注册,通过心跳机制检测其活动状态;
  • 保存BrokerServer路由/队列信息,供客户端(Producer/Consumer)查询。
BrokerServer 经纪人服务器

    负责消息的传输、存储、管理,是实现Rocket MQ功能的中坚角色。

  • 远程处理:处理来自客户端的请求,根据类型分发到各个模块;
  • 客户管理:管理客户端,维护Consumer主题订阅;
  • 存储/查询:数据(消息、队列等)基于磁盘进行持久化存储,并提供查询;
  • HA(高可用):确保主从服务器间数据同步;
  • 索引服务:通过指定的键为邮件建立索引,并提供高效的邮件查阅;
  • … …
Producer 生产者

    即消息的发布者,负责生产及发送消息。

Consumer 消费者

    也称为订阅者,负责接收及消费消息。可分为两类:

  • PULL:消费者主动向Rocke MQ拉取消息并消费;
  • PUSH:消费者被动接收Rocke MQ推送的消息并消费。但Rocket MQ的推模式是一种伪推送,底层依然靠拉取实现,通过频繁拉取造成推送的假象。

二 工作流程

【注】下列流程并非严格按顺序执行,仅为了方便读者理解。

NameServer 命名服务器
  • STEP 1 BrokerServer向NameServer注册及上传路由/队列信息,并持续发送心跳;
  • STEP 2 NameServer接受BrokerServer注册及保存路由/队列信息,并持续接受心跳检以检测BrokerServer活动状态;
  • STEP 3 客户端请求NameServer获取BrokerServer路由/队列信息;
  • STEP 4 NameServer回应客户端以BrokerServer路由/队列信息。
BrokerServer 经纪人服务器
  • STEP 1 BrokerServer向NameServer注册及上传路由/队列信息,并持续发送心跳;
  • STEP 2 NameServer接受BrokerServer注册及保存路由/队列信息,并持续接受心跳检以检测BrokerServer活动状态;
  • STEP 3 Producer向BrokerServer请求发送消息;
  • STEP 4 BrokerServer向Producer回应发送成功/失败(单向发送没有回应);
  • STEP 5 Consumer向BrokerServer请求拉取消息;
  • STEP 6 BrokerServer向Consumer回应消息。
Producer 生产者
  • STEP 1 Producer向NameServer请求BrokerServer路由/队列信息;
  • STEP 2 NameServer向Producer回应BrokerServer路由/队列信息;
  • STEP 3 Producer向BrokerServer请求发送消息;
  • STEP 4 BrokerServer向Producer回应发送成功/失败(单向发送没有回应)。
Consumer 消费者
  • STEP 1 Consumer向NameServer请求BrokerServer路由/队列信息;
  • STEP 2 NameServer向Consumer回应BrokerServer路由/队列信息;
  • STEP 3 Consumer向BrokerServer请求拉取消息;
  • STEP 4 BrokerServer向Consumer回应消息;
  • STEP 5 Consumer消费消息。

【上一篇】《Rocket MQ「1」简介》

【下一篇】《Rocket MQ「3」消息模型》

### RocketMQ架构设计 RocketMQ 是一个纯 Java 实现的分布式消息中间件,其架构采用经典的队列模型,支持高并发、高可用和高性能的消息处理。整体架构主要包括以下几个核心组件: - **NameServer**:提供轻量级的服务发现和路由功能,负责管理 Broker 的注册信息和主题(Topic)的路由信息。 - **Broker**:消息中转角色,负责接收生产者发送的消息、存储消息以及将消息推送给消费者。 - **Producer**:消息的生产者,负责将消息发送到 Broker。 - **Consumer**:消息的消费者,从 Broker 拉取消息并进行消费处理[^1]。 RocketMQ 支持多种部署模式,包括单机模式、主从模式和 Dledger 集群模式,满足不同场景下的高可用需求。 --- ### RocketMQ 的工作原理 RocketMQ 通过 Topic 和 MessageQueue 来组织消息的生产和消费。每个 Topic 可以被划分为多个 MessageQueue,分布在不同的 Broker 上,从而实现水平扩展。消息的写入和读取都基于这些队列进行操作。 生产者在发送消息时,会根据 Topic 查找对应的 MessageQueue 并选择一个队列进行发送。消费者则通过订阅 Topic 获取对应的所有 MessageQueue,并从中拉取消息进行消费。 RocketMQ 提供了四种主要的消息类型: - **普通消息**:最常见的消息类型,适用于大多数异步通信场景。 - **顺序消息**:保证消息按照发送顺序被消费,适用于订单处理等对顺序有要求的场景。 - **事务消息**:支持本地事务与消息发送的原子性操作,确保业务逻辑与消息发送的一致性。 - **定时/延时消息**:支持消息在指定时间后才被投递给消费者[^2]。 --- ### RocketMQ 的关键特性 RocketMQ 在性能和可靠性方面具有显著优势,主要体现在以下方面: - **高吞吐量**:通过批量发送和接收机制,提升消息传输效率,适合大规模数据处理场景。 - **高可用性**:支持主从复制和 Dledger 集群,保障服务持续运行,即使部分节点故障也不会影响整体服务。 - **低延迟**:优化网络协议和线程模型,使得消息的端到端延迟控制在毫秒级别。 - **顺序消息支持**:通过分区锁定机制,确保消息按序消费。 - **消息重复处理机制**:由于网络或系统异常,可能会出现消息重复问题。RocketMQ 建议由应用层实现幂等性处理,避免因重复消息导致的数据不一致问题[^3]。 --- ### RocketMQ 的使用场景 RocketMQ 被广泛应用于多个行业和业务场景,主要包括: - **异步解耦**:如用户注册后,系统可以将短信通知、邮件通知等操作异步化,提高响应速度并降低系统耦合度[^4]。 - **流量削峰**:在高并发场景下,RocketMQ 可作为缓冲区,缓解下游系统的压力,防止突发流量导致服务不可用。 - **日志收集**:适用于集中式日志处理系统,将各业务系统的日志统一发送至消息队列,再由日志分析平台进行处理。 - **事件驱动架构**:在微服务架构中,RocketMQ 可用于服务之间的事件通知,实现松耦合的系统交互。 - **大数据管道**:支持与 Hadoop、Spark 等大数据平台集成,构建实时数据处理流水线。 --- ### 示例代码 以下是一个简单的 RocketMQ 生产者和消费者的示例代码: ```java // 生产者示例 import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.common.message.Message; public class Producer { public static void main(String[] args) throws MQClientException, InterruptedException { DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName"); producer.setNamesrvAddr("localhost:9876"); producer.start(); Message msg = new Message("TestTopic", "TagA", "Hello RocketMQ".getBytes()); producer.send(msg); producer.shutdown(); } } ``` ```java // 消费者示例 import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.consumer.listener.*; import org.apache.rocketmq.common.message.MessageExt; public class Consumer { public static void main(String[] args) throws MQClientException { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupName"); consumer.setNamesrvAddr("localhost:9876"); consumer.subscribe("TestTopic", "*"); consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> { for (MessageExt msg : msgs) { System.out.println("Received message: " + new String(msg.getBody())); } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; }); consumer.start(); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

说淑人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值