RocketMQ底层原理
2020-06-18 17:03:59 0 举报
AI智能生成
RocketMQ底层原理
作者其他创作
大纲/内容
Consumer底层原理
一条消息如何分配给不同的消费组
每一个不同的消费组都会接收到这个消息,区别是可以选择是一个消费组就一台机器接收还是消费组中所有的机器接收
消费组内部如何分配消息:集群模式:广播模式
可以通过一个参数设置:consumer.setMessageModel(MessageModel,BROADCASTING);
默认情况下都是集群模式,一个消费组获取到一条消息,交给组内的一台机器去处理
广播模式就是消费组内的每台机器都可以获取到这条消息
默认情况下都是集群模式,一个消费组获取到一条消息,交给组内的一台机器去处理
广播模式就是消费组内的每台机器都可以获取到这条消息
MessageQueue如何分配给多台机器消费
对于一个topic上的多个messagequeue,是平均分配给消费组中的多个机器的
如何拉取消息:push模式和pull模式
push模式的本质也是去broker上拉取消息,意思是Broker会尽可能实时的把新消息交给消费者进行处理
push模式的实现思路是当消费者发送请求到broker去拉取消息的时候,如果有新的消息可以消费,会立马返回一批消息到消费者机器处理,处理完之后会立刻发送请求到broker去拉取下一批消息.消息的时效性非常好,看起来就跟broker不断推送消息一样.push模式下有一个请求挂起和长轮询的机制,就是当消费者去拉取消息的时候,broker发现没有消息可以给,就会暂时让请求线程挂起,默认是15秒,然后这段时间有个后台线程每隔一段时间就去检查是否有新的消息给你,另外如果在这个挂起过程,有新的消息到达了会主动唤醒挂起的线程,然后把消息返回给消费者
push模式的实现思路是当消费者发送请求到broker去拉取消息的时候,如果有新的消息可以消费,会立马返回一批消息到消费者机器处理,处理完之后会立刻发送请求到broker去拉取下一批消息.消息的时效性非常好,看起来就跟broker不断推送消息一样.push模式下有一个请求挂起和长轮询的机制,就是当消费者去拉取消息的时候,broker发现没有消息可以给,就会暂时让请求线程挂起,默认是15秒,然后这段时间有个后台线程每隔一段时间就去检查是否有新的消息给你,另外如果在这个挂起过程,有新的消息到达了会主动唤醒挂起的线程,然后把消息返回给消费者
broker如何读取消息返回给消费者
基于ConsumeQueue读取消息在CommitLog中的物理位置,也就是offset
根据偏移量从commitLog中读取消息数据
消费者处理消息
回调消费者服务器注册的监听函数来处理
提交消息处理进度
broker存储消息消费的consumerOffset
消费组内的重平衡
消费组内机器宕机
消费组进行机器的扩容
Broker读写分离架构原理
CommitLog基于os cache实现写入优化
broker写入消息到commitLog文件中,是先写入page cache中,然后异步刷盘存储到磁盘的commitLog文件中
ConsumeQueue基于os cache实现读取优化
ConsumeQueue会被大量的消费者频繁的读取,这个读取的操作如果是从磁盘读,会影响到消息的写入和写出,进而影响到消息的吞吐量,所以实际上rocketmq的consumequeue是基于os cache进行优化的,os 自己有一个优化机制,就是读取一个磁盘文件的时候,会自动把磁盘文件的一些数据缓存到os cache中,而且本身consumequeue文件也不大,5.72MB,所以是完全可以被os缓存在cache中,也就是说对consumequeue的读取是内存级别的,这个性能就有了保障
CommitLog基于os cache+磁盘一起读取
消费者读取消息,有可能从磁盘读,也有可能从os cache读,取决于消费消息的进度
CommitLog什么时候从os cache里读?什么时候从磁盘中读
根据消费者消费进度,也就是未消费的消息数量和os cache中最大能够存储的消息数量的对比
如果消息还在os cache中,那就从os cache中读,如果不在,那就从磁盘中读
如果消息还在os cache中,那就从os cache中读,如果不在,那就从磁盘中读
Master Broker什么时候指示消费者从slave Broker读
当消费者去master拉取消息,master发现消费者有8w的消息未消费,而当前master可以存储在os cache中的消息只有5W,也就是说,接下来消费者会有大量的磁盘读取的操作,这个时候会指示消费者从slave读取消息,其实本质上是对比当前没有拉取消息的数量和大小,以及最多可以存放在os cache内存里的消息的大小,如果没拉取的消息超过了最大能使用的内存的量,那么说明后续会频繁的从磁盘加载数据,此时就让消费者去slave broker拉取消息了
Producer底层原理
MessageQueue是什么
创建topic时需要设置messageQueue,本质上是数据分片机制,通过MessageQueue把一个topic主题的消息拆分了多个部分
MessageQueue如何分散在Broker上
Messagequeue均匀的分散到broker集群
写入消息时如何选择MessageQueue
broker会把自身的topic信息,以及message信息发送给nameServer上,然后生产者写入消息之前会从nameserver上拉取路由信息,知道哪些MessageQueue在哪台机器上
Broker故障时的容错处理机制
在Producer中开启一个开关,就是sendLatencyFaultEnable,一旦打开这个开关,那就会有一个自动容错机制,比如,如果某次访问一个Broker发现网络延迟有500ms,然后还无法访问,那么接下来就会自动回避访问这个Broker,比如接下来的3000ms,不会访问
Broker数据存储机制
为什么Broker数据存储机制是最重要的
各种mq,不只是让你写入消息和获取消息那么简单,本身最重要的就是提供强大的数据存储能力,可以把亿万级的海量消息存储在自己的服务器的磁盘上,这样的话各种不同的系统从mq中消费消息的时候,才可以从mq服务器上获取自己需要的消息.
所以Broker数据存储实际上才是mq最重要的环境,他决定了生产者消息写入的吞吐量,决定了消息不能丢失,决定了消费者获取消息的吞吐量
所以Broker数据存储实际上才是mq最重要的环境,他决定了生产者消息写入的吞吐量,决定了消息不能丢失,决定了消费者获取消息的吞吐量
CommitLog数据存储机制
broker收到消息后会顺序追加写到CommitLog文件中,注意这个时候并不会直接写入磁盘,而是写入到os的pageCache内存缓存中,然后在某一个时间,os后台线程把数据刷盘写入磁盘,每个commitlog的大小不超过1GB,这也是方便内存映射可以直接转载到内存中
ConsumeQueue消息offset存储机制
消息写入到commitlog的时候也会同时将这条消息在commitLog中的物理位置也就是一个文件偏移量,就是一个offset,写入到messagequeue所属的consumequeue文件中去,所以实际上consumequeue中存储的每条数据都是commitlog文件中一个消息的引用,当然consumequeue中存储的每条数据不只是消息在commitlog中的offset偏移量,还包含了消息的长度,以及tag hashcode,一条数据是20字节,每个consumequeue文件保存30W调数据,大概每个文件大小是5.72MB
CommitLog写入性能优化
文件顺序追加写入
基于os cache写入
os后台线程异步刷盘
异步刷盘策略:高吞吐+丢失数据
同步刷盘策略:低吞吐+不丢失数据
Broker高可用主从架构
基于Dledger管理CommitLog
Dledger会把Broker的CommitLog文件替换为自己管理的CommitLog文件,
然后Broker还是可以基于Dledger的CommitLog去构建机器上的ConsumeQueue磁盘文件
然后Broker还是可以基于Dledger的CommitLog去构建机器上的ConsumeQueue磁盘文件
一组Broker启动时选举Leader
Dledger基于Raft算法协议进行选举
一组机器进行多轮的投票,他们都会投自己作为leader,如果过了一段时间没有收到新leader的消息,会继续投票,这个时候根据Raft协议的随机休眠机制,最先苏醒的broker投自己一票,并且会发投票请求给其他机器,其他机器一醒过来发现有一个broker有一票了就会直接投给发请求的broker,这样就快速选出了leader
Raft协议的随机休眠机制
Leader可以写入,Follower不可以写入
Leader写入之后进行数据同步
uncommitted消息同步给follower
数据同步会有两个阶段,第一个是uncommitted阶段,一个是committed阶段
过半follower返回ack即可返回
leader收到消息后,DledgerServer组件会先把消息标记为uncommitted,然后发送给所有的follower中的DledgerServer组件,接着follower中的DledgerServer收到uncommitted消息后,必须返回一个ack给Leader Broker的DledgerServer,如果Leader收到超过半数的ack,就会将消息标记为Committed状态.
Dledger在本地执行commit
Dledger将commit消息发送给follower
然后LeaderBroker上的DledgerServer就会发送committed消息给Follower机器上的DledgerServer,让他们也把消息标记为Committed状态
Leader崩溃之后
剩余Follower重新选举Leader
Leader自动热切换
Leader自动完成数据恢复
新的leader继续执行写入
0 条评论
下一页