RocketMQ

1、RocketMQ 是什么

RcoketMQ 是一款低延迟、高可靠、可伸缩、易于使用的消息中间件。具有以下特性:

  1. 支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型
  2. 在一个队列中可靠的先进先出(FIFO)和严格的顺序传递
  3. 支持拉(pull)和推(push)两种消息模式
  4. 单一队列百万消息的堆积能力
  5. 支持多种消息协议,如 JMS、MQTT 等
  6. 分布式高可用的部署架构,满足至少一次消息传递语义
  7. 提供 docker 镜像用于隔离测试和云集群部署
  8. 提供配置、指标和监控等功能丰富的 Dashboard

2、专业术语

Producer

消息生产者,生产者的作用就是将消息发送到 MQ,生产者本身既可以产生消息,如读取文本信息等。也可以对外提供接口,由外部应用来调用接口,再由生产者将收到的消息发送到 MQ。

Producer Group

生产者组,简单来说就是多个发送同一类消息的生产者称之为一个生产者组。在这里可以不用关心,只要知道有这么一个概念即可。

Consumer

消息消费者,简单来说,消费 MQ 上的消息的应用程序就是消费者,至于消息是否进行逻辑处理,还是直接存储到数据库等取决于业务需要。

Consumer Group

消费者组,和生产者类似,消费同一类消息的多个 consumer 实例组成一个消费者组。

Topic

Topic 是一种消息的逻辑分类,比如说你有订单类的消息,也有库存类的消息,那么就需要进行分类,一个是订单 Topic 存放订单相关的消息,一个是库存 Topic 存储库存相关的消息。

Message

Message 是消息的载体。一个 Message 必须指定 topic,相当于寄信的地址。Message 还有一个可选的 tag 设置,以便消费端可以基于 tag 进行过滤消息。也可以添加额外的键值对,例如你需要一个业务 key 来查找 broker 上的消息,方便在开发过程中诊断问题。

Tag

标签可以被认为是对 Topic 进一步细化。一般在相同业务模块中通过引入标签来标记不同用途的消息。

Broker

Broker 是 RocketMQ 系统的主要角色,其实就是前面一直说的 MQ。Broker 接收来自生产者的消息,储存以及为消费者拉取消息的请求做好准备。

Name Server

Name Server 为 producer 和 consumer 提供路由信息。

3、RocketMQ 架构

由这张图可以看到有四个集群,分别是 NameServer 集群、Broker 集群、Producer 集群和 Consumer 集群:

  1. NameServer: 提供轻量级的服务发现和路由。 每个 NameServer 记录完整的路由信息,提供等效的读写服务,并支持快速存储扩展。
  2. Broker: 通过提供轻量级的 Topic 和 Queue 机制来处理消息存储,同时支持推(push)和拉(pull)模式以及主从结构的容错机制。
  3. Producer:生产者,产生消息的实例,拥有相同 Producer Group 的 Producer 组成一个集群。
  4. Consumer:消费者,接收消息进行消费的实例,拥有相同 Consumer Group 的
    Consumer 组成一个集群。

简单说明一下图中箭头含义,从 Broker 开始,Broker Master1 和 Broker Slave1 是主从结构,它们之间会进行数据同步,即 Date Sync。同时每个 Broker 与NameServer 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 NameServer 中。

Producer 与 NameServer 集群中的其中一个节点(随机选择)建立长连接,定期从 NameServer 获取 Topic 路由信息,并向提供 Topic 服务的 Broker Master 建立长连接,且定时向 Broker 发送心跳。

Producer 只能将消息发送到 Broker master,但是 Consumer 则不一样,它同时和提供 Topic 服务的 Master 和 Slave
建立长连接,既可以从 Broker Master 订阅消息,也可以从 Broker Slave 订阅消息。

