Broker


与Namesrv的关系

1.从namesrv获取配置信息

  1. /**
  2. * BrokerConfig类
  3. *
  4. * broker每隔30秒(此时间无法更改)向所有nameserver发送心跳,心跳包含了自身的topic配置信息。
  5. * 这里的“此时间无法更改”是别人的总结,还没搞懂为啥此时间不可更改,明明原版注释中写的是取值范围在10,000到60,000之间
  6. *
  7. * This configurable item defines interval of topics registration of broker to name server. Allowing values are
  8. * between 10, 000 and 60, 000 milliseconds.
  9. */
  10. private int registerNameServerPeriod = 1000 * 30;

2.namesrv检查broker的心跳

  1. /**
  2. * NamesrvController类
  3. * Namesrv定时检查Broker心跳
  4. * 每10秒检查一次,时间戳超过2分钟,则认为Broker失效,从brokerLiveTable中移除
  5. */
  6. this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
  7.  
  8. @Override
  9. public void run() {
  10. NamesrvController.this.routeInfoManager.scanNotActiveBroker();
  11. }
  12. }, 5, 10, TimeUnit.SECONDS);
  13.  
  14. ...
  15.  
  16. /**
  17. * RouteInfoManager类
  18. * Namesrv查看不活跃|失效的Broker
  19. */
  20. public void scanNotActiveBroker() {
  21. Iterator<Entry<String, BrokerLiveInfo>> it = this.brokerLiveTable.entrySet().iterator();
  22. while (it.hasNext()) {
  23. Entry<String, BrokerLiveInfo> next = it.next();
  24. long last = next.getValue().getLastUpdateTimestamp();
  25. if ((last + BROKER_CHANNEL_EXPIRED_TIME) < System.currentTimeMillis()) {
  26. RemotingUtil.closeChannel(next.getValue().getChannel());
  27. it.remove();
  28. log.warn("The broker channel expired, {} {}ms", next.getKey(), BROKER_CHANNEL_EXPIRED_TIME);
  29. this.onChannelDestroy(next.getKey(), next.getValue().getChannel());
  30. }
  31. }
  32. }

3.Namesrv检查与Broker的长连接

  1. /**
  2. * BrokerHousekeepingService类
  3. * 当NameServer和Broker的长连接断掉以后,onChannelDestroy函数会被调用,把这个Broker的信息清理出去。
  4. */
  5. @Override
  6. public void onChannelClose(String remoteAddr, Channel channel) {
  7. this.namesrvController.getRouteInfoManager().onChannelDestroy(remoteAddr, channel);
  8. }
  9.  
  10. /**
  11. * BrokerHousekeepingService类
  12. * 当NameServer和Broker的长连接断掉以后,onChannelDestroy函数会被调用,把这个Broker的信息清理出去。
  13. */
  14. @Override
  15. public void onChannelException(String remoteAddr, Channel channel) {
  16. this.namesrvController.getRouteInfoManager().onChannelDestroy(remoteAddr, channel);
  17. }
  18.  
  19. /**
  20. * BrokerHousekeepingService类
  21. * 当NameServer和Broker的长连接断掉以后,onChannelDestroy函数会被调用,把这个Broker的信息清理出去。
  22. */
  23. @Override
  24. public void onChannelIdle(String remoteAddr, Channel channel) {
  25. this.namesrvController.getRouteInfoManager().onChannelDestroy(remoteAddr, channel);
  26. }

Consumer|Producer


与Namesrv的关系

  1. /**
  2. * ClientConfig类
  3. *
  4. * 默认情况下,消费者每隔30秒从nameserver获取所有topic的最新队列情况,
  5. * 这意味着某个broker如果宕机,客户端最多要30秒才能感知。
  6. *
  7. * 默认情况下,生产者每隔30秒从nameserver获取所有topic的最新队列情况,
  8. * 这意味着某个broker如果宕机,生产者最多要30秒才能感知,在此期间,发往该broker的消息发送失败。
  9. *
  10. * Pulling topic information interval from the named server
  11. */
  12. private int pollNameServerInterval = 1000 * 30;

与Broker的关系

1.客户端(生产者|消费者)向Broker发送心跳

  1. /**
  2. * ClientConfig类
  3. *
  4. * 默认情况下,消费者|生产者 每隔30秒向所有broker发送心跳
  5. *
  6. * Heartbeat interval in microseconds with message broker
  7. */
  8. private int heartbeatBrokerInterval = 1000 * 30;

