RocketMQ基本概念及安装(一)
一、介绍
RocketMQ是阿里提供的一款提供消息队列服务的中间件,是一套提供了消息生产、存储、消费流程的软件系统。
二、中间件对比
Kafka | RocketMQ | RabbitMQ | |
---|---|---|---|
定位 | 日志消息,监控数据 | 非日志的可靠消息传输 | 非日志的可靠消息传输 |
可用性 | 非常高 分布式、主从 | 非常高 分布式、主从 | 高 主从,采用镜像模式实现,数据量大时可能有性能问题 |
单机吞吐量 | 百万级 | 十万级 | 万级 |
堆积能力 | 非常好 | 非常好 | 一般 |
顺序消费 | 支持 一台broker宕机,消息会乱序 | 支持 顺序消息场景下,消费失败会暂停 | 支持 如果一个消息消费失败,此消息顺序会被打乱 |
定时消息 | 不支持 | 支持 | 支持 |
事务消息 | 不支持 | 支持 | 不支持 |
消息重试 | 不支持 | 支持 | 支持 |
死信队列 | 不支持 | 支持 | 支持 |
访问权限 | 无 | 无 | 可配置账号密码 |
MQTT | 不支持 | 不支持 | 支持 |
三、系统架构
1.Name Server
功能介绍·
Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。可理解为ZK,属于RocketMQ集群的注册中心,支持Broker的动态注册与发现及Topic路由。
主要包含功能:
-
Broker管理:接受Broker集群的注册信息并且保存下来作为路由信息的基础数据。提供心跳检测机制,检查Broker是否还存活。
-
路由信息管理:每个NameServer中都保存着Broker集群的整个路由信息和用于客户查询端的队列信息。Producer和Consumer可以通过NameServer获取整个Broker集群的路由信息,从而进行消息的投递和消费。
路由注册
NameServer通常也是以集群的方式部署,不过Nameserver是无状态的,即NameServer集群中的各个节点是无差异的,各节点互相不进行信息通讯。在Broker节点启动时,会轮询NameServer列表,与每个NameServer节点建立长连接,发起注册请求。在NameServer内部维护着一个Broker列表用来动态存储Broker信息。
路由剔除
Broker节点为了维护与NameServer间的长连接,会将最新的信息以心跳包的方式上报给NameServer,每30秒发一次心跳。心跳包中包含了BrokerId、BrokerIP、BrokerName等。NameServer接收到心跳包后会更新心跳时间戳,记录Broker最新存活时间。
NameServer中有一个定时任务,每隔10秒扫描一次Broker列表,查看每个Broker的最新心跳时间戳与当前时间是否超过了120秒,如果超过,则判定当前Broker失效,然后将其从Broker列表中剔除。
**路由发现**
RocketMQ的路由发现使用的是Pull模型,当Topic路由信息发生变化时,NameServer不会主动推送给客户端,而是由客户端定时拉去主题最新的路由。默认客户端每30秒拉去一次最新的路由信息。
客户端链接NameServer选择策略
客户端在配置时必须写上NameServer集群的地址,客户端链接NameServer时,客户端会随机一个数将之与NameServer节点数量取模,得到的数就是所需要链接的节点,然后进行链接,如果链接失败,则使用round-robin策略,逐个尝试去链接其他节点。
2.Broker
Broker负责存储消息,转发消息。Broker在RocketMQ系统中负责接收并存储从生产者发送来的消息,同时为消费者拉取或推送请求做准备。Broker同时存储着消息相关的元数据,包括主题、队列、消费者偏移量等。
模块构成
- Remoting Module : 模块实体,接收client端的请求
- Client Manager:管理(Producer/Consumer)和维护Consumer的Topic订阅信息
- Store Service:提供AP I接口处理消息存储到硬盘和查询功能
- HA Service:高可用服务,提供Master Broker和Slave Broker之间的数据同步
- Index Service:根据特定的Key对投递到Broker的消息进行索引服务,提供消息查询
3.Producer
消息发布的角色,支持分布式集群的方式部署。Producer通过MQ的负载均衡模块选择响应的Broker集群队列进行消息投递,投递消息支持快速失败并且延迟低。
RocketMQ中的消息生产者以生产者组(Producer Group)的形式出现的。生产者组是同一类生产者的集合,这类Producer集合必须发送相同的Topic类型消息,一个生产者组可以同时发送多个主题消息。
注:这里的负载均衡指的是生产者产生的消息会负载均衡到队列中,并不能保证消息能被平均分配到每个队列中。如图生产者1产生消息10条,生产者2产生消息4条,则队列1队列2各自5条,队列3队列4各自条,此时消息并没有平均分配。
4.Consumer
消息消费的角色,支持分布式集群的方式部署,支持以push推,pull拉的两种模式对消息进行消费。同时也支持集群方式和广播方式的消费,他提供实时消息订阅机制,可以满足大多数用户的需求。
RocketMQ中的消息消费者是以消费者组(Consumer Group)的形式出现的。消费者组是同一类消费者的集合,这类Consumer消费的是同一个Topic类型的消息。消费者组使消息消费方面实现负载均衡和容错的目标变得容易。
注:这里的负载均衡只是指消费者对Broker中的队列进行负载均衡, 不保证消息是平均分配的。
如图中所示有三个消费者,故消费者1消费5条,消费者2消费五条,消费者3消费队列3、4,合计消费4条消息。
在同一消费者组中,1个消费者可以消费多个消息队列,但一个消息队列同一时间只能被一个消费者消费。但是若归属于不同的消费者组,则可共同消费同一队列,如上图。
理论上同一消费组中消费者数量是要小于队列数量的,若大于队列数量,则多余的消费者不会进行消费消息。
四、部署架构
部署特点
-
NameServer是一个无状态节点,可集群部署,节点之间无任何信息同步。
-
Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与slave的对应关系通过指定相同的BrokerName和不同的BrokerIdl来定义。BrokerId为0标识Master,非0标识Slave。每个Broker与NameServer集群中所有的节点建立长连接,定时注册Topic到所有的NameServer。
注:当前最新版本RocketMQ支持一Master多Slave,但是只有BrokerId为1的从服务器才会参与消息的读负载。
-
Producer随机与NameServer集群中的一个节点建立长链接,定期从NameServer获取Topic的路由信息,并向提供Topic服务的Broker Master建立长连接,定时向Master发送心跳。Producer无状态可集群部署。
-
Consumer随机与NameServer集群中的一个节点建立长连接,定期从NameServer获取Topic的路由信息,并向提供Topic服务的Broker Master,Broker Slave建立长连接,并且定时向Master、Slave发送心跳。Consumer可以从Master、Slave中订阅消息。
部署流程
- 启动NameServer,NameServer启动后监听端口,等待Broker、Producer、Consumer链接,相当于注册中心。
- Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含了当前Broker的(IP+port等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
- 收发消息前,需在控制台创建topic,创建后需指定存储的Broker,也可以在发送消息时自动创建Topic。
- Producer发送消息,启动时先跟nameServer集群中的其中一台建立长连接,并从中获取当前发送Topic存在哪些Broker上,轮询从队列的列表中选择一个队列,然后与队列所在的Broker建立长连接发送消息。
- Consumer启动时先跟NameServer集群中的一台建立长连接,从中获取当前Topic存在哪些Broker上,跟Broker建立长连接,消费消息。
五、RocketMQ安装
1.安装准备
官网地址:http://rocketmq.apache.org/
去官网下载最新的压缩包:http://rocketmq.apache.org/dowloading/releases/
rocket-console下载:https://github.com/apache/rocketmq-externals
注:rocket-console没有现成的压缩包需下载源码编译后使用
修改配置文件
server.contextPath=/
#访问端口
server.port=8080
### SSL setting 默认就行
#server.ssl.key-store=classpath:rmqcngkeystore.jks
#server.ssl.key-store-password=rocketmq
#server.ssl.keyStoreType=PKCS12
#server.ssl.keyAlias=rmqcngkey
#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
#logback配置文件路径,默认即可
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
#Name Server地址,修改成自己的服务地址。多个地址用英文分号“;”隔开
rocketmq.config.namesrvAddr=192.168.2.24:9876
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true
#set the message track trace topic if you don't want use the default one
rocketmq.config.msgTrackTopicName=
rocketmq.config.ticketKey=ticket
#Must create userInfo file: ${rocketmq.config.dataPath}/users.properties if the login is required
rocketmq.config.loginRequired=false
打包项目
mvn clean package -Dmaven.test.skip=true
至此获得rocketmq-console的启动包。
2.安装流程
1.解压文件
unzip rocketmq-all-4.9.0-release.zip
cd rocketmq-all-4.9.0/
2.启动NameServer
nohup sh bin/mqnamesrv &
tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
3.启动Broker
nohup sh bin/mqbroker -n localhost:9876 &
tail -f ~/logs/rocketmqlogs/broker.log
The broker[%s, 172.30.30.233:10911] boot success...
4.启动rocket-console控制台
java -jar rocketmq-console-ng-1.0.0.jar
## 也可不进行配置文件调整直接在启动时对配置进行重新赋值
java -jar rocketmq-console-ng-1.0.0.jar --server.port=7000 --rocketmq.config.namesrvAddr=192.168.2.24:9876
至此rocketmq服务已安装完成,需要注意的是,若仅学习使用,需将NameServer和Broker的配置进行调整,原服务jdk默认占用4G内存。
修改配置文件
设置jdk使用的内存大小,分别是runserver和runbroker的大小
-
路径:rocketmq/bin/runserver.sh rocketmq/bin/runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
-
如果是docker启动,也可以在启动时设置覆盖环境变量
-e "JAVA_OPT=-server -Xms128m -Xmx128m -Xmn128m"
访问端口7000
至此RocketMQ安装完成,下面开始进行集群的搭建。