RocketMQ是一款由阿里研发的高性能高可靠性的分布式消息队列,使用Java语言开发,该项目已经贡献给了Apache基金会,成为Apache的顶级开源项目。
在早期,阿里内部使用ActiveMQ作为其消息传递中间件,随着业务的快速增长,基于ActiveMQ的消息队列集群在处理大规模业务吞吐量时会遇到IO等性能瓶颈,阿里研发团队曾努力优化ActiveMQ,但无奈效果不理想,紧接着他们将目光投向Kafka,不幸的是Kafka并不能满足他们的要求, 特别是在低延迟和高可靠性方面。在这种情况下,阿里研发团队最终决定自己研发一个消息队列引擎来处理更广泛的使用场景,包括从传统的发布/订阅到大批量高实时、消息零丢失的交易系统。并且将该方案向社区开放,希望可以服务更多的企业。
RocketMQ官方网址:http://rocketmq.apache.org/
目前已经有超过100家企业其业务中使用RocketMQ,下图是部分使用到RocketMQ的大厂:
下图是RocketMQ团队编写的主流消息队列对比图:
简单来说,消息队列就是一种“先进先出”的数据结构,框架在此基础上实现数据传输的高性能、消息的高可靠性和系统高可用性,所以在如今微服务大行其道的背景下,分布式消息队列可以提供异步、解耦和消峰等功能,已经成为大型互联网服务架构里不可或缺的中间件。
1、Linux安装Java环境
JDK1.8下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
作者之前下载的是: jdk-8u211-linux-x64.tar.gz
执行解压和拷贝:
tar -zxvf jdk-8u211-linux-x64.tar.gz
mv jdk1.8.0_211/ /usr/java1.8/
配置环境变量:
vim /etc/profile
JAVA_HOME=/usr/java1.8
JRE_HOME=/usr/java1.8/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
source /etc/profile
验证是否安装成功:
[root@test usr]# java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
2、Linux安装RocketMQ
RocketMQ下载地址: http://rocketmq.apache.org/dowloading/releases/
作者下载的是:rocketmq-all-4.5.0-bin-release.zip
执行解压命令:
unzip rocketmq-all-4.5.0-bin-release.zip
配置RocketMQ环境变量
#修改环境变量
vim /etc/profile
export ROCKETMQ_HOME=/home/software/rocketmq-all-4.5.0-bin-release
export PATH=$PATH:$ROCKETMQ_HOME/bin
#更新配置
source /etc/profile
修改JVM配置:修改rocketmq bin目录下的runserver.sh和runbroker.sh文件
配置指定外网地址:在conf目录下添加broker.properties文件指定外网地址
防火墙开放三个端口:9876、10911、10909
firewall-cmd --add-port=9876/tcp --permanent
firewall-cmd --add-port=10911/tcp --permanent
firewall-cmd --add-port=10909/tcp --permanent
firewall-cmd --reload
启动nameServer:
[root@test home]# mqnamesrv -n "192.168.0.149" &
The Name Server boot success. serializeType=JSON
启动Broker:
[root@test rocketmq-all-4.5.0-bin-release]# mqbroker -n "192.168.0.149:9876" -c conf/broker.properties autoCreateTopicEnable=true &
The broker[DEFAULT_BROKER, 192.168.0.149:10911] boot success. serializeType=JSON and name server is 192.168.0.149:9876
关闭命令
sh bin/mqshutdown broker //停止 broker
sh bin/mqshutdown namesrv //停止 nameserver
3、编写生产者服务
public class SyncProducer {
public static void main(String[] args) {
try {
DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName-1");
producer.setNamesrvAddr("192.168.0.149:9876");
//producer.setSendMsgTimeout(10*1000);
producer.start();
for(int i = 0; i < 100; i++){
Message message = new Message("TopicTest","TagA",
("Hello RocketMQ "+i).getBytes(RemotingHelper.DEFAULT_CHARSET));
SendResult sendResult = producer.send(message);
System.out.println("sendResult:"+sendResult);
}
producer.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
4、编写消费者服务
public class PushConsumer {
public static void main(String[] args) {
try {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ProducerGroupName-1");
consumer.setNamesrvAddr("192.168.0.149:9876");
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.subscribe("TopicTest","*");
consumer.registerMessageListener((List<MessageExt> msgList,ConsumeConcurrentlyContext consumeConcurrentlyContext) -> {
System.out.printf(Thread.currentThread().getName() + "Receive New Messages :" + msgList + "%n");
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
consumer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
上图是RocketMQ官方的集群架构图,可以看到整体上可以分为四个角色,分别是:NameServer、Broker、Producer、Consumer。这里先对它们进行一个简单介绍,后面会详细地介绍。
NameServer:
NameServer在消息队列中起到协调者的作用,Broker启动时会和NameServer建立长连接。
Broker:
Broker是RocketMQ的核心,通过它可以进行消息的接收、存储和拉去等功能,生产环境建议配备多台机器保证Broker的高可用性。
Producer:
消息队列的生产者,需要与NameServer建立连接,从NameServer获取Topic路由信息,并向提供Topic服务的Broker Master建立连接。
Consumer:
消息队列的消费者,同样与NameServer建立连接,从NameServer获取Topic路由信息,并向提供Topic服务的Broker Master,Slave建立连接;
项目下载地址:https://github.com/apache/rocketmq-externals/tree/master/rocketmq-console
修改配置文件指定NameServer地址:
使用maven打包项目
mvn package -Dmaven.test.skip=true
启动项目
java -jar rocketmq-console-ng-1.0.0.jar
开放8080端口
[root@test ~]# firewall-cmd --add-port=8080/tcp --permanent
success
[root@test ~]# firewall-cmd --reload
success
访问监控平台