2.Broker定期检查客户端心跳检查

  1. /**
  2. * ClientHousekeepingService类
  3. *
  4. * Broker定时清理不活动的客户端(生产者|消费者)连接
  5. * 每10秒检查一次,时间戳超过2分钟,则关闭客户端(生产者|消费者)连接
  6. */
  7. public void start() {
  8.  
  9. this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
  10. @Override
  11. public void run() {
  12. try {
  13. ClientHousekeepingService.this.scanExceptionChannel();
  14. } catch (Throwable e) {
  15. log.error("Error occurred when scan not active client channels.", e);
  16. }
  17. }
  18. }, 1000 * 10, 1000 * 10, TimeUnit.MILLISECONDS);
  19. }
  20.  
  21. ...
  22.  
  23. /**
  24. * ClientHousekeepingService类
  25. *
  26. * Broker定时清理不活动的客户端(生产者|消费者)连接
  27. * 每10秒检查一次,时间戳超过2分钟,则关闭客户端(生产者|消费者)连接
  28. */
  29. private void scanExceptionChannel() {
  30. this.brokerController.getProducerManager().scanNotActiveChannel();
  31. this.brokerController.getConsumerManager().scanNotActiveChannel();
  32. this.brokerController.getFilterServerManager().scanNotActiveChannel();
  33. }

3.Broker检查与客户端的长连接

  1. /**
  2. * ClientHousekeepingService类
  3. *
  4. * 当客户端(Producer|Consumer)和Broker的长连接断掉以后,doChannelCloseEvent函数会被调用,把对应客户端(Producer|Consumer)断开连接
  5. */
  6. @Override
  7. public void onChannelClose(String remoteAddr, Channel channel) {
  8. this.brokerController.getProducerManager().doChannelCloseEvent(remoteAddr, channel);
  9. this.brokerController.getConsumerManager().doChannelCloseEvent(remoteAddr, channel);
  10. this.brokerController.getFilterServerManager().doChannelCloseEvent(remoteAddr, channel);
  11. }
  12.  
  13. /**
  14. * ClientHousekeepingService类
  15. *
  16. * 当客户端(Producer|Consumer)和Broker的长连接断掉以后,doChannelCloseEvent函数会被调用,把对应客户端(Producer|Consumer)断开连接
  17. */
  18. @Override
  19. public void onChannelException(String remoteAddr, Channel channel) {
  20. this.brokerController.getProducerManager().doChannelCloseEvent(remoteAddr, channel);
  21. this.brokerController.getConsumerManager().doChannelCloseEvent(remoteAddr, channel);
  22. this.brokerController.getFilterServerManager().doChannelCloseEvent(remoteAddr, channel);
  23. }
  24.  
  25. /**
  26. * ClientHousekeepingService类
  27. *
  28. * 当客户端(Producer|Consumer)和Broker的长连接断掉以后,doChannelCloseEvent函数会被调用,把对应客户端(Producer|Consumer)断开连接
  29. */
  30. @Override
  31. public void onChannelIdle(String remoteAddr, Channel channel) {
  32. this.brokerController.getProducerManager().doChannelCloseEvent(remoteAddr, channel);
  33. this.brokerController.getConsumerManager().doChannelCloseEvent(remoteAddr, channel);
  34. this.brokerController.getFilterServerManager().doChannelCloseEvent(remoteAddr, channel);
  35. }

