RocketMQ基础架构

Apache RocketMQ 是一款分布式消息及流处理平台,具备低延迟、高性能等特点。其架构包括命名服务、代理服务、生产者和消费者四个核心部分,支持水平扩展并避免单点故障。本文详细介绍各组件功能及工作原理。

基于官方文档进行翻译

概览

Apache RocketMQ是一个分布式消息和流平台,它的特性包括低延迟,高性能,高可靠性,万亿级容量和弹性扩展。它的架构主要包括四部分:命名服务(name servers),代理服务(brokers),生产者(Producers),消费者(Consumers)。其中每个部分都是可以水平扩展从而避免单点故障。如图所示:

在这里插入图片描述## 命名服务集群
命名服务提供了轻量的服务用于发现和路由。每个命名服务都记录了全量的路由信息,提供了读写一致性的服务,并且支持快速存储扩展。

代理服务集群

代理服务利用轻量的话题(TOPIC)和队列(QUEUE)机制来存储消息。代理服务能够支持推(Push)和拉(Pull)的模式,利用多拷贝来支持容错(2份或者3分拷贝),提供强大的峰值填充和以原始时间顺序堆积万亿数量级消息。并且代理服务还具备一些传统消息系统没有的特性,比如灾难恢复,多维度统计,预警机制等。

生产者集群

生产者支持分布式部署。分布式生产者通过负载均衡将信息发送到代理服务集群,发送进程支持快速失败(fail fast)[^1]以及低延迟。

消费者集群

消费者也能够在推拉模式中也能够支持分布式部署,并且支持集群消费以及消息广播。这种方式也提供了实时消息订阅机制,能够满足大部分消费者的需求。RocketMQ的官网也提供了相关的网页给有兴趣的用户。

命名服务

命名服务是纯粹的功能性服务器,主要包含2个特性:

  • 代理管理,命名服务接受代理服务集群的注册,同时通过心跳机制来检查单个代理的有效性
  • 路由管理,每个路由服务都保存了代理集群完整的路由信息以及客户端查询所需要的队列信息。RocketMQ的客户端(生产者/消费者)会从命名服务获取队列路由信息,但是客户端如何获取命名服务的地址?

下面有4个方法将命名服务地址推流至客户端:

  • 硬编码,如 producer.setNamesAddr("ip:port").
  • Java运行参数,使用 rocketmq.namesrv.addr
  • 环境变量,使用 NAMESRV_ADDR
  • HTTP的终点(Endpoint)。

点击这里查看更多关于命名服务的细节文档。

代理服务

代理服务负责消息存储和分发,消息查询,高可用等等。
如下图所示,代理服务包含几个重要的子模块:

  • 远程模块,代理服务入口,处理客户端发送的请求。
  • 客户端管理,管理客户端(生产者/消费者)并且维护消费者订阅。
  • 存储服务,为存储在物理硬盘上的消息提供简单的保存或查询接口。
  • 高可用服务,在主代理和从代理直接提供数据同步功能。
  • 索引服务,根据特定的key对消息进行索引构建,用于提供消息的快速检索。

在这里插入图片描述[^1]:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件

