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

  1. 客户端包含Producer和Consumer两大块

  2. 客户端需要和NameServer交互来获取元数据

  3. 客户端需要和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的模块,然后大概会有一到两篇的篇幅总结一些架构、流程、数据流等。

往期内容:

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

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

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

《消息中间件架构讨论》

《Broker模块划分》

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

消息中间件Client模块划分的更多相关文章

  1. MQ NameServer模块划分

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

  2. Broker模块划分

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

    http 模块简介 Python3 中的 http 包中含有几个用来开发 HTTP 协议的模块. http.client 是一个底层的 HTTP 协议客户端,被更高层的 urllib.request ...

随机推荐

  1. Python os.walk的用法与举例

    os.walk(top, topdown=True, onerror=None, followlinks=False) 可以得到一个三元tupple(dirpath, dirnames, filena ...

  2. 【2017-06-06】Ajax完整结构、三级联动的制作

    一.Ajax完整结构 $.ajax({ url:"Main.ashx", data:{}, dataType:"json", type:"post&q ...

  3. [IR] String Matching

    BWT KMP Boyer-Moore BWT [IR] BWT+MTF+AC 中已经介绍了BWT (Burrows–Wheeler_transform)数据转换算法, 这种变换方式不仅方便压缩,同时 ...

  4. Webpack 资源管理

    Webpack 资源管理

  5. [0] WCF开发下,提示HTTP 无法注册 URL 进程不具有此命名空间的访问权限

    Visual Studio以管理员的身份运行就可以了.

  6. 一篇文章带你快速入门createjs

    开始用createjs这个框架的时候,发现网上的相关教程还是挺少的,所以写一篇文章,方便日后查看.   createjs简介 官网:http://www.createjs.cc/ createjs中包 ...

  7. kaggle Titanic心得

    Titanic是kaggle上一个练手的比赛,kaggle平台提供一部分人的特征,以及是否遇难,目的是预测另一部分人是否遇难.目前抽工作之余,断断续续弄了点,成绩为0.79426.在这个比赛过程中,接 ...

  8. unity3d项目导入android studio

    第一步 拿到unity3d项目,里面包含以下文件 第二步 在android studio下新建一个project 第三步 将unity3d项目目录下的libs下的jar文件复制黏贴到android s ...

  9. Java 变量类型

    局部变量 成员变量 类变量 Java局部变量 局部变量声明在方法.构造方法或者语句块中: 局部变量在方法.构造方法.或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁: 访问修饰符不能用于局 ...

  10. linux统计cdn日志慢请求

    ./stat_ip.sh live-https.log-0510.gz 1000 #首先用shell脚本可以统计出?日志慢请求查询时间超过?秒对应的ip和对应的调用次数(传两个参数) #!/bin/b ...