![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
RocketMQ
文章平均质量分 95
S_H-A_N
这个作者很懒,什么都没留下…
展开
-
【RocketMQ】数据的清理机制
Broker在启动的时候会注册定时任务,定时清理过期的数据,默认是每10s执行一次,分别清理CommitLog文件和ConsumeQueue文件:CommitLog文件清理CommitLog文件清理的逻辑主要在CleanCommitLogService中,它是DefaultMessageStore的内部类,调用了deleteExpiredFiles方法删除过期文件:在执行清理任务之前,首先会获取一些配置参数,然后通过isTimeToDelete方法判断是否到了清理文件的时间,通过isSpaceToDe原创 2023-10-24 20:15:32 · 1099 阅读 · 0 评论 -
【RocketMQ】RocketMQ 5.0新特性(三)- Controller模式
JDK的动态代理实现原理是在运行中动态生成代理类,这个代理类实现了Subject接口,在对代理类进行实例化的时候,需要传入InvocationHandler,当调用代理类的方法时,会执行InvocationHandler的invoke方法,在invoke方法中再执行真正的目标方法,从而完成代理功能。原创 2023-10-23 09:07:04 · 1018 阅读 · 0 评论 -
【RcoketMQ】RcoketMQ 5.0新特性(二)- Pop消费模式
由于一个消息队列中的消息可以被多个消费者消费,如果某个消费者在消费某条消息之后一直未发生ACK消息,那么Broker是如何管理消费进度的,比如队列1中有1、2、3、4、5条消息,此时有三个消费者1、2、3,分别分配到了队列中的1、2、3条消息,此时消费者1已经对消息1ACK完毕,消费者3也对消息3ACK完毕,消费者2一直未ACK消息2,那么Broker如何设置消费进度?CheckPoint会优先保存在内存中,如果在一段时间内收到了客户端的ACK消息,就会将对应的CheckPoint清除,并更新消费进度;原创 2023-10-13 09:39:49 · 188 阅读 · 0 评论 -
【RocketMQ】RocketMQ5.0新特性(一)- Proxy
为了向云原生演进,提高资源利用和弹性能力,RocketMQ在5.0进行了架构的调整与升级,先来看新特性之一,增加了Proxy层。原创 2023-10-12 09:03:49 · 772 阅读 · 0 评论 -
【RocketMQ】(十一)Dledger模式下的日志复制
RocketMQ在开启Dledger时,使用DLedgerCommitLog,其他情况使用的是CommitLog来管理消息的存储。在Dledger模式下,消息写入时Leader节点还需要将消息转发给Follower节点,有过半的节点响应成功,消息才算写入成功。原创 2023-10-11 09:15:02 · 116 阅读 · 0 评论 -
【RocketMQ】RocketMQ存储结构设计
消费者在拉取消息进行消费的时候,就是通过这个ConsumeQueue实现的,消费者在向Broker发送消息拉取请求之前,需要知道应该从哪条消息开始消费,对于广播模式,消息的消费进度保存在消费者端本地,对于集群模式,消息的消费进度保存在Broker中,所以拉取某个消息队列的消息之前,会向Broker发送请求,获取该消息队列的消费进度,消费进度在RocketMQ的存储目录中有一个对应的文件,叫。RocketMQ一般会保存一个物理偏移量offSet,从CommitLog中获取消息内容。原创 2023-10-08 08:16:09 · 127 阅读 · 0 评论 -
【RocketMQ】(十)DLedger模式下的选主流程分析
RocketMQ 4.5版本之前,可以采用主从架构进行集群部署,但是如果master节点挂掉,不能自动在集群中选举出新的Master节点,需要人工介入,在4.5版本之后提供了DLedger模式,使用Raft算法,如果Master节点出现故障,可以自动选举出新的Master进行切换。Raft是分布式系统中的一种共识算法,用于在集群中选举Leader管理集群。:集群中的领导者,负责管理集群。:具有竞选Leader资格的角色,如果集群需要选举Leader,节点需要先转为候选者角色才可以发起竞选。原创 2023-10-07 09:15:13 · 297 阅读 · 0 评论 -
【RocketMQ】【源码】Dledger日志复制源码分析
调用dataFileList的append方法将dataBuffer内容写入日志文件,返回数据在文件中的偏移量;将索引信息写入indexBuffer;调用indexFileList的append方法将indexBuffer内容写入索引文件;ledgerEndIndex加1;设置ledgerEndTerm的值为当前Term;调用。原创 2023-09-30 13:35:04 · 164 阅读 · 0 评论 -
【RocketMQ】【源码】DLedger选主源码分析
RocketMQ 4.5版本之前,可以采用主从架构进行集群部署,但是如果master节点挂掉,不能自动在集群中选举出新的Master节点,需要人工介入,在4.5版本之后提供了DLedger模式,使用Raft算法,如果Master节点出现故障,可以自动选举出新的Master进行切换。Raft是分布式系统中的一种共识算法,用于在集群中选举Leader管理集群。Raft协议中有以下角色:Leader(领导者):集群中的领导者,负责管理集群。原创 2023-09-28 10:22:18 · 166 阅读 · 0 评论 -
【RocketMQ】(九)主从同步实现原理
默认情况下,消费者从Master节点拉取消息,Broker在处理消息拉取时会根据消息的拉取进度,进行判断,如果未拉取消息的大小超过了总物理内存的40%,此时会建议消费者从Slave节点拉取消息,Broker会将下次建议拉取消息的BrokerID,设置到响应中返回给消费者。从Slave节点拉取消息,需要开启配置项。原创 2023-09-27 10:06:43 · 243 阅读 · 1 评论 -
【RocketMQ】(八)Rebalance负载均衡
消费者负载均衡,是指为消费组下的每个消费者分配订阅主题下的消费队列,分配了消费队列消费者就可以知道去消费哪个消费队列上面的消息,这里针对集群模式,因为广播模式,所有的消息队列可以被消费组下的每个消费者消费不涉及负载均衡,而集群模式一个消息队列同一时间只能分配给组内的一个消费者进行消费。RocketMQ 5.0以前是按照队列粒度进行负载均衡的,5.0以后提供了按消息粒度进行负载均衡。原创 2023-09-26 08:35:03 · 828 阅读 · 0 评论 -
【RocketMQ】(七)事务实现原理
使用事务消息不会存在订单创建失败但是消息发送成功的情况,不过你可能还有一个疑问,假如订单创建成功了,消息已经投送到队列中,但是积分服务在消费的时候失败了,这样数据还是处于不一致的状态,个人感觉,积分服务可以在失败的时候进行重试或者进行一些其他的补偿机制来保证积分记录成功的生成,在极端情况下积分记录依旧没有生成,此时可能就要人工接入处理了。在单体系统的开发过程中,假如某个场景下需要对数据库的多张表进行操作,为了保证数据的一致性,一般会使用事务,将所有的操作全部提交或者在出错的时候全部回滚。原创 2023-09-25 13:25:23 · 73 阅读 · 0 评论 -
【RocketMQ】(六)顺序消息实现原理
全局有序在RocketMQ中,如果使消息全局有序,可以为Topic设置一个消息队列,使用一个生产者单线程发送数据,消费者端也使用单线程进行消费,从而保证消息的全局有序,但是这种方式效率低,一般不使用。局部有序假设一个Topic分配了两个消息队列,生产者在发送消息的时候,可以对消息设置一个路由ID,比如想保证一个订单的相关消息有序,那么就使用订单ID当做路由ID,在发送消息的时候,通过订单ID对消息队列的个数取余,根据取余结果选择消息队列,这样同一个订单的数据就可以保证发送到一个消息队列中,消费者端使用原创 2023-09-23 10:55:14 · 162 阅读 · 0 评论 -
【RocketMQ】(五)消息的消费
消费者从Broker拉取到消息之后,会将消息提交到线程池中进行消费,RocketMQ消息消费是批量进行的,如果一批消息的个数小于预先设置的批量消费大小,直接构建消费请求`ConsumeRequest`将消费请求提交到线程池处理,否则需要分批构建进行提交。原创 2023-09-23 10:39:38 · 422 阅读 · 0 评论 -
【RocketMQ】(四)消息的拉取
在上一讲中,介绍了消息的存储,生产者向Broker发送消息之后,数据会写入到CommitLog中,这一讲,就来看一下消费者是如何从Broker拉取消息的。RocketMQ消息的消费以组为单位,有两种消费模式:广播模式:同一个消息队列可以分配给组内的每个消费者,每条消息可以被组内的消费者进行消费。集群模式:同一个消费组下,一个消息队列同一时间只能分配给组内的一个消费者,也就是一条消息只能被组内的一个消费者进行消费。通常使用集群模式的情况比较多,接下来以集群模式(Push模式)为例看一下消息的拉取过程。原创 2023-09-13 10:59:23 · 577 阅读 · 0 评论 -
【RocketMQ】(三)消息的存储
通过上面分析消息的持久化过程,来看下RocketMQ提升性能的一些地方。(1)RocketMQ在写入数据到CommitLog时,采用的是顺序写的方式,顺序写比随机写文件效率要高很多。(2)在异步刷盘时,可以使用暂存池,暂存池会提前申请好内存,申请内存是一个比较重的操作,所以避免在消息写入时申请内存,以此提高效率。使用了文件映射的方式,向CommitLog写入数据,可以减少数据的拷贝过程。参考RocketMQ官方文档郭慕荣-RocketMQ消息存储原理总结(一)原创 2023-09-13 10:58:29 · 123 阅读 · 0 评论 -
【RocketMQ】(二)消息的发送
在未启用故障延迟机制时,从该消息所属的Topic下的所有消息队列集合中,轮询选择消息队列进行发送,如果上一次选择了某个Broker发送消息,本次将不会再选择这个Broker,当然如果最后仍未找到满足要求的消息队列,将会跳过这个判断,直接从队列中轮询获取消息队列返回。原创 2023-08-16 21:52:18 · 160 阅读 · 0 评论 -
【RocketMQ】(一)NameServer
NameServer是一个注册中心,提供服务注册和服务发现的功能。NameServer可以集群部署,集群中每个节点都是对等的关系(没有像ZooKeeper那样在集群中选举出一个Master节点),节点之间互不通信。Broker启动的时候会向所有的NameServer节点进行注册,注意这里是向集群中所有的NameServer节点注册,而不是只向其中的某些节点注册,因为NameServer每个节点都是对等的,所以Broker需要向每一个节点进行注册,这样每一个节点都会有一份Broker的注册信息。原创 2023-08-16 21:39:44 · 637 阅读 · 0 评论 -
【RocketMQ】【源码】消息拉模式分析
RocketMQ有两种获取消息的方式,分别为推模式和拉模式。推模式在一文中已经讲过,虽然从名字上看起来是消息到达Broker后推送给消费者,实际上还是需要消费向Broker发送拉取请求获取消息内容,推模式对应的消息消费实现类为消息推模式的详细过程可参考,接下来我们看一下拉模式。对比上面推模式进行消费的例子,从使用方式上来讲,。拉模式在使用方式上,,所以叫做拉模式。原创 2023-04-25 21:56:08 · 1630 阅读 · 1 评论 -
【RocketMQ】【源码】消息的拉取
消息的获取也有两种模式:拉模式:消费者主动发起拉取消息的请求,获取消息进行消费。推模式:消息到达Broker后推送给消费者。RocketMQ对拉模式进行了包装去实现推模式,**本质还是需要消费者去拉取,一个拉取任务完成后继续下一次拉取**。首先来看一个RocketMQ源码中基于推模式`DefaultMQPushConsumer`进行消费的例子,首先为消费者设置了消费者组名称,然后注册了消息监听器,并设置订阅的主题,最后调用start方法启动消费者原创 2023-04-09 22:29:20 · 1914 阅读 · 0 评论 -
【RocketMQ】【源码】负载均衡源码分析
RocketMQ在集群模式下,同一个消费组内,一个消息队列同一时间只能分配给组内的某一个消费者,也就是一条消息只能被组内的一个消费者进行消费,为了合理的对消息队列进行分配,于是就有了负载均衡。原创 2023-04-13 09:19:47 · 1215 阅读 · 0 评论 -
【RocketMQ】【源码】主从模式下的消费进度管理
消费者在启动的时候,会创建消息拉取API对象`PullAPIWrapper`,调用pullKernelImpl方法向Broker发送拉取消息的请求,那么在主从模式下消费者是如何选择向哪个Broker发送拉取请求的?原创 2023-04-13 09:17:58 · 1144 阅读 · 0 评论 -
【RocketMQ】【源码】主从同步实现原理
主从同步的实现逻辑主要在HAService中,在DefaultMessageStore的构造函数中,HAService进行了实例化,并在start方法中,启动了HAService原创 2023-04-12 09:26:09 · 1608 阅读 · 0 评论 -
【RocketMQ】【源码】顺序消息实现原理
假设一个Topic分配了两个消息队列,生产者在发送消息的时候,可以对消息设置一个路由ID,比如想保证一个订单的相关消息有序,那么就使用订单ID当做路由ID,在发送消息的时候,通过订单ID对消息队列的个数取余,根据取余结果选择消息队列,这样同一个订单的数据就可以保证发送到一个消息队列中,消费者端使用`MessageListenerOrderly`处理有序消息,这就是RocketMQ的局部有序,保证消息在某个消息队列中有序。原创 2023-04-12 09:23:02 · 1527 阅读 · 0 评论 -
【RocketMQ】【源码】事务的实现原理
在单体系统的开发过程中,假如某个场景下需要对数据库的多张表进行操作,为了保证数据的一致性,一般会使用事务,将所有的操作全部提交或者在出错的时候全部回滚。以创建订单为例,假设下单后需要做两个操作:原创 2023-04-11 22:41:56 · 1559 阅读 · 0 评论 -
【RocketMQ】【源码】消息的消费
当RocketMQ进行消息消费的时候,是通过`ConsumeMessageConcurrentlyService`的`submitConsumeRequest`方法,将消息提交到线程池中进行消费,具体的处理逻辑如下:1. 如果本次消息的个数小于等于批量消费的大小`consumeBatchSize`,构建消费请求`ConsumeRequest`,直接提交到线程池中进行消费即可2. 如果本次消息的个数大于批量消费的大小`consumeBatchSize`,说明需要分批进行提交原创 2023-04-09 22:27:51 · 1742 阅读 · 0 评论 -
【RocketMQ】【源码】消息的刷盘机制
消息的刷盘机制原创 2023-03-02 22:07:10 · 1314 阅读 · 0 评论 -
【RocketMQ】【源码】消息的存储
消息存储机制原创 2023-03-02 22:05:29 · 1277 阅读 · 0 评论 -
【RocketMQ】【源码】消息的发送
首先来看一个RcoketMQ发送消息的例子:RocketMQ是通过进行消息发送的,它实现了接口,接口中定义了消息发送的方法,方法主要分为三大类:接下来以将以同步消息发送为例来分析消息发送的流程。里面有一个类型的成员变量,从默认的无参构造函数中可以看出在构造函数中对进行了实例化,在方法中就是调用的方法进行消息发送的:中消息的发送在方法中实现,处理逻辑如下:获取路由信息DefaultMQProducerImpl中有一个路由信息表,记录了主题对应的路由信息,其中KEY为topic, value为对应的路原创 2022-11-02 23:10:27 · 1176 阅读 · 0 评论 -
【RocketMQ】【源码】Broker服务注册
在Broker的启动函数中,添加了定时向NameServer进行注册的任务,在启动后延迟10秒向NameServer进行注册,之后定时发送心跳包,关于发送周期,首先从Broker配置的周期与60000毫秒中选出最小的那个值,然后再与10000毫秒对比,选出最大的那个,所以。brokerLiveTable保存了当前NameServer收到的心跳数据,遍历brokerLiveTable,获取每一个Broker最近一次发送心跳的时间,如果上一次发送心跳的时间 + 过期时间(120s) 小于 当前时间,原创 2022-11-02 23:08:50 · 1347 阅读 · 0 评论 -
【RocketMQ】【源码】NameServer的启动
NameServer是一个注册中心,Broker在启动时向所有的NameServer注册,生产者Producer和消费者Consumer可以从NameServer中获取所有注册的Broker列表,并从中选取Broker进行消息的发送和消费。NameServer的启动类是。原创 2022-11-02 23:07:34 · 1739 阅读 · 0 评论