上图是之前讨论确定的系统架构(后续内容会按照这个架构来叙述),其中:

  1. NameServer做Broker的服务发现,即客户端可以通过NameServer拿到Broker的信息

  2. Broker汇报数据到NameServer

NameServer的模块划分

在进行NameServer的模块划分讨论前,先整理一下NameServer的功能:

  1. 做Broker的服务发现

  2. 提供元数据(Topic、Group等)

  3. 也可以作为Console的操作入口(整个MQ系统是没有DB的,Console可以通过NameServer获取系统信息进行展示)

结合以上提供的功能和之前几篇对系统架构的介绍,NameServer是不需要对数据进行持久化的,因为NameServer的数据都是来自于Broker汇报的。可以认为NameServer是一个无状态的节点。NameServer可以非常方便的做集群部署,高可用之类的,只需要Broker将数据汇报到多个NameServer即可(RocketMQ就是这种架构)。

基于以上的约定(NameServer尽量简单,没有持久化等),对NameServer的模块划分如下。

1. 网络模块

这个不再多说了,属于最基础的公共模块了,Broker、Client、NameServer都会有。

除了基础的网络实现,还有网络相关的就是各个网络请求的处理,比如新建Topic、新建Group等。按照请求来源的维度,NameServer上会包含:

  • ClientPacketHandler

  • BrokerPacketHandler

  • ConsolePacketHandler

  • ...

这些都是网络包的处理入口,可以算到网络模块中。

2. 元数据模块

除去网络模块外,NameServer剩余内容都是对元数据的汇总处理,包含以下组件:

  • TopicManager:Topic元数据的汇总,处理Topic的增删改查

  • GroupManager:Group元数据的汇总,处理Group的增删改查

  • BrokerManager:Broker的管控,进行Broker的上下线及配置变更等

  • PositionManager:汇总位点信息

  • InstanceManager:汇总Consumer和Producer实例

汇总以上内容,NameServer模块如下:

以上是基于NameServer的功能限定下讨论的模块。NameServer在MQ中是最简单的一个大模块,也是和消息发送和消费关系最小的模块,所以只有这么多内容。 (NameServer更多在Consumer、Producer初始化的时候会涉及到,一旦运行起来,过程中并不需要进行太多的交互,所以运行过程中脱离了NameServer也是能正常执行消费和发送的)

RocketMQ的NameServer功能上更加简化,不超过1000行代码。

这就是RocketMQ(开源版本)NameServer所有的代码了

结语

本篇主要是把NameServer的组件罗列一下,相对来说比较简单。

下一篇会开始整理MQ系统中的数据流和操作流程,包括消息和元数据在MQ中的流转、元数据的操作、消息的写入、消息的读取等流程。

往期内容:

《什么是分布式消息中间件》

《消息中间件的一些概念》

《业务方对消息中间件的需求》

《消息中间件架构讨论》

《Broker模块划分》

《Client模块划分》

欢迎关注此公众号,将坚持不懈的写MQ相关的技术文章,希望能和更多的朋友交流。

