1、介绍
RocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点: 能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力
2、RocketMQ原理
1、包含组件
1、NameServer:单点,供Producer和Consumer获取Broker地址。
NameServer的主要功能是为整个MQ集群提供服务协调与治理,具体就是记录维护Topic、Broker的信息,及监控Broker的运行状态。为client提供路由能力
2、Broker:消息暂存,消息转发
3、Producer
4、Consumer
3、RocketMQ搭建
1、环境准备
1、64位1.7jdk及以上
2、jvm参数调整
2、RocketMQ安装
1、host文件修改
192.168.52.128 rocketmq-nameserver1
192.168.52.128 rocketmq-master1
192.168.52.129 rocketmq-nameserver2
192.168.52.129 rocketmq-master2
service network restart
注意: Error:No suitable device found: no device found for connection "System eth0"
解决办法:
(1)ifconfig -a 查看物理 MAC HWADDR 的值
(2)vim 编辑文件 /etc/sysconfig/network-scripts/ifcfg-eth0中修改ifconfig中查出的MAC HWADDR值;
2、上传安装包
# 上传alibaba-rocketmq-3.2.6.tar.gz文件至/usr/local
# tar -zxvf alibaba-rocketmq-3.2.6.tar.gz -C /usr/local
# mv alibaba-rocketmq alibaba-rocketmq-3.2.6
# ln -s alibaba-rocketmq-3.2.6 rocketmq
3、创建存储路径
mkdir /usr/local/rocketmq/store
mkdir /usr/local/rocketmq/store/commitlog
mkdir /usr/local/rocketmq/store/consumequeue
mkdir /usr/local/rocketmq/store/index
4、RocketMQ配置文件
vim /usr/local/rocketmq/conf/2m-noslave/broker-a.properties
vim /usr/local/rocketmq/conf/2m-noslave/broker-b.properties
#所属集群名字 |
5、修改日志配置文件
mkdir -p /usr/local/rocketmq/logs
cd /usr/local/rocketmq/conf && sed -i 's#${user.home}#/usr/local/rocketmq#g' *.xml
6、修改启动NameServer
vim /usr/local/rocketmq/bin/runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -
XX:PermSize=128m -XX:MaxPermSize=320m"
vim /usr/local/rocketmq/bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -
XX:PermSize=128m -XX:MaxPermSize=320m"
7、启动NameServer
cd /usr/local/rocketmq/bin
nohup sh mqnamesrv &
8、启动broker
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-noslave/broker-a.properties >/dev/null 2>&1 &
4、RocketMQ API入门
1、producer
2、consumer
集群问题:msgId可能会重复,因为发送到不同的broker中
5、重试机制
未返回ConsumeConcurrentlyStatus.CONSUME_SUCCESS或返回ConsumeConcurrentlyStatus.RECONSUME_LATER会进行重试,重试次数可配置
6、幂等问题解决
生产者:message.setKeys()---存放业务唯一标识
消费者:messageExt.getKeys()