4、RocketMQ 集群部署模式

  • 单 master 模式
    也就是只有一个 master 节点,称不上是集群,一旦这个 master 节点宕机,那么整个服务就不可用,适合个人学习使用。
  • 多 master 模式
    多个 master 节点组成集群,单个 master 节点宕机或者重启对应用没有影响。
    优点:所有模式中性能最高
    缺点:单个 master 节点宕机期间,未被消费的消息在节点恢复之前不可用,消息的实时性就受到影响。
    注意:使用同步刷盘可以保证消息不丢失,同时 Topic 相对应的 queue 应该分布在集群中各个节点,而不是只在某各节点上,否则,该节点宕机会对订阅该 topic 的应用造成影响。
  • 多 master 多 slave 异步复制模式
    在多 master 模式的基础上,每个 master 节点都有至少一个对应的 slave。master
    节点可读可写,但是 slave 只能读不能写,类似于 mysql 的主备模式。
    优点: 在 master 宕机时,消费者可以从 slave 读取消息,消息的实时性不会受影响,性能几乎和多 master 一样。
    缺点:使用异步复制的同步方式有可能会有消息丢失的问题。
  • 多 master 多 slave 同步双写模式
    同多 master 多 slave 异步复制模式类似,区别在于 master 和 slave 之间的数据同步方式。
    优点:同步双写的同步模式能保证数据不丢失。
    缺点:发送单个消息 RT 会略长,性能相比异步复制低10%左右。
    刷盘策略:同步刷盘和异步刷盘(指的是节点自身数据是同步还是异步存储)
    同步方式:同步双写和异步复制(指的一组 master 和 slave 之间数据的同步)
    注意:要保证数据可靠,需采用同步刷盘和同步双写的方式,但性能会较其他方式低。

5、环境搭建(双master模式)

(1)所需要的jar包

链接:https://pan.baidu.com/s/14hl8ZBsMiOmoLJop9xD8XA   (环境搭建所需要的配置包)
提取码:3nq5

(2)两台服务器

(3)配置hosts配置文件  (切记hosts中  查看ip是否与主机名对应  如果没有请添加 不然后面nameserver启动有异常,两台机器都要添加

 

(4)上传所需文件并配置

rocketmq依赖jdk1.8+所以先把两台服务的jdk装好。(如何装请百度)

将rockermq解压

创建软连接(两台机器都要建立)

创建存储路劲(两台机器都要建立)

mkdir /usr/local/rocketmq/store  

mkdir /usr/local/rocketmq/store/commitlog

mkdir /usr/local/rocketmq/store/consumequeue

mkdir /usr/local/rocketmq/store/index

修改rocketmq配置文件(两台机器)

vim /usr/local/rocketmq/conf/2m-noslave/broker-a.properties

vim /usr/local/rocketmq/conf/2m-noslave/broker-b.properties

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字
brokerName=broker-a   ->>>a.properties   改成a  b.properties 改成b
#0 表示master 非0表示 slave
brokerId=0
#nameserver 地址 分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic 默认创建队列数
defaultTopicQueueNums=4
#是否允许broker 自动创建Topic 建议线下开启 线上关闭
autoCreateTopicEnable=true
#是否允许Broker自动创建订阅组 建议线下开启 线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点 默认凌晨4点
deleteWhen=04
#文件保留时间 默认48小时
fileReservedTime=48
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#consumeQueue每个文件默认存30W条 根据业务情况调整
mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitlog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#Broker的角色
#ASYNC_MASTER 异步复制Master
#SYNC_MASTER 同步双写Master
brokerRole=ASYNC_MASTER
#刷盘方式
#ASYNC_FLUSH 异步刷盘
#SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
修改日志配置文件(两台机器)

mkdir -p /usr/local/rocketmq/logs

cd /usr/local/rocketmq/conf && sed -i 's#${user.home}#/usr/local/rocketmq#g'*.xml

修改runbroker.sh  runserver.sh(两台机器)

启动NameServer(两台机器)

注意:虚拟机的内存最少2G  内存越大越好 不然有可能起不来 (大坑)

nohup sh mqnamesrv &

启动broker服务(两台服务器)

broker-a.properties  192.168.22.131 用这个

broker-b.properties   192.168.22.132 用这个

nohup sh mqbroker -c ../conf/2m-noslave/broker-b.properties >/dev/null 2>&1 &

6、RockerMQ控制台

rocketmq-console.war解压到tomcat下webapps下

进入rocketmq-admin,修改WEB-INF/classes/config.properties

7、hello Demo

 

生产者:

消费者:

 

8、顺序消息

rocketmq可以保证严格的消息顺序进行消费,遵循全局顺序的时候使用一个queue,局部顺序的时候使用多个queue并行消费。

生产者:

消费者:

9、事务消息

支持事务方法对消息进行提交处理,在rocketmq里事务分为两个阶段

第一个阶段:把消息传递给MQ只不过消费端不可见,但是数据已经发送到了broker上了。

第二个阶段:为本地消息回调处理,如果成功的话返回COMMIT_MESSAGE 则在broker上的数据对消费端可见,失败则为ROLLBACK_MESSAGE 消费端不可见。

生产者:

TransactionExecuterImpl

消费者:还是普通的消费者

10、pull or push

push:consumer把轮询过程封装,并注册MessageListener监听器,取到消息后唤醒MessageListener的consumeMessage()来消费,对用户而言,感觉消息是被推送过来的。

pull:取消息的过程需要用户自己来写,首先通过消费的Topic拿到MessageQueue的集合,遍历MessageQuery集合,然后针对每个MessageQueue批量取消息,一次取完后,记录该队列下一次要取的开始offset,直到取完了,再换另外一个MessageQueue。

生产者:

消费者:(pull 主动拉去)

11、consumer常用API参数

设置消费位置

consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET)

