当前位置:首页 > 科技  > 软件

聊聊 RocketMQ 名字服务

来源: 责编: 时间:2023-08-09 23:03:45 209观看
导读NameServer 是专为 RocketMQ 设计的轻量级名字服务,它的源码非常精简,八个类 ,少于1000行代码。图片这篇文章, 笔者会从基础概念、Broker发送心跳包、NameServer 维护路由、Zookeeper vs NameServer 四个模块揭秘名字服务

NameServer 是专为 RocketMQ 设计的轻量级名字服务,它的源码非常精简,八个类 ,少于1000行代码。2lO28资讯网——每日最新资讯28at.com

图片图片2lO28资讯网——每日最新资讯28at.com

这篇文章, 笔者会从基础概念、Broker发送心跳包、NameServer 维护路由、Zookeeper vs NameServer 四个模块揭秘名字服务的设计精髓。2lO28资讯网——每日最新资讯28at.com

一、基础概念

图片图片2lO28资讯网——每日最新资讯28at.com

NameServer 是一个非常简单的 Topic 路由注册中心,其角色类似 Dubbo 中的 zookeeper ,支持 Broker 的动态注册与发现。2lO28资讯网——每日最新资讯28at.com

RocketMQ 集群工作流程:2lO28资讯网——每日最新资讯28at.com

1、NameServer 启动服务,监听 TCP 端口 , 集群多节点之间无任何信息交互,然后等待 Broker、Producer 、Consumer 连上来;2lO28资讯网——每日最新资讯28at.com

2、Broker 启动后,每隔 30 秒向所有的 NameServer 发送心跳命令 ;2lO28资讯网——每日最新资讯28at.com

3、NameServer 接收到请求之后,保存路由信息在本地内存里 ,将响应结果返给 Broker 服务;2lO28资讯网——每日最新资讯28at.com

4、Producer 启动之后,会随机的选择一个 NameServer ,并从 NameServer 中获取当前发送的 Topic 存在哪些 Broker 上,轮询从队列列表中选择一个队列,然后与队列所在的 Broker 建立长连接从而向 Broker 发消息;2lO28资讯网——每日最新资讯28at.com

5、Consumer 跟 Producer 类似,跟其中一台 NameServer 建立长连接,获取当前订阅 Topic 存在哪些 Broker 上,然后直接跟 Broker 建立连接通道,开始消费消息。2lO28资讯网——每日最新资讯28at.com

二、Broker发送心跳包

我们贴一段 Broker 发送心跳命令的源码:2lO28资讯网——每日最新资讯28at.com

图片图片2lO28资讯网——每日最新资讯28at.com

1、Broker 会每隔 30 秒向所有的 NameServer 发送心跳命令 ;2lO28资讯网——每日最新资讯28at.com

使用 CountDownLatch 实现多线程同步,可以获取发往所有的 NameServer 的心跳命令的响应结果2lO28资讯网——每日最新资讯28at.com

2、心跳命令包含两个部分:请求头和请求体2lO28资讯网——每日最新资讯28at.com

图片图片2lO28资讯网——每日最新资讯28at.com

三、NameServer 维护路由

NameServer 在接收到 Broker 发送的心跳请求之后,通过默认的处理器来处理请求,保存路由信息成功后,注册成功状态返回给 Broker 服务。2lO28资讯网——每日最新资讯28at.com

源码中,我们可以看到路由信息保存在 HashMap 中 。2lO28资讯网——每日最新资讯28at.com

图片图片2lO28资讯网——每日最新资讯28at.com

1、topicQueueTable:Topic 消息队列路由信息,包括 topic 所在的 broker 名称,读队列数量,写队列数量,同步标记等信息,rocketmq 根据 topicQueueTable 的信息进行负载均衡消息发送。2lO28资讯网——每日最新资讯28at.com

2、brokerAddrTable:Broker 节点信息,包括 brokername,所在集群名称,还有主备节点信息。2lO28资讯网——每日最新资讯28at.com

3、clusterAddrTable:Broker 集群信息,存储了集群中所有的 Brokername。2lO28资讯网——每日最新资讯28at.com

4、brokerLiveTable:Broker 状态信息,NameServer 每次收到 Broker 的心跳包就会更新该信息。2lO28资讯网——每日最新资讯28at.com

当 Broker 向 NameServer 发送心跳包(路由信息),NameServer 需要对 HashMap 进行数据更新,但我们都知道 HashMap 并不是线程安全的,高并发场景下,容易出现 CPU 100% 问题,所以更新 HashMap 时需要加锁,RocketMQ 使用了 JDK 的读写锁 ReentrantReadWriteLock 。2lO28资讯网——每日最新资讯28at.com

下面我们看下路由信息如何更新和读取:2lO28资讯网——每日最新资讯28at.com

1、写操作:更新路由信息,操作写锁2lO28资讯网——每日最新资讯28at.com

图片图片2lO28资讯网——每日最新资讯28at.com

2、读操作:查询主题信息,操作读锁2lO28资讯网——每日最新资讯28at.com

图片图片2lO28资讯网——每日最新资讯28at.com


