本篇在上一篇《消息中间件架构讨论》的基础上分析Broker的模块划分。

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

  1. Broker采用主从结构

  2. Broker负责持久化元数据并汇报到NameServer

  3. Client从NameServer获取元数据,然后从Broker读取消息

Broker的模块划分

1 网络模块

Broker需要和NameServer及Client通信,包括Broker之间也需要通信(主从结构),所以Broker会有一个模块(Net&PacketHandler)用于所有网络包的处理。

2 元数据相关

我们会将NameServer尽量做的简单,所以NameServer不会持久化任何数据。最终NameServer是无状态的,所有数据来源于Broker上报,所以元数据会持久化在Broker上。除了持久化Topic、Group这样的元数据,Broker还需要保存消费进度。

另外,为了保证分区内数据的顺序性,需要确保一个分区在一个时刻只会有一个线程来消费,所以Broker端需要提供接口对分区执行加锁操作。我们采用租约的方式来实现:Client需要对获取到分区的租约才能对分区进行消费。所以Broker会包含一个租约模块(Leaser)。

所以Broker元数据模块会包含以下几块:

  • TopicManager

  • GroupManager

  • CursorManager

  • Leaser

4 消息写入模块

消息从Client发送到Broker,Broker接收到消息后会增强消息属性,比如给消息添加索引位置、存储位置、存储时间等属性,然后进行持久化。所以Broker端会有一个模块处理写入请求(Writer)。

5 消息读取模块

Broker需要将持久化的消息读取出来返回给客户端,且持久化WAL是多个Topic共享的,所以需要一个独立的读取模块(Reader)的从WAL的不同位置读取数据拼装成最终的结果返回给客户端。

6 存储模块

最终所有消息是要落盘的,所以Broker肯定包含了一个存储模块。存储模块使用WAL的方式实现,分为两块:存储队列和索引队列,消息会被写入到存储队列,然后构建索引,这块内容会在之后的Broker实现部分详细介绍。

(存储模块应该是整个消息中间件中最复杂的模块,本篇没有展现介绍,会在介绍系统具体实现时详细的描述整个存储层的实现)

除了以上这些模块外,Broker采用主从架构,必然会有负责主从复制的模块,还包括元数据的备份策略(元数据也是需要有多个备份的)。除此之外可能还有监控统计模块,用于监测系统状态,但这不在我们讨论的范围。

总结以上内容,Broker的模块大致如下:

结语

本篇内容主要是简单的介绍一下Broker内部模块的划分。按照计划,后续两篇内容应该分别是《NameServer模块分析》、《Client模块分析》,之后是开始进入详细设计的阶段,会开始定义各个实体及协议。

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

Broker模块划分的更多相关文章

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

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

  2. MQ NameServer模块划分

    上图是之前讨论确定的系统架构(后续内容会按照这个架构来叙述),其中: NameServer做Broker的服务发现,即客户端可以通过NameServer拿到Broker的信息 Broker汇报数据到N ...

  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. 代码检查工具jshint和csslint

    前面的话 Douglas Crockford大神根据自己的理念用JavaScript写了一个JavaScript代码规范检查工具,这就是JSLint.后来非常流行,也的确帮助了广大的JavaScrip ...

  2. Mapreduce在Yarn调用出错

    共享原因:虽然用一篇博文写问题感觉有点奢侈,但是搜索百度,相关文章太少了,苦苦探寻日志才找到解决方案. 遇到问题:mapreduce程序一直迟迟没有结果. [QC] INFO [main] org.a ...

  3. textarea placeholder文字换行

    要实现这样的效果 第一反应是直接在placeholder属性值里输入\n换行,如: <textarea rows="5" cols="50" placeh ...

  4. Vue单文件组件基础模板

    背景 相信大家在使用Vue开发项目时,基本都是以单文件组件的形式开发组件的,这种方式好处多多: 1.代码集中,便于开发.管理和维护 2.可复用性高,直接将vue文件拷贝到新项目中 我暂时就想到这两点, ...

  5. 在chrome下鼠标拖动层变文本形状的问题

    学JQ也有一段时间了,想自己写个鼠标拖动层移动的效果(很简单,只是为了练习而已)于是就写下了下面的代码 <!DOCTYPE html> <html> <head> ...

  6. 简单两步快速学会使用Mybatis-Generator自动生成entity实体、dao接口和简单mapper映射(用mysql和oracle举例)

    前言: mybatis-generator是根据配置文件中我们配置的数据库连接参数自动连接到数据库并根据对应的数据库表自动的生成与之对应mapper映射(比如增删改查,选择性增删改查等等简单语句)文件 ...

  7. Nginx实用教程(二):配置文件入门

    Nginx配置文件结构 nginx配置文件由指令(directive)组成,指令分为两种形式,简单指令和区块指令. 一条简单指令由指令名.参数和结尾的分号(;)组成,例如: listen backlo ...

  8. Web前端知识体系精简

    Web前端技术由html.css和javascript三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低于任何一门后端语言.而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学习新的知 ...

  9. 行内元素和块级元素的具体区别是什么?行内元素的padding和margin可设置吗?

    块级元素(block)特性: 总是独占一行,表现为另起一行开始,而且其后的元素也必须另起一行显示; 宽度(width).高度(height).内边距(padding)和外边距(margin)都可控制; ...

  10. TortoiseGit保存密码

    TortoiseGit保存密码 方法一:使用Bash命令 1.设置name和emailgit config --global user.name "yilei"git config ...