【说清架构系列】万字长文剖析RocketMq高可用架构

大家好,我是慢德,一名奋斗在架构一线十余年的老兵。今天咱们来聊聊消息中间件界的"扛把子"——RocketMQ。

作为阿里开源的消息中间件,RocketMQ已经在无数的企业级应用中担当"数据总线"的重任。无论你是刚入行的小白,还是准备面试的求职者,这篇文章都能帮你解开RocketMQ的神秘面纱。

一、什么是RocketMQ?

想象一下,如果把我们的系统比作一座繁忙的城市,那么RocketMQ就是连接各个"城区"的高速公路网。它能够:

  • 接收海量的"车辆"(消息)
  • 合理分配"车道"(队列)
  • 确保每辆"车"都能到达目的地(可靠性)
  • 在"道路拥堵"时依然保持畅通(高性能)

简单来说,RocketMQ是一个分布式的消息中间件,专为大型分布式系统设计,能够处理海量消息并保证高可用性

// 生产者视角:发送消息就像寄快递一样简单
DefaultMQProducer producer = new DefaultMQProducer("producer_group");
producer.setNamesrvAddr("localhost:9876");
producer.start();

Message msg = new Message("TopicTest", "TagA", "Hello RocketMQ".getBytes());
SendResult sendResult = producer.send(msg);
System.out.println("消息ID: " + sendResult.getMsgId());

// 消费者视角:接收消息就像收快递
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group");
consumer.setNamesrvAddr("localhost:9876");
consumer.subscribe("TopicTest", "*");
consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
   
    for (MessageExt msg : msgs) {
   
        System.out.println("收到消息: " + new String(msg.getBody()));
    }
    return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
consumer.start();

二、RocketMQ核心架构解析

RocketMQ的整体架构像一个精密的钟表,每个零件都有其特定的职责。
【说清架构系列】万字长文剖析RocketMq高可用架构_第1张图片

2.1 四大核心组件

从上图可以看出,RocketMQ由四大部分组成:

  1. NameServer:轻量级的服务注册中心,就像交通指挥中心
  2. Broker:消息存储和转发的核心组件,就像是物流仓库
  3. Producer:消息生产者,就像快递员
  4. Consumer:消息消费者,就像收件人

2.2 NameServer详解

NameServer是整个RocketMQ的"大脑",但它的设计却出奇的简单。

特点

  • 几乎无状态,不需要持久化数据
  • 各个节点之间互不通信(这很重要!)
  • 每个Broker会定时向所有NameServer发送心跳

你是不是觉得很奇怪?“NameServer各节点之间不通信,那岂不是数据不一致?”

没错!RocketMQ就是这么任性,它用简单换取了稳定。当某个Broker宕机后,可能有些NameServer知道,有些不知道,但没关系,Producer和Consumer会从多个NameServer获取路由信息,自动识别出问题的Broker。

这种设计叫做"最终一致性",牺牲了一点点的数据实时性,换来了系统的高可用和简洁性。

// NameServer启动代码精简版
public static NamesrvController start() {
   
    // 初始化配置
    final NamesrvConfig namesrvConfig = new NamesrvConfig();
    final NettyServerConfig nettyServerConfig = new NettyServerConfig();
    nettyServerConfig.setListenPort(9876); // 默认端口
    
    // 创建并启动控制器
    final NamesrvController controller = new NamesrvController(namesrvConfig, nettyServerConfig);
    controller.initialize

你可能感兴趣的:(【说清架构系列】万字长文剖析RocketMq高可用架构)