
RocketMQ是阿里巴巴开发的消息中间件,在双十一万亿级的业务场景下大放异彩,并加入Apache成为其顶级孵化项目。其高性能、高可靠和与相对较低的开发成本、全面的功能支持,成为了许多业务场景下的不二之选,也成为开发中的必备技能之一,博主将分次总结RocketMQ的安装、集群、工作原理、实际应用等。
消息中间件的作用
限流削峰
可以将瞬时的超量请求暂时存储在MQ中,避免由于请求过大导致可能的服务崩溃或者请求丢失异步解耦
接口调用由MQ完成,系统可以只对MQ进行消息发布,其他系统可自行接入消费,去除系统间的耦合。且异步调用可减少接口返回时间,提高响应速度数据流汇总
可实对多个系统的数据流进行汇总,如业务数据,日志等。是目前数据汇总的优秀解
消息中间件的对比
目前较为主流的MQ各有优劣:
activeMQ官方维护越来越少,存在丢消息等毛病,社区活跃度不断下降,性能略显疲软,目前已经不是较好的选择,但其功能齐全,优秀的开发效率使其在一些简单业务场景下还占有一席之地。
rabbitmq凭借ErLang语言带来的原生优势在高并发一骑绝尘,适用于对高并发要求非常高的场景。且支持多种主流协议,适用于整合多种开发平台,iot系统就大量采用rabbitmq。缺点是由于ErLang较为小众,导致定制成本高。且除高并发外其它性能并不突出。
kafka的特性是高吞吐,快速持久化,适用于存储日志数据和大数据计算分析应用。
rocketMQ,其可靠性、吞吐量等各项指标都相当出色,功能支持完善,能胜任大多数业务场景,基于Java生态,使得越来越多的企业和开发者选择使用。现存的问题一个是Java外的语言支持不多,与其他语言项目一起使用困难。另一个是没有实现JMS规范,无法无缝迁移,但简洁的API一定程度上弥补了该问题,是一种很有前景的技术。
RocketMQ的安装
安装方法来自rocketMQ官方文档,主要介绍如何快速构建和部署基于 DLedger 的可以自动容灾切换的 RocketMQ集群。博主将补充部分内容,包括准备工作、可能出现的问题以及解决方案等,博主的系统为centos7。
链接:官方中文文档 | 官方英文文档
源码构建
构建分为两个部分,需要先构建 DLedger,然后 构建 RocketMQ
构建前的准备工作,已有git和maven可以跳过
安装git
yum install git
安装maven,该方法会自动下载配置,并使用jdk1.8依赖,如果你需要使用其他Java版本,请自行下载maven并手动配置
wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
yum -y install apache-maven
构建 DLedger
git clone https://github.com/openmessaging/openmessaging-storage-dledger.git
cd openmessaging-storage-dledger
mvn clean install -DskipTests
构建 RocketMQ
git clone https://github.com/apache/rocketmq.git
cd rocketmq
git checkout -b store_with_dledger origin/store_with_dledger
mvn -Prelease-all -DskipTests clean install -U
快速部署
在构建成功后
cd distribution/target/apache-rocketmq
sh bin/dledger/fast-try.sh start
如果上面的步骤执行成功,可以通过 mqadmin 运维命令查看集群状态。
要注意的是需根据实际情况关闭firewalld或者开放相关端口。
如果出现Algorithm HmacSHA1 not available错误,其原因是JAVA_HOME配置错误或者未配置,可直接编辑rocketmq下的/bin/tools.sh文件将/jre/lib/ext的配置改为绝对路径,但是更建议的是在/etc/profile中进行重新配置。
sh bin/mqadmin clusterList -n 127.0.0.1:9876
顺利的话,会看到如下内容:
(BID 为 0 的表示 Master,其余都是 Follower)
启动成功,现在可以向集群收发消息,并进行容灾切换测试了。
关闭快速集群,可以执行:
sh bin/dledger/fast-try.sh stop
快速部署,默认配置在 conf/dledger 里面,默认的存储路径在 /tmp/rmqstore。
容灾切换
部署成功,杀掉 Leader 之后(在上面的例子中,杀掉端口 30931 所在的进程),等待约 10s 左右,用 clusterList 命令查看集群,就会发现 Leader 切换到另一个节点了。
建议先简单了解一下fast-try.sh和conf/dledger下的配置内容,后续会有更详细的介绍。