rocketmq4.5.1
消息队列 RocketMQ是低延迟、高并发、高可用、高可靠的分布式消息中间件。该产品最初由阿里巴巴自研并捐赠给 Apache 基金会,服务于阿里集团 13 年,覆盖全集团所有业务。作为双十一交易核心链路的官方指定产品,支撑千万级并发、万亿级数据洪峰,历年刷新全球最大的交易消息流转记录;目前是由Apache基金会维护。
RocketMQ 是阿里巴巴开源的分布式消息中间件。支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念,如Group、Topic、Queue等。系统组成则由Producer、Consumer、Broker、NameServer等。
RocketMQ 特点
RocketMQ主要由 Producer、Broker、Consumer 三部分组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker。Message Queue 用于存储消息的物理地址,每个Topic中的消息地址存储于多个 Message Queue 中。ConsumerGroup 由多个Consumer 实例构成。
Name Server:充当路由消息的提供者。是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。在消息队列 RocketMQ 中提供命名服务,更新和发现 Broker 服务。
主要功能为:
broker
的请求,注册broker
的路由信息client(producer/consumer)
的请求,根据某个topic
获取其到broker
的路由信息;NameServer
没有状态,可以横向扩展。每个broker
在启动的时候会到NameServer
注册;Producer
在发送消息前会根据topic
到NameServer
获取路由(到broker
)信息;Consumer
也会定时获取topic
路由信息。Broker:消息中转角色,负责存储消息,转发消息。可以理解为消息队列服务器,提供了消息的接收、存储、拉取和转发服务。broker
是RocketMQ的核心,它不不能挂的,所以需要保证broker
的高可用。
生产者:与 Name Server 集群中的其中一个节点(随机)建立长链接(Keep-alive),定期从 Name Server 读取 Topic 路由信息,并向提供 Topic 服务的 Master Broker 建立长链接,且定时向 Master Broker 发送心跳。
消费者:与 Name Server 集群中的其中一个节点(随机)建立长连接,定期从 Name Server 拉取 Topic 路由信息,并向提供 Topic 服务的 Master Broker、Slave Broker 建立长连接,且定时向 Master Broker、Slave Broker 发送心跳。Consumer 既可以从 Master Broker 订阅消息,也可以从 Slave Broker 订阅消息,订阅规则由 Broker 配置决定。
Topic:表示消息的第一级类型,比如一个电商系统的消息可以分为:交易消息、物流消息...... 一条消息必须有一个Topic。
Queue:主题被划分为一个或多个子主题,称为“message queues”。一个topic
下,我们可以设置多个queue(消息队列)
。当我们发送消息时,需要要指定该消息的topic
。RocketMQ会轮询该topic
下的所有队列,将消息发送出去。
Tags:Tags是Topic下的次级消息类型/二级类型(注:Tags也支持TagA || TagB
这样的表达式),可以在同一个Topic下基于Tags进行消息过滤。Tags的过滤需要经过两次比对,首先会在Broker端通过Tag hashcode进行一次比对过滤,匹配成功传到consumer端后再对具体Tags进行比对,以防止Tag hashcode重复的情况。
1、从rocketMQ官网下载rocketMQ版本如:rocketmq-all-4.5.1-bin-release.zip
2、解压
unzip rocketmq-all-4.5.1-bin-release.zip
主目录下:
conf目录下:
bin目录下:
3、修改bin/runserver.sh和bin/runbroker.sh中修改下面1-3行注释掉,当然也可以在这个两个配置文件中配置内存:
如果JAVA_HOME配置有问题就可以直接写export JAVA_HOME=/xx/xx/xxx
4、先后启动mqnamesrv和mqbroker,这样一个单机版的rocketmq就安装好了
nohup sh mqnamesrv &
nohup sh mqbroker &
RocketMQ在众多消息队列产品中高可用性是其亮点之一,其集群部署方式有很多种。比如单Master模式、多Master模式、多Master多Slave模式(异步复制)、多Master多Slave模式(同步双写)等。明确个概念,RocketMQ Slave不可以写,可以读,类似于MySQL的主从机制。
上面的配置也分别对照着conf下面的:
此次我们以2m-2s-async为例搭建一个双Name Server,双主从的且异步复制的Broker
假设我们现在有六台机器:192.168.1.131、192.168.2.131、192.168.1.132、192.168.2.132、192.168.1.133、192.168.2.133;一般是分成两个网段。
Name Server:192.168.1.131、192.168.2.131;
Broker-a:192.168.1.132(主)、192.168.2.132(从)
Broker-b:192.168.1.133(主)、192.168.2.133(从)
其中Name Server的配置和单机一样,生产的启动可以如下:
nohup sh bin/mqnamesrv -n "192.168.1.131:9876" > /dev/null 2>&1 &
nohup sh bin/mqnamesrv -n "192.168.2.131:9876" > /dev/null 2>&1 &
Broker服务的配置就是在conf/2m-2s-async/下:
各配置如下:
broker-a.properties:
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
broker-a-s.properties:
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
broker-b.properties:
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
broker-b-s.properties
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
上面都是默认配置;我们这里最少每个文件都需要增加配置:
namesrvAddr=192.168.1.131:9876;192.168.2.131:9876
再接着依次启动192.168.1.132(主)、192.168.2.132(从)、192.168.1.133(主)、192.168.2.133(从):
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties > /dev/null 2>&1 &
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties > /dev/null 2>&1 &
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties > /dev/null 2>&1 &
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties > /dev/null 2>&1 &
启动后可以使用jps查看对应的进程是否启动成功
broker的常用配置如下:
#所属集群名字
brokerClusterName=DefaultCluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0表示Master,>0表示Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=192.168.1.131:9876;192.168.2.131:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=48
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#其他配置
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/alibaba-rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/alibaba-rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/alibaba-rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/alibaba-rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/alibaba-rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/alibaba-rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000