RocketMq学习


官网文档地址:https://github.com/apache/rocketmq/tree/master/docs/cn

架构

消息存储架构
在这里插入图片描述
CommitLog:消息主体以及元数据的存储主体,存储Producer端写入的消息主体内容,消息内容不是定长的。单个文件大小默认1G。
ConsumeQueue:消息消费队列,引入的目的主要是提高消息消费的性能,Consumer即可根据ConsumeQueue来查找待消费的消息。其中,ConsumeQueue(逻辑消费队列)作为消费消息的索引,保存了指定Topic下的队列消息在CommitLog中的起始物理偏移量offset,消息大小size和消息Tag的HashCode值。
IndexFile:IndexFile(索引文件)提供了一种可以通过key或时间区间来查询消息的方法。IndexFile的底层存储设计为在文件系统中实现HashMap结构。

在这里插入图片描述

nameserver:相互独立,彼此没有通信,简单的Topic路由注册中心,主要包括两个功能:Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;路由信息管理,每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。
broker :主要负责消息的存储、投递和查询以及服务高可用保证.

  1. 单个broker和所有nameserver保持长连接。
  2. 心跳间隔:每隔30秒(此时间无法更改)向所有nameserver发送心跳,心跳包含了自身的topic配置信息。
  3. 心跳超时:nameserver每隔10秒钟(此时间无法更改),扫描所有还存活的broker连接,若某个连接2分钟内(当前时间与最后更新时间差值超过2分钟,此时间无法更改)没有发送心跳数据,则断开连接。

生产

三种方式发送消息:同步、异步和单向
同步发送:同步发送指消息发送方发出数据后会在收到接收方发回响应之后才发下一个数据包。
异步发送:异步发送指发送方发出数据后,不等接收方发回响应,接着发送下个数据包。
单向发送:单向发送是指只负责发送消息而不等待服务器回应且没有回调函数触发。

消息类型

普通消息
顺序消息
全局顺序消息:对于指定的一个Topic,所有消息按照严格的先入先出(FIFO)的顺序来发布和消费。
分区顺序消息:对于指定的一个Topic,所有消息根据Sharding Key进行区块分区。同一个分区内的消息按照严格的FIFO顺序进行发布和消费。Sharding Key是顺序消息中用来区分不同分区的关键字段,和普通消息的Key是完全不同的概念。
事务消息:消息队列RocketMQ提供类似X/Open XA的分布式事务功能,通过消息队列RocketMQ事务消息能达到分布式事务的最终一致。
半事务消息:暂不能投递的消息,发送方已经成功地将消息发送到了消息队列RocketMQ服务端,但是服务端未收到生产者对该消息的二次确认,此时该消息被标记成“暂不能投递”状态,处于该种状态下的消息即半事务消息。
延时消息:Producer将消息发送到消息队列RocketMQ服务端,延迟一定时间后才投递到Consumer进行消费。

消费模式

RocketMq提供两种方式:pull和push进行消息的消费

而RocketMq的push方式,本质上也是采用pull的方式进行实现的。也就是说这两种方式本质上都是采用consumer轮询从broker拉取消息的,push方式里,consumer把轮询过程封装了一层,并注册了MessageListener监听器。当轮询取到消息后,便唤醒MessageListener的consumeMessage()来消费,好像消息是被推送过来的。

集群消费:一条消息只会被同Group中的一个Consumer消费。
多个Group同时消费一个Topic时,每个Group都会有一个Consumer消费到数据。
广播消费:消息将被一 个 Consumer Group 下的各个 Consumer 实例都消费一遍。

负载均衡

RocketMQ 中的负载均衡都在 Client 端完成。
Producer 的负载均衡
默认采用轮训,以达到让消息平均落在不同的Queue上。
Consumer 的负载均衡
集群模式:
假如有Queue 1 2 3 4 5 6,Consumer 1 2 3
1.平均分配: C1-(Q1,Q2) C2-(Q3,Q4) C3-(Q5,Q6)
2.轮流分配 C1-(Q1,Q4) C2-(Q2,Q5) C3-(Q3,Q6)
广播模式:所有 consumer 都分到所有的 queue。

高可用

同步刷盘、异步刷盘和同步复制、异步复制

默认:异步刷盘、异步复制
推荐:异步刷盘,同步复制

刷盘:保证消息本机持久化
同步刷盘:消息被刷新到磁盘后才返回写成功状态。消息写入内存的pagecache后,立刻通知刷盘线程刷盘,然后等待刷盘完成才返回成功。

异步刷盘:不等消息刷到磁盘立刻返回成功状态。此时消息在缓存中,一定数量后统一刷入磁盘。

复制:保证集群消息持久化
同步复制:等Master和Slave均写成功后才返回写成功状态。

异步复制:只要Master写成功即可返回写成功状态。

配置:
/opt/rocket/conf/broker.conf 文件:Broker的配置文件
在这里插入图片描述
消息堆积:
消费端消息堆积:

  1. Topic中MessageQueue的数量大于Consumer的实例数量,可以将Consumer扩容,MessageQueue 会进行Rebalance重新分配给Consumer实例,此时多个Consumer实例可以迅速消费掉堆积的消息,.
  2. Topic中MessageQueue的数量小于Consumer的实例数量,此时直接扩容Consumer的实例数量是没用的,扩容后的Consumer实例仍然无法消费MessageQueue里面的消息; 此时可以修改项目代码,新建一个临时的Topic,制定临时Topic的MessageQueue数量为多个,然后再启动多个临时消费实例;此时Consumer将堆积的Topic里面对应的消息,不处理,收到后直接丢到新的Topic里面去,让消费者去消费。

性能

RocketMq性能比较高的原因:RocketMq采用文件系统存储消息,采用顺序写的方式写入消息,使用零拷贝发送消息,这三者的结合极大地保证了RocketMq的性能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值