消息中间件Client模块划分
上图是之间讨论确定的系统架构(后续内容会按照这个架构来叙述),其中:
客户端包含Producer和Consumer两大块
客户端需要和NameServer交互来获取元数据
客户端需要和Broker交互来读写消息
Client模块划分
1. 网络模块
第一个仍然是网络模块。Client需要获取元数据,需要读写消息,网络模块是必不可少的。 和Broker不同的是,Client的网络模块要简单一些。Broker需要向NameServer汇报数据,同时还要处理来自Client的请求,而Client更多的只是发出请求:
向NameServer获取元数据
向Broker写入消息
从Broker获取消息
2. 编解码模块
Client需要将消息写到Broker,同时也需要从Broker获取消息,这两个过程会涉及到消息的编解码。
3. 元数据相关
Client相关的元数据有Topic、消费进度、Group(之前介绍过的概念,可以看之前的文章),另外还需要感知其他的客户端的存在(叫Member信息或者Client Instance信息吧),所以需要Member数据。那么元数据相关大概是以下组件:
TopicManager
PositionManager
GroupManager
MemberManager
4. 发送相关
Producer API
对于Client而言,很重要的一个模块就是暴露出去的发送和消费的API,这是使用方唯一能接触到的地方(写代码时,任何暴露出去的API已经要谨慎谨慎再谨慎)。
对于发送的API,从不同的角度可以分为:
从发送方式上有同步发送和异步发送
从发送消息量上有单条发送和批量发送
路由模块
对于发送而言,一条消息最终需要落到某一个确定的分区上。所以客户端会包含一个路由模块来根据消息的属性和Topic的元信息来选择分区。
5. 消费相关
Consumer API
消费相关的API会比发送的复杂一些,因为消费需要提供更多的模式。另外为了保证顺序性、减少消息的重复等,消费还需要引入租约等组件。租约和Consumer的各种模式已经是比较细节的问题了,在设计阶段在进行介绍。
分区分配模块
发送方需要选择将消息写入到哪个分区,而消费方需要决定自己消费哪些分区,所以对应于发送方的路由模块,消费方会有分区分配的模块。
缓存模块
为了保证性能,Consumer从Broker获取消息和使用方消费消息是异步的,中间需要Buffer来缓存消息,所以Consumer相对于Producer会多一个缓存模块。
除了以上模块,还会有LifeCycle这样生命周期相关的基础模块,这个也是上一篇在介绍Broker模块时遗漏的。
总结以上内容,Client包含的模块大概如下:
结语
本篇主要是把Client的几个模块划分出来,为之后的详细设计做准备。 下一篇会整理一下NameServer的模块,然后大概会有一到两篇的篇幅总结一些架构、流程、数据流等。
往期内容:
欢迎关注此公众号,将坚持不懈的写MQ相关的技术文章,希望能和更多的朋友交流。
消息中间件Client模块划分的更多相关文章
- MQ NameServer模块划分
上图是之前讨论确定的系统架构(后续内容会按照这个架构来叙述),其中: NameServer做Broker的服务发现,即客户端可以通过NameServer拿到Broker的信息 Broker汇报数据到N ...
- Broker模块划分
本篇在上一篇<消息中间件架构讨论>的基础上分析Broker的模块划分. 上图是之前讨论确定的系统架构(后续内容会按照这个架构来叙述),几点基础: Broker采用主从结构 Broker负责 ...
- Android 设计随便说说之简单实践(模块划分)
上篇随笔随(Android 设计随便说说)便说了一下什么是设计以及设计的原则,这里举一个简单的例子来进一步的说Android设计.我们以应用商店的设计来举例. 在设计之前,需要把握两部分内容,才能使得 ...
- C模块划分
模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求.C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行 ...
- angularJs项目实战!01:模块划分和目录组织
近日来我有幸主导了一个典型的web app开发.该项目从产品层次来说是个典型的CRUD应用,故而我毫不犹豫地采用了grunt + boilerplate + angularjs + bootstrap ...
- 模块划分--MVVM指南(课程学习)
实现流水化开发,需要使用“模块划分”的程序开发方式.如此,团队里的每个人负责某项\某几项特定的技术领域,在特定的技术领域更加专业.这样,每个人的效率更高.在专业的技能更熟练,更深入,也会提高队员的成就 ...
- FPGA常用设计思想与基本模块划分
常用设计思想与技巧 (1)乒乓操作; (2)串并转换; (3)流水线操作; (4)异步时钟域数据同步.是指如何在两个时钟不同步的数据域之间可靠地进行数据交换的问题.数据时钟域不同步主要有两种情况: ① ...
- Ionic2实战——按模块划分app 创建多module
http://www.jianshu.com/p/d94324b722af 背景 用ionic2开发过一两个小功能的朋友都会发现,每新建一个页面都需要在\src\app\app.module.ts中添 ...
- Python3中的http.client模块
http 模块简介 Python3 中的 http 包中含有几个用来开发 HTTP 协议的模块. http.client 是一个底层的 HTTP 协议客户端,被更高层的 urllib.request ...
随机推荐
- LinkedList集合
LinkedList集合特点: 1,有序,允许重复(有序指与添加顺序一致) 2,有下标,可以通过下标获取元素,以及将元素插入指定位置 3,底层使用的数据结构是链表以及堆栈结构,线程不安全 4,链表内存 ...
- 基于BUI开发Asp.net MVC项目
因工作性质参于并开发过一些Web应用程序,前端项目框架也用了不少,比如MiniUI.ExtJS.以及定制的项目前端框架.无意中看到BUI前端框架,第一眼就被它的优雅布局所吸引.简洁的项目门户Banne ...
- HTML----网页基础和基本标签
网页分类: 1.静态网页:所有内容全写死,都写在源代码中,若修改必须修改源代码,后缀为.html或htm 2.动态网页:内容大部分来自于数据库,可以修改,后缀为.aspx(c#).jsp(java). ...
- nodejs零基础详细教程1:安装+基础概念
第一章 建议学习时间2小时 课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...
- SpringMVC form:form的一个错误(没有传到前台绑定类)
SpringMVC form:form的一个错误(没有传到前台绑定类) 报错信息: Neither BindingResult nor plain target object for bean nam ...
- 【论文:麦克风阵列增强】Speech Enhancement Based on the General Transfer Function GSC and Postfiltering
作者:桂. 时间:2017-06-06 16:10:47 链接:http://www.cnblogs.com/xingshansi/p/6951494.html 原文链接:http://pan.ba ...
- ADO.NET中的DataSet和DataReader
ADO.NET提供两个对象用于检索关系型数据并把它存储在内存中,分别是DataSet和DataReader.DataSet提供内存中关系数据的表现--包括表和次序.约束等表间的关系的完整数据集合.Da ...
- position定位和添加阴影
定位:style="position: absolute; bottom: 0; width: 100%;background: rgb(255, 255, 255);padding-bot ...
- 使用Swagger实现webapi接口自动化文档生成
这里是实现自动化api稳当的生成,在网上看了很多swagger的文档,可能都是在为实现接口时直接使用的swagger,其实步骤差不多,但是更加详细的我还没看到,又或者说,我看着文档来的时候还是出错啦, ...
- PHP把2个二维数组合并一个二维数组
$a = array(0 => Array(id => 66,class_name => www.iiwnet.com),1 => Array(id => 67,clas ...