懒羊羊--搞点小技术
热爱代码,热爱程序
展开
-
RocketMQ5.0消息存储<五>_文件过期删除机制
若是更新消息时(如:更新消息的延迟重试次数),采用重新写入的方式,而不是直接更新原始消息。RocketMQ清除过期文件的方法是:如果非当前写文件在一定时间间隔内没有再次被更新,则认为是过期文件,可以被删除,不会关注该文件的消息是否全部被消费。RocketMQ操作CommitLog、ConsumeQueue文件是基于内存映射机制并在启动时会加载commitlog、consumequeue目录下的所有文件,为了避免内存与磁盘的浪费,不可能将消息永久存储Broker服务器上,所以需要删除己过期的文件。原创 2023-07-12 14:03:22 · 324 阅读 · 0 评论 -
RocketMQ5.0消息存储<四>_刷盘机制
org.apache.rocketmq.store.CommitLog.DefaultFlushManager#handleDiskFlush是刷盘核心方法,含有同步、异步刷盘逻辑,如下代码所示。org.apache.rocketmq.store.CommitLog.FlushManager是刷盘管理器接口,其接口的实现类是org.apache.rocketmq.store.CommitLog.DefaultFlushManager刷盘管理器实现类维护刷盘线程执行周期性刷盘操作。开启堆外内存池的刷盘流程。原创 2023-07-12 13:45:04 · 316 阅读 · 0 评论 -
RocketMQ5.0消息存储<三>_消息转发与恢复机制
如果Broker异常退出,在文件恢复过程中,RocketMQ会将最后一个有效文件中的所有消息重新转发到消息消费队列与索引文件,确保不丢失消息,但同时会带来消息重复的问题。如下所示是的UML图。需要注意的是没有恢复IndexFile文件,原因是有异常的IndexFile在加载过程中被销毁,当恢复时再次转发消息来构建IndexFile,详细见org.apache.rocketmq.store.index.IndexService#load是IndexFile文件加载的核心处理方法,这里不作介绍。原创 2023-07-12 11:31:38 · 137 阅读 · 0 评论 -
RocketMQ5.0消息存储<二>_消息存储流程
org.apache.rocketmq.broker.processor.SendMessageProcessor是生产者发送消息后,Broker接收消息的核心实现类。创建的内存追加消息。org.apache.rocketmq.store.logfile.DefaultMappedFile#appendMessage是文件内存映射追加消息方法,目的是把堆外缓存池消息或直接Commit到文件内存映射,其调用链如下。step3:消息通过堆外缓存,Commit消息写入文件内存映射,然后Flush写入磁盘;原创 2023-07-12 10:22:06 · 138 阅读 · 0 评论 -
RocketMQ5.0消息存储<一>_存储文件及内存映射
但是按照消息主题检索消息带来了极大的不便,RocketMQ引入了ConsumeQueue消息队列文件,每个消息主题包含多个消息消费队列(内容相同),每一个消息队列有一个消息文件,其专门为消息订阅构建的索引文件,提高根据主题与消息队列检索消息的速度。ConsumeQueue即为Commitlog文件的索引文件,其构建机制是当消息提交到Commitlog文件的内存映射后,由专门的线程产生消息转发任务,从而构建消息消费队列文件与下文提到的索引文件。如下图所示,每条消息的前面4个字节是该消息的总长度。原创 2023-07-12 09:36:18 · 343 阅读 · 0 评论 -
RocketMQ5.0消息消费<三> _ 消息消费
参考《RocketMQ5.0.0消息消费<一> _ PUSH模式的消息拉取》,成功拉取消息后,org.apache.rocketmq.client.consumer.PullCallback回调onSuccess(),把消息提交(异步提交)到ConsumeMessageService的线程池中,供消费者消费,则本次拉取消息完成。org.apache.rocketmq.client.consumer.store.RemoteBrokerOffsetStore是集群模式消费进度存储的实现类,其关键属性如下。原创 2023-07-10 15:38:43 · 247 阅读 · 0 评论 -
RocketMQ5.0消息消费<二> _ 消息队列负载均衡机制
每个消费者DefaultMQPushConsumerImpl拥有一个RebalanceImpl对象,其中org.apache.rocketmq.client.impl.consumer.RebalanceImpl#doRebalance方法是对消费者的所有订阅主题进行负载均衡,即:消费者的所有订阅主题重新分配一个或多个消费队列来进行消费。org.apache.rocketmq.client.impl.consumer.RebalanceService#run()周期20s执行负载均衡任务。原创 2023-07-10 14:49:42 · 929 阅读 · 0 评论 -
RocketMQ5.0消息消费<一> _ PUSH模式的消息拉取
一、消息消费概述消息消费以组的模式开展,一个消费组内有多个消费者,每一个消费者可订阅多个主题,消费组之间有两种消费模式:集群模式(默认)、广播模式:消息服务器与消费者之间的消息传送有两种模式:推模式(默认)、拉模式。RocketMQ消息推模式的实现基于拉模式,在拉模式上包装一层,一个拉取任务完成后开始下一个拉取任务。RocketMQ支持局部顺序消息消费,即保证同一个消息队列上的消息顺序消费。不支持消息全局顺序消费, 若实现某一主题的全局顺序消息消费,可以将该主题的消费队列数设置为1 ,牺牲高可用性。Rock原创 2023-07-10 14:16:09 · 327 阅读 · 0 评论 -
RocketMQ5.0的Broker主从同步机制
org.apache.rocketmq.store.ha.DefaultHAService.AcceptSocketService#run监听到从Broker连接事件的任务处理,为每个连接事件创建org.apache.rocketmq.store.ha.HAConnection对象并启动(负责M-S的数据同步逻辑)。以下1主1从异步HA配置实例如下。org.apache.rocketmq.store.ha.DefaultHAClient是从Broker向主Broker的发送连接事件的核心类,是个线程。原创 2023-07-10 11:15:57 · 318 阅读 · 0 评论 -
RocketMQ5.0--消息发送
没有启用Broker故障延迟机制,即:sendLatencyFaultEnable为false,采用默认机制,其实现方法org.apache.rocketmq.client.impl.producer.TopicPublishInfo#selectOneMessageQueue(java.lang.String),其代码如下。org.apache.rocketmq.broker.processor.SendMessageProcessor是Broker接收消息的实现类,其代码如下。原创 2023-07-07 17:30:49 · 176 阅读 · 0 评论 -
RocketMQ5.0--路由中心NameServer
接受请求的总入口org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor#processRequest,注册Broker请求码为RequestCode.REGISTER_BROKER,NameServer注册Broker的核心方法是:org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager#registerBroker,如下代码所示。发送消息时,直接向Broker发送消息并消息ACK确认。原创 2023-07-07 16:39:05 · 223 阅读 · 0 评论 -
RocketMQ5.0--部署与实例
org.apache.rocketmq.broker.BrokerStartup启动类配置环境变量ROCKETMQ_HOME,值是配置主目录“E:\rocketmq”;org.apache.rocketmq.namesrv.NamesrvStartup启动类配置环境变量ROCKETMQ_HOME,值是配置主目录“E:\rocketmq”,如下图所示。查看打包的可部署文件路径:.\distribution\target\rocketmq-5.0.0\rocketmq-5.0.0,如下图所示。原创 2023-07-07 15:38:52 · 365 阅读 · 0 评论 -
RocketMQ5.0--顺序消息
消费队列负载均衡后,便从重新负载后的消费队列拉取消息,参考 《RocketMQ5.0.0消息消费<一> _ PUSH模式的消息拉取》 ,其中拉取消息DefaultMQPushConsumerImpl#pullMessage方法中,关于顺序消息的代码如下所示。若是被锁定,则向Broker拉取消息成功后,提交到消费线程池中供消费者消费。遍历负载均衡后的每一个消费队列,若新增消费队列时,需要判定是不是顺序消息,若是则向Broker端发送锁定该消费队列(避免其他消费者消费),锁定失败后需要延迟重新负载均衡。原创 2023-07-07 14:13:53 · 321 阅读 · 0 评论 -
RocketMQ5.0--定时消息
消息延迟级别在Broker端通过MessageStoreConfig#messageDelayLevel配置,默认为"1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h",其delayLevel=1则延迟1s,delayLevel=2则延迟5s,以此类推。org.apache.rocketmq.broker.schedule.ScheduleMessageService#load完成延迟消费进度的加载且解析延迟级别字符串,如下代码所示。原创 2023-07-07 11:50:44 · 639 阅读 · 0 评论 -
RocketMQ5.0--事务消息
RocketMQ5.0–事务消息一、事务消息概览RocketMQ事务消息的实现原理基于两阶段提交和定时事务状态回查来决定消息最终是提交还是回滚,消费者可以消费事务提交的消息,如下图所示。事务消息的作用:确保本地业务与消息在一个事务内,本地业务成功执行,消费者才能消费消息。事务消息实现流程分3个部分:应用程序:事务内完成相关业务数据入库后,需要同步调用RocketMQ消息发送接口,发送状态为prepare消息。消息发送成功后,RocketMQ服务器会回调RocketMQ消息发送者的事件监听器,记录原创 2023-07-07 10:21:35 · 689 阅读 · 0 评论