Message Queue的设计和实现(2)

2017-08-31 12:58 阅读 254 views 次 评论 0 条

Message Queue的设计和实现(2)

上周跟大家聊了Message Queue需要实现和承载的功能。后来收到很多朋友的留言,问了许多关于MQ的问题,其中几个比较有意思,刚好老王也打算接下来要聊的:

· MQ凭什么有这个能力当蓄水池?他有多快?

· MQ是单机的嘛?能分布式嘛?

· 接下来我们是要聊具体的几个开源的MQ嘛?以及他们之间的对比?

……

老王对上面的问题都一一做了解答,基本答案都是:请听接下来老王的分享~

老王讲这几期MQ,主要是想从原理上把MQ讲清楚,所以不会去聊那些开源的具体的MQ。网上很多讲具体的MQ的文章,而且都比我讲的好,所以大家要看相关的内容,可以去问问百度或者谷歌。老王在这里就给大家讲点儿不一样的东西~~

言归正传,我们今天就聊聊Message Queue的设计架构,看看这个家伙应该怎么样来设计。

上周我们聊的东西,大家还记得嘛?MQ就是一个大的蓄水池:

· 接收上游来的数据

· 将数据存入磁盘

· 把磁盘中的数据读取出来,根据不同的需求发送给不同的下游

其中,发送给下游的逻辑又包含:数据分组、分组内的广播和单播。好了,有了这些需求,我们就很容易画出一个架构草图,他大概就长成这个样:

一共是三个大的组件:接收模块、数据存储模块和发送模块。

· 接收模块:主要负责接收上游发送过来的数据。他要解决的问题就是hold住大量链接,并且快速的读取发送的数据,组装完整的数据包发送给数据存储模块;

· 数据序列化模块:主要负责存储接收模块发送来的一个个的数据包,以及读取存储的数据交给发送模块去发送。他要解决的问题就是如何高效的将数据序列化到磁盘,以及如何将序列化的数据高速的读出。他的速度,决定了整个MQ的蓄水速度。他有多快,整个MQ的服务能力就有多快。所以,这个模块的设计和开发,决定了整个MQ的服务能力。

· 发送模块:主要负责将磁盘里序列化的数据根据规则发送给后端。他的工作,主要是解决发送逻辑:如何分组发送?是广播还是单播?如何阻塞和重传?

好了,大家看这个逻辑设计是不是很简单清晰呢?老王一直坚信一个原则:大道至简。一个好的设计往往是比较简约的。如果设计太复杂,一定是哪里还有问题,没有抽取出关键的点。

有了上面这个简笔画式的基础架构下,我们就来逐步扩展这个体系架构,让他更生动和具象。

我们将简单的架构进行了扩展,这样我们要实现的功能就变的更加具体。

· 接收模块:主要是有两个部分构成。一个是消息的接收,负责接收原始的数据包;一个是协议的处理,负责将原始的数据包,根据约定的协议(比如:JSONthriftprotobuf等),将数据解开,拼装成MQ内部的数据结构,交给数据模块;

· 数据序列化模块:主要分成:数据接收、id分配、数据写入和数据读取 四个部分。数据接收主要起到接口的作用,用于对接接收、发送模块。id分配对每个提交的数据分配一个内部id。数据写入和读取,就是用于序列化数据,做持久存储;

· 发送模块:包含发送逻辑控制的几个组件:组管理、组内广播管理和单播管理。还包括将数据打包成约定的协议,以及将数据发送给接收方的发送组件。

好了,整个MQ的内部器官,我们基本上就剖析的差不多了。大家是不是已经看懂了呢?每一部分的功能都是比较单一和纯粹的。接下来的几期,老王就会跟大家一起来分析每一个模块内部怎么样来实现,以及怎么样来解决关键的技术点。那今天就先聊到这里吧,下周再见哦~~


版权声明:本文版权由木秀林网所有,转载请保留链接:Message Queue的设计和实现(2)
分类:技术分享 标签:

发表评论


表情