rocketmq3.26研究之二broker
来源:互联网 发布:山东七维新材料 知乎 编辑:程序博客网 时间:2024/05/16 14:54
BrokerStartup
该类为broker启动类,其实现了配置读取,参数设置,初始化BrokerController等等功能
BrokerController
broker功能实现类,包含一些列组件
- 重要属性
1 BrokerConfig broker的一些基础配置
2 MessageStoreConfig包含一些数据存储相关的配置
3 ConsumerOffsetManager consumer消费进度管理者
4 MessageStore messageStore
消息存储实现,参照DefaultMessageStore
5 TopicConfigManager topicConfigManager topic配置管理
6 PullMessageProcessor pullMessageProcessor
客户端拉取消息请求处理
7 RemotingServer remotingServer - 重要方法
1 registerProcessor
注册一系列处理器来处理客户端请求,或响应客户端请求
包括
1.1 处理客户端发送的消息处理器-SendMessageProcessor
1.2 处理客户端拉取消息处理器-PullMessageProcessor
1.3 根据消息的key或消息id查询消息-QueryMessageProcessor
1.4 客户端连接管理-ClientManageProcessor(包括客户端心跳,客户端连接注销,根据consumergroup查询consumer id列表,客户端offset上报(参见MQClientInstance.start),客户端offset查询)
1.5 broker管理类请求处理-AdminBrokerProcessorrocketmq-console中的展示均调用该请求实现
- 重要属性
BrokerConfig
- 重要属性
1 namesrvAddr,形如: ip:port;ip:port;…
2 brokerIP1,broker所在的机器ip,默认不用设置,如果机器有多个网卡,需要手动设置
3 brokerIP2, 改属性默认值同brokerIP1,其作用为slave从master的brokerIP2同步数据。
4 brokerName,作用为一组master与slave通过brokerName是否相同来标示,通过brokerId来区分master还是slave
5 brokerId, 0:master 非0:slave
6 brokerClusterName: 整个broker集群的名字,创建topic时需要指定。
- 重要属性
MessageStoreConfig
- 重要属性
1 storePathRootDir,数据存放的根目录
2 storePathCommitLog,commitlog存放的路径
3 mapedFileSizeCommitLog = 1024 * 1024 * 1024,每个commitlog大小,默认为1G
4 mapedFileSizeConsumeQueue = 300000 * 20,消费队列文件大小,默认为存储30W条消息,每条消息20个字节,详细参考ConsumeQueue
5 flushIntervalCommitLog = 1000,commit log刷盘间隔,默认1秒
6 flushCommitLogTimed = false,是否定时刷盘,默认为实时刷盘,详细请参考CommitLog
7 flushIntervalConsumeQueue = 1000,消费队列刷盘间隔,默认为1秒
8 fileReservedTime = 72,文件保留时间(单位小时),默认为3天
9 deleteWhen = “04”,何时触发删除文件, 默认凌晨4点删除文件
10 BrokerRole brokerRole = BrokerRole.ASYNC_MASTER,broker的角色:异步复制的master,同步双写的master,slave
11 flushDiskType = FlushDiskType.ASYNC_FLUSH,刷盘:同步,异步
12 syncFlushTimeout 同步刷盘超时时间,默认为5秒
13 messageDelayLevel 定时消息级别,默认为1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h分别对应1~18级
- 重要属性
ConsumerOffsetManager
consumer消费进度管理
- 重要属性
1ConcurrentHashMap<String/* topic@group */, ConcurrentHashMap<Integer/*queue id*/, Long>> offsetTable
- 重要方法
1 load
默认从${storePathRootDir}/config/consumerOffset.json
加载持久化的数据
2 persist
将offsetTable持久化到文件
3 scanUnsubscribedTopic
从offsetTable中扫描订阅关系不存在的记录(参照ConsumerManager.findSubscriptionData),并且offset比该queue的最小offset还小,移除之。
4 commitOffset(final String group, final String topic, final int queueId, final long offset)
提交offset,存储客户端的offset,客户端的提交请求参考MQClientInstance.offset
5 long queryOffset(final String group, final String topic, final int queueId)
查询offset
- 重要属性
TopicConfigManager
- 重要字段
ConcurrentHashMap<String, TopicConfig> topicConfigTable
存储topic名字,读写权限等 - 重要方法
1 load
默认从${storePathRootDir}/config/topics.json
加载持久化的数据
2 selectTopicConfig(final String topic)
从topicConfigTable中查询topic配置
- 重要字段
ConsumerManager
Consumer连接、订阅关系管理
重要属性
ConcurrentHashMap<String/* Group */, ConsumerGroupInfo> consumerTable
存储了consumer group与ConsumerGroupInfo的对应关系重要方法
1 findSubscriptionData(String group, String topic)
根据group从consumerTable中查找ConsumerGroupInfo,从ConsumerGroupInfo.subscriptionTable中查找SubscriptionData
2 getConsumerGroupInfo(String group)
根据consumer group从consumerTable查询ConsumerGroupInfo
ConsumerGroupInfo
consumer group对应的topic等信息存储- 重要属性
1ConcurrentHashMap<String/* Topic */, SubscriptionData> subscriptionTable
topic对应的订阅关系
- 重要属性
SubscriptionData
- 重要属性
String topic;
String subString; //订阅的tag,默认为*
- 重要属性
- ProducerManager
管理producer group对应的各个连接
PullMessageProcessor
客户端拉取消息的请求由类处理,客户端发送请求参考MQClientAPIImpl
- 重要方法
1 processRequest(ChannelHandlerContext ctx, RemotingCommand request)
调用下面的processRequest
2 processRequest(Channel channel, RemotingCommand request, boolean brokerAllowSuspend)
处理请求,包括一些校验,处理步骤如下:
2.1 解析请求参数
2.2 检查broker是否有可读权限
2.3 检查consumer group是否存在且可以消费,参考SubscriptionGroupManager
2.4 检查topic是否存在且可读,参考selectTopicConfig
2.5 检查topic的queue的可读数量与消费者请求的是否匹配
2.6 从ConsumerManager.getConsumerGroupInfo获取ConsumerGroupInfo
2.7 调用DefaultMessageStore.getMessage获取消息
- 重要方法
NettyRemotingServer
RemotingServer的默认实现为该类,
- 重要字段
HashMap<Integer/* request code */, Pair<NettyRequestProcessor, ExecutorService>> processorTable
请求值对应的处理器 - 重要方法
1 registerProcessor(int requestCode, NettyRequestProcessor processor, ExecutorService executor)
将RequestCode的值,注册对应处理器和线程池
2 start
启动netty,处理请求,所有请求将调用该方法(processMessageReceived)处理
3 processMessageReceived(ChannelHandlerContext ctx, RemotingCommand msg)
该方法针对请求还是响应调用相应的处理方法,我们先看下请求的处理方法processRequestCommand
4 processRequestCommand(final ChannelHandlerContext ctx, final RemotingCommand cmd)
4.1 首先根据cmd.getCode()获取客户端请求的code
4.2 根据code从processorTable查找NettyRequestProcessor
4.3 我们假设本次请求为RequestCode.PULL_MESSAGE,那么查找到的处理器为PullMessageProcessor
4.4 调用处理器的processRequest方法
4.5 调用ctx.writeAndFlush将响应写回到请求端
- 重要字段
RequestCode
该类代表了请求的动作,即此次请求时为了干什么,具体请参阅源码
SubscriptionGroupManager
consumer group管理,包括是否可以消费等,比较简单,不写了,自己参考源码吧。- over
- rocketmq3.26研究之二broker
- rocketmq3.26研究之三NameServer
- rocketmq3.26研究之四DefaultMQProducer
- rocketmq3.26研究之五DefaultMQPushConsumer
- rocketmq3.26研究之Failover下producer的表现
- rocketmq3.26研究之Failover下consumer的表现
- rocketmq3.26研究之六DefaultMQPushConsumer消费流程
- rocketmq3.26研究之一存储层
- MQTT的学习研究(二)moquette-mqtt 的使用之mqtt broker的启动
- 研究心得之二
- PhoneGap研究之二
- MQTT的学习研究(2)moquette-mqtt 的使用之mqtt broker的启动
- MQTT协议之broker
- 多线程断点续传研究之二
- 多线程断点续传研究之二
- 多线程断点续传研究之二
- 多线程断点续传研究之二
- HLSL 研究学习 之二
- ubuntu flash 安装
- Git研究(2)——Git服务器搭建
- ie8及以下无法识别html5新增标签,怎么破?
- 最新WingIDE注册破解方法
- 10022---varnish配置详解
- rocketmq3.26研究之二broker
- bzoj2209 括号序列 splay
- 单点登录cas常见问题(五) - service有哪些存储方式?
- 安卓 bitmap绘图
- java实现二分检索树
- rocketmq3.26研究之五DefaultMQPushConsumer
- SSH框架总结
- [maya学习笔记(7)] 物体的显示与隐藏 大纲视图的使用
- python sched实现任务调度