结合别人的文章,做RocketMQ的一点原理分析,结合源码(尽量)----未完待续的更多相关文章

  1. 分析jQuery源码时记录的一点感悟

    分析jQuery源码时记录的一点感悟      1.  链式写法      这是jQuery语法上的最大特色,也许该改改POJO里的set方法,和其他的非get方法什么的,可以把多行代码合并,减去每次 ...

  2. RocketMQ中Broker的HA策略源码分析

    Broker的HA策略分为两部分①同步元数据②同步消息数据 同步元数据 在Slave启动时,会启动一个定时任务用来从master同步元数据 if (role == BrokerRole.SLAVE) ...

  3. Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...

  4. [已开源/文章教程]独立开发 一个社交 APP 的源码/架构分享 (已上架)

    0x00 背景 真不是和被推荐了2天的博客园一位大神较真,从他那篇文章的索引式文章内容也学习到了很多东西,看评论区那么多对社交APP源码有兴趣的,正巧我上周把我的一个社交APP开源了,包括androi ...

  5. Android应用系列:手把手教你做一个小米通讯录(附图附源码)

    前言 最近心血来潮,突然想搞点仿制品玩玩,很不幸小米成为我苦逼的第一个试验品.既然雷布斯的MIUI挺受欢迎的(本人就是其的屌丝用户),所以就拿其中的一些小功能做一些小demo来玩玩.小米的通讯录大家估 ...

  6. RocketMQ中Broker的刷盘源码分析

    上一篇博客的最后简单提了下CommitLog的刷盘  [RocketMQ中Broker的消息存储源码分析] (这篇博客和上一篇有很大的联系) Broker的CommitLog刷盘会启动一个线程,不停地 ...

  7. 用javascript和html5做一个音乐播放器,附带源码

    效果图: 实现的功能 1.首页 2.底部播放控件 3.播放页面 4.播放列表 5.排行榜 6.音乐搜索 输入搜索关键词,点击放大镜图标 7.侧边栏 目录结构 开发心得与总结 1.轮播图 首先感谢作者S ...

  8. JS和H5做一个音乐播放器,附带源码

    http://mp.weixin.qq.com/s/KpXT9X46AMlUVXQvpHuXGQ 效果图: 实现的功能 1.首页 2.底部播放控件 3.播放页面 4.播放列表 5.排行榜 6.音乐搜索 ...

  9. 使用jquery.validation+jquery.poshytip做表单验证--未完待续

    jqueryValidate的具体使用方法很多,这里就不在赘述,这一次只谈一下怎样简单的实现表单验证. 整片文章目的,通过JQvalidation按表单属性配置规则验证,并将验证结果通过poshyti ...

随机推荐

  1. windows搭建golang环境

    由于墙的存在,很多网址无法下载,推荐https://studygolang.com/dl去下载. windows需要配置几个环境变量,我是下载的压缩文件,所以需要自己配置,通过安装程序安装的应该不需要 ...

  2. sqlserver数据库导出表结构和表数据生成创建表和insert语句

    问题描述: 有时候我们只需要导出一张表和表数据到另外一个数据库,如果是备份整个库的话,就会很麻烦那样,没法满足需求. 解决方法: 以sqlserver2014为例:把MGActivity数据库的bat ...

  3. MongoDB的导入与导出

    一.导入与导出可以操作本地的mongodb也可以是远程的mongodb,通用选项: -h host 主机 --port port 端口 -u username 用户名 -p password 密码 如 ...

  4. Python面试常见的问题

    So if you are looking forward to a Python Interview, here are some most probable questions to be ask ...

  5. Java操作Excel(使用POI)

    背景说明 以前写过使用 JXL 操作Excel的例子,但JXL对于Excel 2007版本以后的文件(即扩展名为 .xlsx)无法读取,也找不到可以支持的包.所以,有时不得不用 POI 来操作Exce ...

  6. Python进程池Pool

    ''' 进程池,启动一个进程就要克隆一份数据,假设父进程1G,那么启动进程开销很大 避免启动太多造成系统瘫痪,就有进程池,即同一时间允许的进程数量 ps:线程没有池,因为线程启动开销小,线程有类似信号 ...

  7. 浏览器和服务器实现跨域(CORS)判定的原理

    前端对Cross-Origin Resource Sharing 问题(CORS,中文又称'跨域')应该很熟悉了.众所周知出于安全的考虑,浏览器有个同源策略,对于不同源的站点之间的相互请求会做限制(跨 ...

  8. Oracle Metric sequence load elapsed time

    Oracle Metric sequence load elapsed time The sequence load elapsed time Oracle metric is the amount ...

  9. 基于 HTML5 结合工业互联网的智能飞机控制

    前言 从互联网+的概念一出来,就瞬间吸引了各行各业的能人志士,想要在这个领域分上一杯羹.现在传统工业生产行业运用互联网+的概念偏多,但是在大众创业万众创新的背景下,“互联网+”涌出了层出不穷的“玩法” ...

  10. 探寻 JavaScript 精度问题

    阅读完本文可以了解到 0.1 + 0.2 为什么等于 0.30000000000000004 以及 JavaScript 中最大安全数是如何来的. 十进制小数转为二进制小数方法 拿 173.8125 ...