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

  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. JS闭包,以及适用场景

    闭包的定义 不用解释了,网上到处都是.简单的说:一个定义在函数内部的函数与包含它的外部函数构成了闭包,内部函数可以访问外部函数的变量,这些变量将一直保存在内存中,直到无法再引用这个内部函数 举个例子: ...

  2. Spring学习(6)---Bean定义及作用域的例子

    (一)Bean的定义 先定义一个BeanAnnotation package com.mypackage; import org.springframework.stereotype.Componen ...

  3. 写JS自执行函数时要注意的

    JS是非强类型语言,且IDE也不够智能,所以经常会在语句结束时漏写了分号,一般情况下这是不影响运行的, 但如果后面跟上的是一段自执行的函数,就会报出 "..... is not functi ...

  4. android6.0搜索蓝牙无法显示问题解决

    1.android6.0版本搜索蓝牙需要开启位置信息 需在Manifest中添加权限: <uses-permission android:name="android.permissio ...

  5. 第2章 系统用户/组管理(2) su和sudo

    本文目录: 2.1 su 2.2 sudo 2.2.1 /etc/sudoers文件 2.2.2 sudo和sudoedit命令 2.1 su 切换用户或以指定用户运行命令. 使用su可以指定运行命令 ...

  6. 使用jQuery修改动态修改超链接

    以下是修改a元素标签的href链接和文字的代码: <script type="text/javascript" src="jquery-1.9.1.min.js&q ...

  7. CentOS7安装docker 启动不了解决篇

    [root@test ~]# yum update [root@test ~]# yum install docker [root@test ~]# service docker start Redi ...

  8. 【CC2530入门教程-03】CC2530的中断系统及外部中断应用

    第3课  CC2530的中断系统及外部中断应用 广东职业技术学院  欧浩源 一.中断相关的基础概念  内核与外设之间的主要交互方式有两种:轮询和中断. 轮询的方式貌似公平,但实际工作效率很低,且不能及 ...

  9. 源码安装LNMP环境

    新装CentOS 6.7,安装默认服务版本basic server 安装顺序linux(忽略...)--> Nginx--> Mariadb--> PHP 为了不影响测试效果,首先关 ...

  10. 初学MySQL

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.   Mysql默认端口号: 3306 超级用户:root   prompt 修改提示符. ( ...