RocketMQ源码分析
记录自己对rocketmq的源码分析
djcjcdj
有空多学习,少摸鱼,多睡觉
展开
-
浅析ComsumeQueue和IndexFile对RocketMQ的作用
讲讲IndexFile的存储结构下图就是IndexFile的存储结构。对于一个组件我们要疑惑的问题主要有以下这些?IndexFile是什么?indexFile是rocketmq用来索引消息的hash table数据结构,以文件的形式实现。hash冲突是用链表来解决的一个indexFile最多存储2000w条消息总共包含一个文件。文件由以下几部分组成:indexHead,500w个hash槽和2000w个index条目。那么这其中的曲折关系是什么呢。indexHead的内容非常容易理解,be原创 2020-06-04 01:34:12 · 1257 阅读 · 0 评论 -
手撕RocketMQ源码——TransactionMQProducer
引言事务消息发送的实现Demo方法public static void main(String[] args) throws MQClientException, InterruptedException { TransactionListener transactionListener = new TransactionListenerImpl(); TransactionMQProducer producer = new TransactionMQProducer(原创 2020-05-27 23:50:53 · 522 阅读 · 0 评论 -
IndexFile原码分析
简单点引言示意图build index file引言indexFile是rocketmq的消息offset的索引文件,索引的key是message的uniq_key,由生产者发送消息时生成。示意图使用文件作为的hashMap。整个文件包括40字节长的IndexHead,500w4字节长的hash槽,2000w20字节长的index条目。对key求hash放入hash槽。根据当前的inde...原创 2020-05-26 22:17:38 · 547 阅读 · 0 评论 -
手撕RocketMQ源码——DefaultMQPushConsumer
引言rocketmq提供推拉两种消息模型,本类是推模型实现的用户接口。Demo摘自rocketmq的PushConsumer我们会在后续步骤分析,每一步背后的处理过程。DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_1"); // 设置从哪里开始消费 consumer.setConsumeFromWhere(ConsumeFro原创 2020-05-26 22:16:47 · 504 阅读 · 0 评论 -
手撕RocketMQ源码——PullMessageService
引言拉取消息的管理类。接收拉取消息请求,触发拉取消息流程提供多种请求的方法,立即执行和延迟执行运行方法public void run() { log.info(this.getServiceName() + " service started"); while (!this.isStopped()) { try { PullRequest pullRequest = this.pullRequestQue原创 2020-05-26 22:16:23 · 588 阅读 · 0 评论 -
手撕RocketMQ源码——ConsumeMessageService
引言原创 2020-05-26 22:14:05 · 1029 阅读 · 0 评论 -
手撕RocketMQ源码——队列负载均衡RebalanceImpl
引言是用来做消费者负载均衡的。当有消费者退出,或者新加入时,用来调节多个消费者与队列的消费关系。针对不同的消费者实现类,存在三种不同的rebalance策略,分别的RebalancePullImpl、RebalanceLitePullImpl、RebalancePushImpl。继承RebalanceImpl。RebalancePullImpl...原创 2020-05-24 23:20:32 · 614 阅读 · 0 评论 -
手撕RocketMQ源码——AllocateMessageQueueStrategy
引言集群模式消费、推模式下的消息队列的负载均衡算法策略模式包括一致性hash、平均分配、平均轮询分配、自定义消费队列、按机房hash算法实现原创 2020-05-24 22:49:10 · 1636 阅读 · 0 评论 -
DefaultMQPullConsumer源码分析
引言rocketmq支持推拉两种模型的消息消费,此类是拉模型的实现类。据说是通过长轮询实现,今天让我们看看具体的代码实现。类图我们可以看到DefaultMQPullConsumer有很清晰的类关系。ClientConfig是集成了生产者和消费者的统一配置类。使用MQPullConsumer定义了拉模型的接口,MQConsumer定义了推拉模型通用的接口,客户端也需要实现MQAdmin接口,用...原创 2020-05-20 22:16:05 · 309 阅读 · 0 评论 -
DefaultMQPullConsumerImpl源码分析
引言拉模型的内部实现类。主要属性private final InternalLogger log = ClientLogger.getLog(); private final DefaultMQPullConsumer defaultMQPullConsumer; private final long consumerStartTimestamp = System.curre...原创 2020-05-20 22:14:56 · 297 阅读 · 0 评论 -
PullAPIWrapper源码分析
引言消费者的核心类。构造函数public PullAPIWrapper(MQClientInstance mQClientFactory, String consumerGroup, boolean unitMode) { this.mQClientFactory = mQClientFactory; this.consumerGroup = consumer...原创 2020-05-20 22:13:51 · 355 阅读 · 0 评论 -
PullMessageProcessor源码分析
引言broker接收客户端拉取消息请求的处理器。主要方法校验合法性调用messageStore获取GetMessageResultprivate RemotingCommand processRequest(final Channel channel, RemotingCommand request, boolean brokerAllowSuspend) throw...原创 2020-05-20 22:13:39 · 338 阅读 · 0 评论 -
PullRequestHoldService源码分析
引言长轮询的实现类。rocketmq高效的特性。长轮询的主要实现原理是:把需要hold的拉取请求交给hold线程统一处理。每隔指定5s校验一次消息是否到达,超时或者检测到消息到达则通过netty写回数据给客户端。 客户端可以同步阻塞也可异步回调。 请求和响应之间通过opaque关联,在客户端处理。主要方法提交拉取请求方法。public void suspendPullRequest(final String topic, final int queueId, final PullRequest原创 2020-05-20 22:12:22 · 461 阅读 · 0 评论 -
OffsetStore源码分析
引言OffsetStore有两种实现类,本地文件和broker存储两种。 默认是集群模式下使用broker存储,广播模式下使用本地文件。LocalFileOffsetStore从本地文件恢复offset配置。配置在文件中以json形式存在。@Override public void load() throws MQClientException { OffsetS...原创 2020-05-05 16:27:34 · 353 阅读 · 0 评论 -
RocketMQ | HA机制
引言rocketmq有两种高可用模式,主从模式和多副本模式。本文主要讲解主从模式。主从模式的实现入口类是HAServiceHAService会在master节点启动NIO的ServerSocketChannel。使用AcceptSocketService类负责接收Accept事件,并把SocketChannel封装成HAConnection。使用GroupTransferService...原创 2020-04-25 23:12:26 · 278 阅读 · 0 评论 -
Broker启动流程源码分析
引言broker是接收存储生产者的消息,提供给消费者。启动流程Broker的启动流程主要是两个类。BrokerController和BrokerStartup。BrokerStartup是管理BrokerController的生命周期。//启动的入口public static void main(String[] args) { start(createBrokerCo...原创 2020-04-25 21:13:05 · 160 阅读 · 0 评论 -
BrokerController源码分析
引言broker是接收存储生产者的消息,提供给消费者。维护内部核心类的生命周期。启动流程Broker的启动流程主要是两个类。BrokerController和BrokerStartup。BrokerStartup是管理BrokerController的生命周期。核心类网络通信NettyRemotingServerNettyRemotingServer源码分析业务逻辑处理Bro...原创 2020-04-25 21:12:59 · 277 阅读 · 0 评论 -
Broker的请求处理器
引言broker在初始化方法中注册了很多的请求处理器。此文作为这些处理器的统一索引SendMessageProcessor源码分析ReplyMessageProcessor源码分析NettyRequestProcessor源码分析ClientManageProcessor源码分析ConsumerManageProcessor源码分析EndTransactionProcessor源码...原创 2020-04-25 21:12:36 · 161 阅读 · 0 评论 -
SendMessageProcessor源码分析
引用原创 2020-04-25 21:06:20 · 938 阅读 · 0 评论 -
DefaultMessageStore源码分析
引言broker的核心类实现了MessageStore接口,broker默认消息存储实现类,完全负责broker的消息存储和消息获取。‘’MessageStorepublic interface MessageStore { /** * Load previously stored messages. * * @return true if succ...原创 2020-04-25 21:05:31 · 478 阅读 · 1 评论 -
CommitLog源码分析
引言核心类主要方法普通消息的异步存储方法public CompletableFuture<PutMessageResult> asyncPutMessage(final MessageExtBrokerInner msg) { // Set the storage time msg.setStoreTimestamp(System.current...原创 2020-04-25 20:56:56 · 188 阅读 · 0 评论 -
Broker关键的运行时机制
引用broker启动了很多的线程和定时任务,维护系统的稳健正常运行。此文汇总以下的运行时机制。刷盘机制slave消息同步机制(HA机制)客户端管理机制NameServer定时注册机制多副本同步机制(DLedgerCommitLog)刷盘机制...原创 2020-04-25 20:56:20 · 350 阅读 · 0 评论 -
MappedFileQueue源码分析
引言核心类构造器public MappedFileQueue(final String storePath, int mappedFileSize, AllocateMappedFileService allocateMappedFileService) { this.storePath = storePath; this.mappedFile...原创 2020-04-25 20:53:55 · 262 阅读 · 0 评论 -
MappedFile源码分析
引言核心类持有文件映射内存buffer屏蔽了文件映射内存buffer的实现。负责把请求写入buffer。不知道刷盘是否在这,fixme主要属性// 系统页大小 4K public static final int OS_PAGE_SIZE = 1024 * 4; protected static final InternalLogger log = InternalL...原创 2020-04-25 20:51:41 · 352 阅读 · 0 评论 -
RocketMQ部署运维,看这一篇就够了
运维管理1 集群搭建1.1 单Master模式这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,可以用于本地测试。1)启动 NameServer### 首先启动Name Server$ nohup sh mqnamesrv & ### 验证Name Server 是否启动成功$ tail -f ~/logs/rocketmq...翻译 2020-04-21 22:52:27 · 465 阅读 · 0 评论 -
AllocateMappedFileService源码分析
引言创建MappedFile的类。使用了生产者消费者模式创建文件。使用了ConcurrentHashMap put是否因为单个文件大小为1G,所有使用一个消费者创建mappedFile较为合适类图主要属性private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.STORE...原创 2020-04-19 22:54:03 · 616 阅读 · 0 评论 -
Broker消息存储过程
引言在生产者一章中,producer在调用NettyRemotingClient给broker发送消息(普通消息、事务消息、批量消息)后,那么broker是怎么处理消息的呢?且听这回分解。Broker接收消息...原创 2020-04-19 22:52:09 · 188 阅读 · 0 评论 -
NettyRemotingAbstract源码分析
引言NettyRemotingAbstract是NettyRemotingClient和NettyRemotingServer的父类,定义了三种使用netty+AQS实现的调用方法和其他的处理。rpc的hook在此层处理主要方法processMessageReceivedNettyClientHandler和NettyServerHandler在收到消息后,都会调用此方法。public...原创 2020-04-19 21:47:10 · 454 阅读 · 0 评论 -
NettyRemotingServer源码分析
引言使用netty作为网络通信框架,实现了RemotingServer接口。RemotingServer接口public interface RemotingServer extends RemotingService { void registerProcessor(final int requestCode, final NettyRequestProcessor proces...原创 2020-04-12 18:13:08 · 286 阅读 · 0 评论 -
RocketMQ Message
引言用户发送消息封装类是Message和MessageBatch,分别是普通消息和批量消息主要属性private String topic; private int flag; private Map<String, String> properties; private byte[] body; private String transactio...原创 2020-04-11 15:14:18 · 1424 阅读 · 1 评论 -
Producer源码分析
引言rocketmq支持3种发送消息方式:同步,异步,单向(oneway)主要关注的点:rocketmq消息结构生产者的启动流程消息发送过程批量消息发送过程主要的问题是:消息队列如何负载?消息发送如何实现高可用?批量消息发送如何实现一致性?Messagerocketmq的消息封装类是Message类的主要结构如下public class Message impl...原创 2020-04-11 16:09:40 · 244 阅读 · 0 评论 -
DefaultMQProducerImpl源码分析
引用实现了MQProducerInner接口MQProducerInner这层接口是与MQClientInstance交互的public interface MQProducerInner { Set<String> getPublishTopicList(); boolean isPublishTopicNeedUpdate(final String top...原创 2020-04-11 13:28:58 · 952 阅读 · 0 评论 -
MQClientAPIImpl源码分析
引言解耦用户接口和远程调用接口。负责用户接口的发送消息的处理和接收broker的响应。持有RemotingClient接口,并向remotingClient注册了几种requestCode的处理器ClientRemotingProcessor。这一层是处理head和msgBody转换成RemotingCommand,broker的响应RemotingCommand和sendResult的转换...原创 2020-04-11 12:18:05 · 596 阅读 · 0 评论 -
MQClientInstance源码分析
引用由MQClientManager维护,使用IP地址作为key,MQClientInstance作为value,维护对应关系一个jvm中的producer、consumer共享一个客户端实例有点外观模式的感觉,是对整个MQClient的封装,依赖较多类(ClientConfig、MQClientAPIImpl、MQAdminImpl)MQClientManager单例模式根据cli...原创 2020-04-11 13:37:32 · 469 阅读 · 0 评论 -
NettyRemotingClient源码分析
引言rocketmq远程调用客户端的实现类,使用netty作为网络框架。继承NettyRemotingAbstract。NettyRemotingAbstract封装了同步、异步、oneway调用的具体实现,方便子类(NettyRemotingClient和NettyRemotingServer)复用NettyRemotingClient的三种请求方法发送请求的异常处理同步发送请求/...原创 2020-04-10 23:33:17 · 970 阅读 · 2 评论 -
ClientRemotingProcessor源码分析
引言MQClientAPIImpl 持有此对象,在构造函数中往remotingClient注册了几种code的处理netty客户端收到消息后,会触发此类处理对应requestCode的业务逻辑主要方法主要方法public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand re...原创 2020-04-11 12:23:02 · 249 阅读 · 0 评论 -
NameServer源码分析
NameServerController主要属性NamesrvConfig是nameserver全局的一些配置属性,定义了从哪些运行环境的path获取配置NettyServerConfig定义了netty server的配置参数,包括监听端口,工作线程数量,一些阀值等ScheduledExecutorService执行定时任务的线程池KVConfigManager本地的kv存储...原创 2020-03-29 23:04:51 · 255 阅读 · 0 评论 -
RocketMQ源码阅读——单点突破
引言使用此文单独记录阅读源码过程中,一些没见过的,没用过,不熟悉的类类DefaultEventExecutorGroupExecutors的4中类型的线程池固定线程大小线程池:最多多少个线程执行,留给其他任务执行的空间定时执行线程池:适合定时任务单个线程线程池:适合任务需要串行顺序执行的场景60s存活时间的线程池:适合大量短时间的异步任务ForkJoinPool:这个没用过 以...原创 2020-03-29 23:03:40 · 82 阅读 · 0 评论