RocketMQ官方文档:http://rocketmq.apache.org/docs/quick-start/
一、消息系统的作用
- 应用解耦
- 流量削峰
- 消息分发
二、RocketMQ
(一)简单介绍
RocketMq是一个由阿里巴巴开源的消息中间件,从2007年的Notify到2010年的Napoli,2011年升级后改为MetaQ,在2012年开始做RocketMQ,采用java语言开发的。其中Notify主要使用推模型,解决了事务消息;MetaQ采用了拉模型,解决了顺序消息和海量堆积的问题。RocketMQ基于长轮询的拉取方式,兼有两者的有点,在设计上借鉴了Kafka,2017年成为apache顶级项目。
(二)RocketMQ特点
- 是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点。
- Producer、Consumer、队列都可以分布式。
- Producer向一些队列轮流发送消息,队列集合称为Topic,Consumer如果做广播消费,则一个consumer实例消费这个Topic对应的所有队列,如果做集群消费,则多个Consumer实例平均消费这个topic对应的队列集合。
- 能够保证严格的消息顺序
- 提供丰富的消息拉取模式
- 高效的订阅者水平扩展能力
- 实时的消息订阅机制
- 亿级消息堆积能力
(三)物理部署架构
特点如下:
- Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
- Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。
- Producer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
- Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。
(四)逻辑部署架构
这里面涉及的生产者组、消费者组等相关概念在下一节中讲解。
(五)数据存储结构
RocketMQ采取了一种数据与索引分离的存储方法。有效降低文件资源、IO资源,内存资源的损耗。即便是阿里这种海量数据,高并发场景也能够有效降低端到端延迟,并具备较强的横向扩展能力。
三、单机安装
-
官网现在自己需要的版本,下载地址:http://rocketmq.apache.org/dowloading/releases/
可以下载源码包自己编译,也可以下载二进制包,我下载的是目前最新的4.5.1版本的二进制包 -
上传到linux服务器上
-
解压:
unzip rocketmq-all-4.5.1-bin-release.zip
-
启动NameServer(脚本在解压后的bin目录):
bin/mqnamesrv &
Java HotSpot(TM) 64-Bit Server VM warning: Using the DefNew young collector with the CMS collector is deprecated and will likely be removed in a future release Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release. The Name Server boot success. serializeType=JSON
-
启动Broker:
bin/mqbroker -n localhost:9876 &
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000005c0000000, 8589934592, 0) failed; error='Cannot allocate memory' (errno=12) # # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 8589934592 bytes for committing reserved memory. # An error report file with more information is saved as: # /soft/rocketmq4.5.1/bin/hs_err_pid25395.log [2]+ 退出 1 ./mqbroker -n localhost:9876
如果是在虚拟机启动的话,因为内存的问题,多数会报出上面的错误,我们可以对内存进行调整,修改bin下面的runserver.sh,runbroker.sh,tools.sh三个文件
runserver.sh:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
runbroker.sh:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"
tools.sh:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=128m"
之后重新启动nameserver和broker,broker启动成功,如下:
The broker[localhost.localdomain, 10.211.55.6:10911] boot success. serializeType=JSON and name server is localhost:9876
-
查看进程,执行jps命令,可以看到如下两个进程。
13459 BrokerStartup 13432 NamesrvStartup
-
发送和接受消息
这里使用rocketmq提供的示例进行演示。
①. 在发送和接受消息之前,需要告诉客户端name server的地址,可以简单的如下设置:
export NAMESRV_ADDR=localhost:9876
②. 发送消息。sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
,效果如下:
SendResult [sendStatus=SEND_OK, msgId=0AD3370639F52B193F2D2CE4CA0603DF, ....
③. 接受消息。sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
。效果如下:
Receive New Messages: [MessageExt [queueId=0, storeSize=180, queue....
-
关闭Broker:
sh bin/mqshutdown broker
-
关闭Name Server:
sh bin/mqshutdown namesrv
-
日志位置。
启动的时候,日志默认会被存放在~/logs/rocketmqlogs目录,我们可以进行查看。