RocketMQ介绍
1、初识RocketMQ
RocketMQ是阿里巴巴开源的分布式消息中间件,成为 Apache 的顶级项目,以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。
- 是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点。
- Producer、Consumer、队列都可以分布式。
- Producer向一些队列轮流发送消息,队列集合称为Topic,Consumer如果做广播消费,则一个consumer实例消费这个Topic对应的所有队列,如果做集群消费,则多个Consumer实例平均消费这个topic对应的队列集合。
- 能够保证严格的消息顺序
- 提供丰富的消息拉取模式
- 高效的订阅者水平扩展能力
- 实时的消息订阅机制
- 亿级消息堆积能力
- 较少的依赖
2、RocketMQ基于Docker的安装
2.0、RocketMQ 物理部署结构
如上图所示, RocketMQ的部署结构有以下特点:
- 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的部署结构,我们可以发现我们需要安装Name Server和Broker,而Producer和Consumer在Java代码里面产生,不需要我们来部署,此外还有Console的结构进行安装,监控RocketMQ的运行状态。
因此,安装的内容由以下部分构成:
- Name Server
- Broker
- Console
2.1、Name Server的安装
搜索RocketMQ的镜像文件
1
docker search rocketmq
拉取镜像文件
1
docker pull rocketmqinc/rocketmq
需要注意的是Name Server和Broker使用的是同一个镜像文件
rocketmqinc/rocketmq
,而Console使用的镜像文件是styletang/rocketmq-console-ng
安装镜像
1
2
3
4
5
6docker run -d -p 9876:9876 \
-v /mydata/rocketmq/namesrv/logs:/root/logs \
-v /mydata/rocketmq/namesrv/store:/root/store \
--name rmqnamesrv \
-e "MAX_POSSIBLE_HEAP=100000000" \
rocketmqinc/rocketmq sh mqnamesrv-v:宿主机的目录挂在到Docker容器的目录,方便文件的修改和查看。
/mydata/rocketmq/namesrv/logs
是宿主机的路径,需要修改成自己配置的路径。/root/logs
是容器的路径。-p:宿主机和容器的端口的映射。
查看运行状态
1
docker ps
当使用
docker ps
命令看到有我们安装的镜像文件,即表示安装成功。
2.2、 Broker的安装
对于Broker的安装与前面内容类似,只是第三步骤的安装命令可能会不相同。
1 | docker run -d -p 10911:10911 -p 10909:10909 \ |
2.3、Console的安装
对于Console的安装与前面内容类似,只是第三步骤的安装命令可能会不相同。
1 | docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.113.128:9876 \ |
此时根据我们的配置文件,可以在浏览器访问Console。我的Docker容器IP地址是192.168.113.128,配置文件开放的端口8080, 打开浏览器的192.168.113.128:8080
界面。
3、基于Docker安装RocketMQ的爬坑
本来以为自己的环境已经弄好了,而且打开Console的地址也有现实,我还是太年轻了。今天下午,想执行执行一个Demo。然后发现Idea一直报异常。org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout
在网上找了一些资料,主要原因是连接不上Broker,导致超时报错,归纳一下可能出现的问题。
- 防火墙的状态是开启的导致端口9876阻塞,只要把防火墙关闭即可。
- 用Docker容器可能会存在这个原因,因为使用容器启动服务,所以暴露的ip地址使用的是容器的内部地址,而不是容器所在的虚拟机的地址,楼主出现问题的地方就在于此。
归纳一下查找问题的思路吧,虽然走了很多弯路。
我们可以通过Console的界面查看broker暴露的地址。没修改之前是docker容器的地址,大致是
172.17.0.8:10911
,而正确的地址,应该为Docker容器所在虚拟机的对外IP
地址,即为现在的192.168.113.128:10911
找到问题之后,我们将虚拟机的本地路径挂载到Broker配置文件,并且在启动Broker镜像的时候,指定配置文件的位置,最后把需要修改成的IP地址,修改到挂载文件即可。
在Broker的配置文件
broker.conf
添加额外的一行brokerIP1=192.168.113.128
,注意这个IP地址是自己虚拟机的IP地址。删除之前的镜像文件,重新生成Broker的镜像文件。
1
2
3
4
5
6
7
8docker run -d -p 10911:10911 -p 10909:10909 \
-v /mydata/rocketmq/broker/logs:/root/logs \
-v /mydata/rocketmq/broker/store:/root/store \
-v /mydata/rocketmq/broker/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf\
--name rmqbroker --link rmqnamesrv:namesrv \
-e "NAMESRV_ADDR=namesrv:9876" \
-e "MAX_POSSIBLE_HEAP=200000000" \
rocketmqinc/rocketmq sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf-c:加载配置文件。