<think>嗯,用户询问的是ARM架构的RocketMQ安装包问题。从对话历史和引用内容看,用户应该是在国产ARM服务器(可能是麒麟系统)上部署RocketMQ,遇到了架构兼容性问题。用户给的引用资料挺全的,涵盖了从源码编译、Docker镜像制作到系统依赖安装的全链条。 用户可能实际遇到了两个痛点:一是官方没有提供预编译的ARM64二进制包,二是Docker基础镜像获取困难。引用[2]提到用户尝试用第三方镜像但拉取失败,引用[3]显示编译客户端时遇到-m64参数错误这种典型跨架构问题,说明用户已经在踩坑了。 需要特别注意用户的环境特殊性:引用[3]明确是麒麟系统+ARM,引用[4]提到华为云的CentOS ALTArch源,这种国产化环境更容易出现依赖缺失。用户给的参考方案其实已经覆盖了关键步骤:源码编译(引用1/2)、客户端库特殊处理(引用3)、系统依赖安装(引用4),但需要整合成完整解决方案。 考虑到RocketMQ官网确实不提供ARM二进制包,应该优先推荐源码编译方案。用户引用[1]的docker cp操作其实隐含了在x86机器交叉编译再移植的可能性,但更合理的还是在ARM本机编译。需要提醒用户注意:1)必须配置ARM版JDK 2)5.3.0版本源码已知在ARM的编译问题 3)CPP客户端的路径陷阱(引用3提到的lib拷贝问题)。 Docker方案虽然方便,但引用[2]的第三方镜像风险需要警示——最近确实常有dockerhub访问问题,而且非官方镜像有安全隐忧。如果用户坚持用容器,应该引导构建自有镜像,引用[4]的依赖安装步骤在这里就能复用。 最后决定把方案拆成三层:首选源码编译(最可靠),次选Docker构建(适合集群部署),最后给出客户端特殊处理。性能优化提示也要加上,毕竟ARM服务器核心数多但单核弱,需要调整线程参数。用户没提但可能需要的broker配置示例也准备给出来,毕竟ARM平台默认配置不一定最优。 </think>根据引用内容和ARM架构部署经验,以下是针对**RocketMQ ARM64架构**的完整解决方案及注意事项: --- ### **一、ARM架构安装包获取方案** #### ✅ 1. **官方源码编译(推荐)** RocketMQ官方未直接提供ARM64二进制包,需从源码编译: ```bash # 克隆源码(确保使用5.3.0+版本,已优化ARM支持) git clone https://github.com/apache/rocketmq.git cd rocketmq # 指定ARM架构编译 mvn clean package -DskipTests -P release -Dos.arch=aarch64 ``` 编译后安装包路径:`distribution/target/rocketmq-5.3.0/rocketmq-5.3.0.tar.gz` > 验证编译结果:`file bin/mqnamesrv` 应显示 `ELF 64-bit LSB ARM aarch64` [^1][^2] #### ✅ 2. **Docker镜像方案** 若需容器化部署: ```Dockerfile # 基于ARM64基础镜像(JDK需ARM版本) FROM arm64v8/openjdk:11-jdk # 复制编译好的ARM安装包 COPY rocketmq-5.3.0.tar.gz /opt/ RUN tar -xzf /opt/rocketmq-5.3.0.tar.gz -C /opt/ # 启动NameServer CMD ["/opt/rocketmq-5.3.0/bin/mqnamesrv"] ``` > 第三方镜像风险提示:引用中的 `dyrnq/rocketmq:4.9.7` 非官方维护,可能存在兼容性问题[^2] --- ### **二、关键注意事项** #### ️ **ARM环境兼容性问题** 1. **依赖库编译** - **C++客户端问题**:如引用[3]所述,ARM需手动调整库路径: ```bash cp rocketmq-client-cpp/bin/lib/aarch64-linux-gnu/* rocketmq-client-cpp/bin/lib/ ``` - 编译参数修正:移除 `-m64` 等x86专属flag,替换为 `-march=armv8-a` [^3] 2. **系统依赖** - 麒麟/ARM-CentOS需安装专用依赖包(引用[4]方案): ```bash rpm -ivh container-selinux-2.119*.rpm # 华为云ALTArch源获取ARM包 rpm -ivh docker-ce-20.10*.aarch64.rpm # 安装ARM版Docker ``` --- ### **三、部署验证** ```bash # 启动NameServer(ARM环境) bin/mqnamesrv # 检查进程架构 ps aux | grep mqnamesrv | awk '{print $NF}' | xargs file # 输出应为:ELF 64-bit LSB ARM aarch64 ``` --- ### 💡 **ARM优化建议** 1. **JVM参数调整** ```conf # conf/broker.conf brokerJVMOptions = -XX:+UseAArch64Intrinsics -XX:+UseContainerSupport ``` 2. **线程池适配** ARM多核性能差异大,建议调整线程数: ```conf serverAsyncSemaphoreValue = 64 # 默认16,避免高并发阻塞 ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值