RocketMq试用+简单的Spring集成
经过2天的试用初步了解了一下RocketMq的基本用法,搜索了一下度娘,没有找到Spring的例子,所以简单搞了一点代码感受一下。
1.RocketMq
RocketMQ的前身是Metaq,当Metaq3.0发布时,产品名称改为RocketMQ,有以下特点:
1) 能够保证严格的消息顺序
2) 提供丰富的消息拉取模式
3) 高效的订阅者水平扩展能力
4)实时的消息订阅机制
5)亿级消息堆积能力
2.核心原理
2.1. 数据结构
![a6276bd2c5d2ee616190fd7764b9097c.png](https://i-blog.csdnimg.cn/blog_migrate/53056b18d53c4db81b65f23b30f62996.jpeg)
![69a0ec1813aefb11404ee46be73ba5cf.png](https://i-blog.csdnimg.cn/blog_migrate/b80dd94dd0391a086df314975a7ed9a6.jpeg)
(1)所有数据单独储存到commit Log ,完全顺序写,随机读
(2)对最终用户展现的队列实际只储存消息在Commit Log 的位置信息,并且串行方式刷盘
(3)按照MessageId查询消息
![540c2aafd1f3c7d7f8d2d060b4c09a76.png](https://i-blog.csdnimg.cn/blog_migrate/7f30afb2f2565ce8aabe5c9c6b6db93c.jpeg)
4)根据查询的key的hashcode%slotNum得到具体的槽位置
![4fcf70ddc2041dd231df1b55c83eb923.png](https://i-blog.csdnimg.cn/blog_migrate/8714111e90008bb0d1225d118d9be636.jpeg)
(5)根据slotValue(slot对应位置的值)查找到索引项列表的最后一项
(6)遍历索引项列表返回查询时间范围内的结果集
2.2. 刷盘策略
rocketmq中的所有消息都是持久化的,先写入系统pagecache,然后刷盘,可以保证内存与磁盘都有一份数据,访问时,可以直接从内存读取
使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。
本编辑器支持 Markdown Extra , 扩展了很多好用的功能。具体请参考[Github][2].
2.3. 内存机制
![c6e2ff727943c9be45547ac0d5bfe578.png](https://i-blog.csdnimg.cn/blog_migrate/b0e54dc4c4c05cad170ba4b0f04ae5a2.jpeg)
2.4. 工作模式
![90b43992e36b21fefc799dda645aa8c6.png](https://i-blog.csdnimg.cn/blog_migrate/422cc84da2c22d8ab18363813280c99c.jpeg)
3. 环境安装
3.1. JAVA环境安装
安装
rpm -ivh jdk-7u80-linux-x64.rpm
1
环境变量
JAVA_HOME=/usr/java/jdk1.7.0_80
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
export ROCKETMQ_HOME=/usr/local/service/alibaba-rocketmq
3.2. RocketMq安装
https://github.com/alibaba/RocketMQ/releases下载3.2.6,解压1
4. 测试网络拓扑
![823011731700219efe462cf93320ac4c.png](https://i-blog.csdnimg.cn/blog_migrate/af7eccd8a599bd33f9048afa90116f4c.jpeg)
因为手里没有其他服务器,105那台缺少一个slave,在同步双写模式下,发送消息会返回 SLAVE_NOT_AVAILABLE,不过消息已经发送成功,只是slave没有写成功。
5. 启停操作
这里只给出一个基本的示例,各个模式的启停在本文最后的参考文献中会有详细的说明。这里不再赘述。
1
启动nameserver
nohup ./mqnamesrv &
1
停止nameServer
./mqshutdown namesrv
1
启动broker(单master)(多master,多master+slave)对应的(异步复制,同步双写)
nohup sh mqbroker -n 192.168.146.109:9876 -c $ROCKETMQ_HOME/conf/2m-noslave/broker-a.properties &
1
停止broker
./mqshutdown broker
1
6. 运维指令
查看集群情况
./mqadmin clusterList -n 127.0.0.1:9876
1
查看broker状态
./mqadmin brokerStatus -n 127.0.0.1:9876 -b 192.168.146.105:10911
1
查看topic列表
./mqadmin topicList -n 127.0.0.1:9876
1
查看topic状态
./mqadmin topicStatus -n 127.0.0.1:9876 -t PushTopic
1
查看topic路由
./mqadmin topicRoute -n 127.0.0.1:9876 -t PushTopic
1
7. 基本测试
基本测试采用java直接编码的方式生产和消费消息,例子来源于参考文献的《RocketMQ开发教程》。本文最后的代码示例,采用了spring的形式。
Producer
package com.jd.wxz;
import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
import com.alibaba.rocketmq.client.producer.SendResult;
import com.alibaba.rocketmq.common.message.Message;
public class Producer {
public static void main(String[] args){
DefaultMQProducer producer = new DefaultMQProducer("Producer");
producer.setNamesrvAddr("192.168.146.109:9876");
try {
producer.start();
Message msg = new Message("PushTopic