MQ NameServer模块划分的更多相关文章

  1. Broker模块划分

    本篇在上一篇<消息中间件架构讨论>的基础上分析Broker的模块划分. 上图是之前讨论确定的系统架构(后续内容会按照这个架构来叙述),几点基础: Broker采用主从结构 Broker负责 ...

  2. 消息中间件Client模块划分

    上图是之间讨论确定的系统架构(后续内容会按照这个架构来叙述),其中: 客户端包含Producer和Consumer两大块 客户端需要和NameServer交互来获取元数据 客户端需要和Broker交互 ...

  3. Android 设计随便说说之简单实践(模块划分)

    上篇随笔随(Android 设计随便说说)便说了一下什么是设计以及设计的原则,这里举一个简单的例子来进一步的说Android设计.我们以应用商店的设计来举例. 在设计之前,需要把握两部分内容,才能使得 ...

  4. C模块划分

    模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求.C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行 ...

  5. angularJs项目实战!01:模块划分和目录组织

    近日来我有幸主导了一个典型的web app开发.该项目从产品层次来说是个典型的CRUD应用,故而我毫不犹豫地采用了grunt + boilerplate + angularjs + bootstrap ...

  6. 模块划分--MVVM指南(课程学习)

    实现流水化开发,需要使用“模块划分”的程序开发方式.如此,团队里的每个人负责某项\某几项特定的技术领域,在特定的技术领域更加专业.这样,每个人的效率更高.在专业的技能更熟练,更深入,也会提高队员的成就 ...

  7. FPGA常用设计思想与基本模块划分

    常用设计思想与技巧 (1)乒乓操作; (2)串并转换; (3)流水线操作; (4)异步时钟域数据同步.是指如何在两个时钟不同步的数据域之间可靠地进行数据交换的问题.数据时钟域不同步主要有两种情况: ① ...

  8. Ionic2实战——按模块划分app 创建多module

    http://www.jianshu.com/p/d94324b722af 背景 用ionic2开发过一两个小功能的朋友都会发现,每新建一个页面都需要在\src\app\app.module.ts中添 ...

  9. 用c写的简单的日历(学习模块划分)

    简单日历 ​ 主要目的是学习函数模块划分,成品大概是这样,加了一些花里胡哨的东西(/▽\) ​ 分三个模块,主函数.c 显示.c 计算.c 与.h 文件 有两种实现方式,区别在于是否以数组在模块之间传 ...

随机推荐

  1. 《HelloGitHub》第 20 期

    前言 HelloGitHub 项目已经累积到 3k+ Stars.本项能够走到今天,帮助到越来越多的人.少不了热爱开源.不断为本项目贡献项目的小伙伴们. 贡献者列表 很多人都有想法,付诸于行动在少数, ...

  2. 一位有着工匠精神的博主写的关于IEnumerable接口的详细解析

    在此,推荐一位有着工匠精神的博主写的一篇关于IEnumerable接口的深入解析的文章:http://www.cnblogs.com/zhaopei/p/5769782.html#autoid-0-0 ...

  3. RGBA 和 opacity的区别

    两者都可以设置透明度 区别 RGBA 只影响当前元素 opacity 后代会继承该css 值,暂时还没有办法清除该css 在线演示

  4. 下拉菜单被挡住了,DIV置于最底层的方法

    网站常会用到一些 下拉菜单,,幻灯片,,,飘浮广告等. 但经常会发现.幻灯片会挡住下拉菜单或者飘浮广告等.解决办法有下 第一,可将幻灯片所在DIV 置于最底层.添加CSS如下 style=" ...

  5. swiper3插件无缝滚动配置

    <html> <head> <link rel="stylesheet" href="https://cdn.bootcss.com/Swi ...

  6. post 与get 区别

    刷新/后退按钮 GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交). 书签 GET书签可收藏,POST为书签不可收藏. 缓存 GET能被缓存 缓存是针对URL来进 ...

  7. 使用REST风格架构您需要知道的一些事

    1. REST的由来 2. REST的构成 2.1. 资源 2.2. 资源的表述 2.2.1. MIME(Multipurpose Internet Mail Extensions) 2.2.2. 缓 ...

  8. 【JSOI2008】最大数

    https://www.luogu.org/problem/show?pid=1198 之前刚学完Splay想找题练手的时候做的,写完Splay交上去了才发现这应该是线段树裸题23333 Splay解 ...

  9. Linux入门命令解释(1)

    第一章Linux安装及服务控制 1.  uname -r              //查看linux版本号 2.cat  /proc/cupinfo      //查看CPU信息 3.cat  /p ...

  10. Python笔记·第六章——集合 (set) 的增删改查及 copy()方法

    简介: 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 1.去重,把一个列表变成集合,就自动去重了. ...