消费线程池最小数量 默认10

consumer.setConsumeThreadMin(10)

消费线程池最大数量 默认20

consumer.setConsumeThreadMax(20)

拉消息本地队列缓存消息最大数 默认1000

consumer.setPullThresholdForQueue(1000)

批量消息 一次消费多少条消息 默认1条

consumer.setConsumeMessageBatchMaxSize(1)

批量拉消息 一次最多拉多少条 默认32条

consumer.setPullBatchSize(32)

消息拉取线程每隔多久拉取一次默认0

consumer.setPullInterval(0)

12、消息重试机制

重试机制rocketmq自己已经实现好了,默认是1s 5s 10s 15s 1m 2m ....  2h 重试。

13、消息模式

RocketMQ不遵循JMS规范,自己有一套自定义的机制,都是使用订阅主题的方式去发送和接收消息,但是支持集群和广播两种消息模型。

集群模型:设置消费端对象属性:MessageModel.CLUSTERINC,这种方式就可以达到类似点对点。

集群消费模式:一个ConsumerGroup中的Consumer实例平均分摊消费消息。例如某个Topic有9条消息,其中一个ConsumerGroup有3个实例(可能是3个进程,或者3台机器),那么每个实例只消费其中部分,消费完的消息不能被其他实例消费。

在JMS规范中,JMS point-to-point model(点对点)与之类似,但是RocketMQ的集群消费功能大等于PTP模型。因为RocketMQ单个ConsumerGroup内的消费者类似于PTP,但是一个Topic/Queue可以被多个ConsumerGroup消费。

广播模式:设置消费端对象属性:MessageModel.BROADCASTNC,这种模式相当于生产端发送数据到MQ,多个消费端都可以获取数据。

广播消费指的是:一条消息被多个consumer消费,即使这些consumer属于同一个ConsumerGroup,消息也会被ConsumerGroup中的每个Consumer都消费一次,广播消费中ConsumerGroup概念可以认为在消息划分方面无意义。

在CORBA Notification规范中,消费方式都属于广播消费。

在JMS规范中,相当于JMS publish/subscribe model(发布与订阅)

Topic主题:每个主题表示一个逻辑上存储的概念,而在其MQ上会有与之对应的多个Queue队列,这个是物理存储概念。

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值