我们可以将 NameServer 实现注册中心的方式总结为:RPC 服务 + HashMap 存储容器 + 读写锁 + 定时任务 。2lO28资讯网——每日最新资讯28at.com

1、NameServer 监听固定的端口,提供 RPC 服务2lO28资讯网——每日最新资讯28at.com

2、HashMap 作为存储容器2lO28资讯网——每日最新资讯28at.com

3、读写锁控制锁的颗粒度2lO28资讯网——每日最新资讯28at.com

4、定时任务2lO28资讯网——每日最新资讯28at.com

  • 每个 Broker 每隔 30 秒注册主题的路由信息到所有 NameServer
  • NameServer 定时任务每隔10 秒清除已宕机的 Broker , 判断宕机的标准是:当前时间减去 Broker 最后一次心跳时间大于2分钟

四、Zookeeper vs NameServer

那为什么 RocketMQ 不用 Zookeeper 做为注册中心呢 ?2lO28资讯网——每日最新资讯28at.com

我们先温习下 CAP 理论。2lO28资讯网——每日最新资讯28at.com

图片图片2lO28资讯网——每日最新资讯28at.com

CAP 理论是分布式架构中重要理论。2lO28资讯网——每日最新资讯28at.com

1、一致性( Consistency ) :所有节点在同一时间具有相同的数据 ;2lO28资讯网——每日最新资讯28at.com

2、可用性( Availability ) :保证每个请求不管成功或者失败都有响应  (某个系统的某个节点挂了,但是并不影响系统的接受或者发出请求) ;2lO28资讯网——每日最新资讯28at.com

3、分隔容忍( Partition tolerance ) :系统中任意信息的丢失或失败不会影响系统的继续运作。 (在整个系统中某个部分,挂掉了,或者宕机了,并不影响整个系统的运作或者说使用) 。2lO28资讯网——每日最新资讯28at.com

Zookeeper 是一个典型的 CP 注册中心 ,通过使 ZAB 协议来保证节点之间数据的强一致性。2lO28资讯网——每日最新资讯28at.com

笔者曾经遇到过一起神州专车服务宕机事故,zookeeper 集群不堪重负,一直在选主 。架构负责人修改了 zookeeper 的 jvm 参数,重启集群后 , 才临时解决了问题。2lO28资讯网——每日最新资讯28at.com

因为 MetaQ 集群和服务治理共用一组 zookeeper 集群 。2lO28资讯网——每日最新资讯28at.com

  • MetaQ 消费者负载均衡时,会频繁的争抢锁 ,同时也会频繁的提交 offset  ;
  • 专车的注册服务也越来越多,注册信息通过Hession 序列化存储在 zookeeper 的节点。

为了减少 zookeeper 集群的性能压力,架构团队将 MetaQ 使用的 zookeeper 集群独立出来。2lO28资讯网——每日最新资讯28at.com

这次事故让我认识到:Zookeeper 作为 CP 注册中心,大规模使用场景下,它就变得很脆弱,我们要非常小心的使用。2lO28资讯网——每日最新资讯28at.com

淘宝中间件博客出了一篇文章 :  阿里巴巴为什么不用 ZooKeeper 做服务发现 ?2lO28资讯网——每日最新资讯28at.com

文章有两个观点,笔者认为非常有借鉴意义。2lO28资讯网——每日最新资讯28at.com

1、当数据中心服务规模超过一定数量 ( 服务规模=F{服务 pub 数,服务 sub 数} ),作为注册中心的 ZooKeeper 很快就会像下图的驴子一样不堪重负。2lO28资讯网——每日最新资讯28at.com

2、可以使用 ZooKeeper,但是大数据请向左,而交易则向右,分布式协调向左,服务发现向右。2lO28资讯网——每日最新资讯28at.com

相比 ZooKeeper ,NameServer 是一个典型的 AP 注册中心,它有如下优点:2lO28资讯网——每日最新资讯28at.com

1、代码不到 1000 行,实现简单,易于维护 ;2lO28资讯网——每日最新资讯28at.com

2、性能极好,除了网络消耗,基本都是本地内存操作 ;2lO28资讯网——每日最新资讯28at.com

3、服务都是无状态,且节点之间并不交互,运维简单;2lO28资讯网——每日最新资讯28at.com

RocketMQ 的设计者之所以选择自研名字服务,遵循着架构设计的准则,笔者总结为:简单、高效、适当妥协。2lO28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-5193-0.html聊聊 RocketMQ 名字服务

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 你的Java程序还在使用阻塞式I/O吗?试试NIO多路复用提高性能!

下一篇: 图解算法,原理逐步揭开「GitHub 热点速览」

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • K6:面向开发人员的现代负载测试工具

    K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 让我们一起聊聊文件的操作

    让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • JVM优化:实战OutOfMemoryError异常

    JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 2天涨粉255万,又一赛道在抖音爆火

    2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 网红炒股不为了赚钱,那就是耍流氓!

    网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就“胡锡进炒股是否知道认真报道”展开讨论。有
  • “买真退假” 这种“羊毛”不能薅

    “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主“七王”在群里介绍一些刷单赚
Top
Baidu
map