rocketmq3.26研究之二broker

来源:互联网 发布:山东七维新材料 知乎 编辑:程序博客网 时间:2024/05/16 14:54
  1. BrokerStartup

    该类为broker启动类,其实现了配置读取,参数设置,初始化BrokerController等等功能

  2. 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中的展示均调用该请求实现
  3. 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时需要指定。
  4. 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级
  5. ConsumerOffsetManager

    consumer消费进度管理

    • 重要属性
      1 ConcurrentHashMap<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
  6. TopicConfigManager

    • 重要字段
      ConcurrentHashMap<String, TopicConfig> topicConfigTable
      存储topic名字,读写权限等
    • 重要方法
      1 load
      默认从${storePathRootDir}/config/topics.json加载持久化的数据
      2 selectTopicConfig(final String topic)
      从topicConfigTable中查询topic配置
  7. 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

  8. ConsumerGroupInfo
    consumer group对应的topic等信息存储

    • 重要属性
      1 ConcurrentHashMap<String/* Topic */, SubscriptionData> subscriptionTable
      topic对应的订阅关系
  9. SubscriptionData

    • 重要属性
      String topic;
      String subString; //订阅的tag,默认为*
  10. ProducerManager

    管理producer group对应的各个连接

  11. 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获取消息
  12. 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将响应写回到请求端
  13. RequestCode

    该类代表了请求的动作,即此次请求时为了干什么,具体请参阅源码

  14. SubscriptionGroupManager
    consumer group管理,包括是否可以消费等,比较简单,不写了,自己参考源码吧。

  15. over
0 0
原创粉丝点击