前言
目前主流的mq主要是rocketmq、kafka、rabbitmq,rocketmq相比于rabbitmq、kafka具有主要优势特性有:
- 支持事务消息(能够解决分布式事务的问题)
- 支持顺序消息(底层已经使用内存队列实现)
- 支持consumer端tag过滤,减少不必要的网络传输
rocketmq就是对kafka实现的升级版本。
优缺点
rocketmq 优点
- 单机吞吐量:十万级
- 可用性:非常高,分布式架构
- 消息可靠性:经过参数优化配置,消息可以做到 0 丢失
- 功能支持:mq 功能较为完善,还是分布式的,扩展性好
- 支持 10 亿级别的消息堆积,不会因为堆积导致性能下降
- 源码是 java,方便结合公司自己的业务进行二次开发
- 天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况
- roketmq 在稳定性上可能更值得信赖,这些业务场景在阿里双11已经经历了多次考验
rocketmq 缺点
- 支持的客户端语言不多,目前仅支持 java 及 c++,而且 c++ 还不成熟
- 没有在 mq 核心中去实现 jms 等接口,有些系统要迁移需要修改大量代码
常见名词介绍
- provider
消息生产者,位于用户的进程内,producer通过nameserver获取所有broker的路由信息,根据负载均衡策略选择将消息发到哪个broker,然后调用broker接口提交消息。
- provider group
生产者组,简单来说就是多个发送同一类消息的生产者称之为一个生产者组。
- consumer
消息消费者,位于用户进程内。consumer通过nameserver获取所有broker的路由信息后,向broker发送pull请求来获取消息数据。consumer可以以两种模式启动,广播(broadcast)和集群(cluster),广播模式下,一条消息会发送给所有consumer,集群模式下消息只会发送给一个consumer。
- consumer group
消费者组,和生产者类似,消费同一类消息的多个 consumer 实例组成一个消费者组。
- topic topic
用于将消息按主题做划分,producer将消息发往指定的topic,consumer订阅该topic就可以收到这条消息。topic跟发送方和消费方都没有强关联关系,发送方可以同时往多个topic投放消息,消费方也可以订阅多个topic的消息。在rocketmq中,topic是一个上逻辑概念。消息存储不会按topic分开。
- message
代表一条消息,使用messageid唯一识别,用户在发送时可以设置messagekey,便于之后查询和跟踪。一个 message 必须指定 topic,相当于寄信的地址。message 还有一个可选的 tag 设置,以便消费端可以基于 tag 进行过滤消息。也可以添加额外的键值对,例如你需要一个业务 key 来查找 broker 上的消息,方便在开发过程中诊断问题。
- tag 标签
可以被认为是对 topic 进一步细化。一般在相同业务模块中通过引入标签来标记不同用途的消息。
- broker broker
是rocketmq的核心模块,负责接收并存储消息,同时提供push/pull接口来将消息发送给consumer。consumer可选择从master或者slave读取数据。多个主/从组成broker集群,集群内的master节点之间不做数据交互。broker同时提供消息查询的功能,可以通过messageid和messagekey来查询消息。borker会将自己的topic配置信息实时同步到nameserver。
- queue topic
queue topic和queue是1对多的关系,一个topic下可以包含多个queue,主要用于负载均衡。发送消息时,用户只指定topic,producer会根据topic的路由信息选择具体发到哪个queue上。consumer订阅消息时,会根据负载均衡策略决定订阅哪些queue的消息。
- offset
是rocketmq在存储消息时会为每个topic下的每个queue生成一个消息的索引文件,每个queue都对应一个offset记录当前queue中消息条数。
- nameserver
nameserver可以看作是rocketmq的注册中心,它管理两部分数据:集群的topic-queue的路由配置;broker的实时配置信息。其它模块通过nameserver提供的接口获取最新的topic配置和路由信息。
- producer/consumer
通过查询接口获取topic对应的broker的地址信息
- broker
注册配置信息到nameserver, 实时更新topic信息到nameserver
单机版安装部署
这里用作学习使用,所以使用docker安装,安装速度快。
1、安装启动nameserver
服务
docker run -d -p 9876:9876 -v /opt/rocketmq/data/namesrv/logs:/root/logs -v /opt/rocketmq/data/namesrv/store:/root/store --name rmqnamesrv -e "max_possible_heap=100000000" rocketmqinc/rocketmq sh mqnamesrv
2、安装启动broker服务
根据容器卷配置,在指定位置添加broker.conf内容 /opt/rocketmq/conf/broker.conf 。(可以不需要)
brokerclustername = defaultcluster
brokername = broker-a
brokerid = 0
deletewhen = 04
filereservedtime = 48
brokerrole = async_master
flushdisktype = async_flush
brokerip1 = docker宿主机ip
启动broker服务
docker run -d -p 10911:10911 -p 10909:10909 -v /opt/rocketmq/data/broker/logs:/root/logs -v /opt/rocketmq/rocketmq/data/broker/store:/root/store -v /opt/rocketmq/conf/broker.conf:/opt/rocketmq/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/conf/broker.conf
3、安装启动控制台
docker run -d -e "java_opts=-drocketmq.config.namesrvaddr=nameserip:9876 -drocketmq.config.isvipchannel=false" -p 8080:8080 --name rmqconsole -t styletang/rocketmq-console-ng
集群部署
集群部署原理图
broker主备
主:
备:同步主节点的数据,当主节点宕机之后,可以从被变为主保证高可用。
在rocketmq中分为多主多从实现对我们topic数据实现分片存储。
四种集群部署方式
- 单个master节点, 缺点就是如果宕机之后可能整个服务不可用;
- 多个master节点,分摊存放我们的消息,缺点:没有slave节点,主的master节点宕机之后消息数据可能会丢失的;
- 多个master和slave节点 采用异步形式 效率非常高 数据可能短暂产生延迟(毫秒级别的)
- 多个master和slave节点 采用同步形式, 效率比较低、数据不会产生延迟。
集群部署
集群的部署主要在于配置文件,nameserver部署好之后,多个broker的配置文件中配置同一个nameserver 集群的连接信息,broker集群就搭建好了。之后 rocketmq-console 连接其中一个nameserver就可以了。
配置文件说明:
#集群名称,可以区分不同集群,不同的业务可以建多个集群,多个broker的配置文件中的该值必须一样
brokerclustername=kaico# broker 的名称, master 和slave 通过使用相同的broker 名称来表明相互关系,以说明某个slave 是哪个master 的slave 。
brokername=broker-a
# 一个master barker 可以有多个slave, 0 表示master ,大于0 表示不同slave 的id 。
brokerid=0#与filereservedtim巳参数呼应,表明在几点做消息删除动作,默认值04 表示凌晨4 点。
deletewhen=04
namesrvaddr=mqnameserver1:9876;mqnameserver2:9876
autocreatetopicenable=true #是否自动创建主题(true为允许自动创建集群)
#topic默认创建的队列数
defaulttopicqueuenums=4
#是否允许broker自动创建订阅组,建议线下开启,线上关闭,默认【true】
autocreatesubscriptiongroup=true
#broker 监听的端口号,如果一台机器上启动了多个broker , 则要设置不同的端口号,避免冲突。
listenport=10911
brokerip=192.168.1.1
1、首先启动两个nameserver服务
2、启动多个broker服务(这里安排两个)
第一个broker配置文件
brokerclustername=kaico #集群名称
brokername=broker-a #broker的名称
brokerid=0 #master节点的标识(0表示是master节点)
namesrvaddr=mqnameserver1:9876;mqnameserver2:9876 #nameserver集群
第二个broker配置文件
brokerclustername=kaico #集群名称
brokername=broker-b #broker的名称
brokerid=0 #master节点的标识(0表示是master节点)
namesrvaddr=mqnameserver1:9876;mqnameserver2:9876 #nameserver集群
启动方式:
- 先启动nameserver服务
- 再去启动broker,在启动broker的命令中可以指定nameserver的连接信息。
到此这篇关于docker安装部署单机版rocket及基础讲解的文章就介绍到这了,更多相关docker rocket内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论