RocketMQ作为阿里巴巴开源的分布式消息中间件,其架构设计充分考虑了高可用、高吞吐和低延迟的特性。核心架构采用主从模式,主要由NameServer、Broker、Producer和Consumer四个关键组件构成。
NameServer作为轻量级的服务发现组件,负责维护Broker的路由信息。与ZooKeeper等强一致性协调服务不同,NameServer采用最终一致性模型,这种设计在消息队列场景下既保证了性能又满足了可用性要求。实际部署时建议至少部署2-3个节点形成集群。
Broker是消息存储和转发的核心节点,采用主从架构保证高可用。主节点负责处理所有读写请求,从节点则通过异步复制方式同步数据。当主节点宕机时,从节点可以自动切换为主节点(需要配置Dledger模式)。Broker的存储设计非常精妙,采用CommitLog顺序写+ConsumeQueue索引的方式,既保证了写入性能又支持了多种消费模式。
推荐使用Linux系统进行部署,硬件配置建议:
安装步骤:
注意:生产环境必须修改默认的JVM参数,默认配置仅适合演示环境
Broker的核心配置(conf/broker.conf):
properties复制brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0 # 0表示master,>0表示slave
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
NameServer的启动命令:
bash复制nohup sh bin/mqnamesrv &
Broker的启动命令:
bash复制nohup sh bin/mqbroker -c conf/broker.conf &
创建生产者的典型代码:
java复制DefaultMQProducer producer = new DefaultMQProducer("producer_group");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
Message msg = new Message("TopicTest",
"TagA",
("Hello RocketMQ").getBytes(RemotingHelper.DEFAULT_CHARSET)
);
SendResult result = producer.send(msg);
System.out.println(result);
关键参数说明:
推模式消费者示例:
java复制DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group");
consumer.setNamesrvAddr("127.0.0.1:9876");
consumer.subscribe("TopicTest", "*");
consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
System.out.println("收到消息:" + new String(msgs.get(0).getBody()));
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
consumer.start();
消费模式选择:
重要:消费者必须做好幂等处理,防止重复消费
顺序消息需要满足:
生产者示例:
java复制MessageQueueSelector selector = (mqs, msg, arg) -> {
Integer id = (Integer) arg;
return mqs.get(id % mqs.size());
};
producer.send(msg, selector, orderId);
消费者配置:
java复制consumer.registerMessageListener((MessageListenerOrderly) (msgs, context) -> {
// 自动加锁保证顺序消费
return ConsumeOrderlyStatus.SUCCESS;
});
事务消息流程:
代码示例:
java复制TransactionMQProducer producer = new TransactionMQProducer("group");
producer.setTransactionListener(new TransactionListener() {
@Override
public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
// 执行本地事务
return LocalTransactionState.COMMIT_MESSAGE;
}
@Override
public LocalTransactionState checkLocalTransaction(MessageExt msg) {
// 检查本地事务状态
return LocalTransactionState.COMMIT_MESSAGE;
}
});
RocketMQ-Console是官方提供的管理界面:
主要功能:
消息堆积处理方案:
消息丢失排查:
性能调优参数:
推荐的多机房部署架构:
code复制NameServer集群(3节点,跨机房部署)
Broker集群:
- Master1(机房A)+ Slave1(机房B)
- Master2(机房B)+ Slave2(机房A)
网络配置建议:
消息存储量估算:
code复制总容量 = 日均消息量 × 平均消息大小 × 保存天数 × 副本数 × 1.2(冗余)
示例计算:
性能压测建议: