第一章:项目简介
目录
第一节:项目介绍
第二节:整体设计思路
2-1.服务器模块
2-1-1.连接管理模块
2-1-2.消费者管理模块
2-1-3.虚拟机模块
2-1-3-1.交换机管理模块
2-1-3-2.队列管理模块
2-1-3-3.绑定管理模块
2-1-3-4.队列消息管理模块
2-2.客户端模块
下期预告:
第一节:项目介绍
该项目是一个简化版的仿RabbitMQ消息队列,其内部实现了消息队列服务器以及客户端的搭建,并支持不同主机间消息的发布与订阅、消息推送功能。
项目所用到的技术:
(1)基于muduo库实现的底层网络通信服务和客户端的搭建
(2)基于protobuf协议的应用层协议接口
(3)基于轻量数据库sqlite的数据持久化管理功能
(4)基于AMQP模型(高级消息队列协议)实现整个消息队列模块的整合
(5)使用gtest框架进行模块单元测试
第二节:整体设计思路
消息队列是一个比较复杂的项目,它涉及的模块很多,但是它的每个功能模块化程度高、解耦程度高。所以只要将每个模块完成,做好单元测试,最后再整合所有模块,实现它也不是难事。然后我就一一介绍所需模块和每个模块的功能。
2-1.服务器模块
服务器模块就是提供服务的模块,它的功能是对收到的请求调用不同业务函数进行处理,它的构造如下:
服务器模块的功能主要体现在它的3个子模块上。
2-1-1.连接管理模块
连接管理模块的功能是管理和服务器连接成功的所有连接,对于服务器来说,一个连接就是一个客户端,但是在AMQP中又把一个连接分成了多个信道(channel)。
对于用户来说,一个channel就是一个连接,连接实现的功能channel都能实现,这是因为channel的底层也是使用连接来实现的,多个信道可以共用一个信道,就像进程对CPU的占用一样。
信道的使用有诸多好处:
(1)充分利用连接资源
使用多个信道可以提高性能,因为它们可以在同一连接上共享底层网络连接。相比于为每个操作创建新的物理连接,使用信道可以减少网络开销和连接建立的时间。这种性能优化对于需要高效处理大量消息的应用程序来说尤为重要。
(2)资源独立
每个信道都具有独立的状态和资源隔离。这意味着一个信道上的操作不会影响其他信道,信道之间可以相互独立工作,不会相互干扰。这种资源隔离的特性有助于增强系统的稳定性和可靠性,因为一个信道上的问题不会导致其他信道或整个连接的中断。
(3)容错性高
如果一个信道上的操作出现错误,它不会影响其他信道。这有助于提高系统的容错性,因为一个故障的信道不会导致整个连接或应用程序的失败。这种错误处理的机制使得应用程序能够更加稳健地运行,即使在面对错误或异常情况时也能够保持一定的可用性。
所以连接管理模块又由信道管理模块组成,它提供管理信道的诸多操作(信道的增删查)。实际上服务器不会自动增加信道,只有客户端增加一个信道时,服务器也会增加一个对应的信道,服务器和客户端的通信就依靠这两个信道完成。
2-1-2.消费者管理模块
消息队列肯定有一个保存各种消息的结构,这种结构叫队列,每个队列会保存属于自己的各种类型的消息。
比如"音乐新闻"队列,就保存音乐相关消息;"体育新闻"队列,就保存体育相关消息。然后才能把这些消息推送给它们的订阅者,这里面的订阅者对于服务器来说就是消费者。
所以当一个消费者订阅了一个队列之后,就需要消费者管理模块将队列--消费者的映射保存起来,当该队列的新消息到来时,服务器才能找到这个队列的消费者,并把消息推送给这些消费者。
当消费者取消订阅时,还需要把它从消费者管理模块中删除。
所以消费者管理模块提供的功能就是消费者的增、删、查。
2-1-3.虚拟机模块
虚拟机模块是最复杂的一个模块,它由交换机管理模块、队列管理模块、绑定管理模块、消息管理模块组成。
2-1-3-1.交换机管理模块
要理解该模块的作用,首先要明确消息队列中,队列获得消息的流程:
(1)生产者客户端发布消息
首先要创建一个信道,这个信道调用发布消息的函数将一条消息发布到服务器的交换机,此时该信道就是一个生产者。
(2)交换机发布消息
这条消息到服务器后,并不是直接给队列,而是先给到交换机,然后由交换机审核消息后将消息发送给交换机绑定的队列。
例如有一个"新闻"队列和一个"文章"队列,都绑定了同一个交换机,当消息到来时,交换机将审核消息和所有和它绑定的队列,然后选择审核通过的队列发送这条消息。
所以该模块的作用就是提供交换机的管理操作,包括交换机的增、删、查。
2-1-3-2.队列管理模块
队列是保存消息的结构,但是该模块并不保存消息只保存队列的信息,当某个队列被声明时,它就将该队列的信息保存起来;某个队列被移除时,它就把该队列的信息删除。
它相当于一个"凭证",即使某个队列的消息是存在的,但是只要该模块没有这个队列的信息,这个队列就是无效的(正常不会出现这种情况)。
所以它的功能是提供队列信息的增删查。
2-1-3-3.绑定管理模块
绑定管理模块用来保存交换机和队列的绑定信息,这样当交换机获得消息时,就从这个模块获取它的绑定信息,给绑定的、符合条件的队列发布消息。
所以提供绑定信息的增删查即可。
2-1-3-4.队列消息管理模块
这个模块才是真正保存各种消息的模块,它将队列与队列保存的消息建立起映射,并且每个队列都有一个文件保存自己的信息。
它提供队列的增删查,还有指定队列消息的增删查。
2-2.客户端模块
客户端的实现就比服务器模块简单多了,只有一个信道管理模块。
客户端只需要向服务器发送请求,只有收到订阅的消息后调用相应的函数就行了。
下期预告:
介绍完消息队列后,需要一些类来辅助完成各种模块,这些辅助类包括:
(1)日志宏函数:打印信息,帮助错误定位、信息提示
(2)文件操作类:用于文件操作
(3)sqlite数据库操作类:用于操作sqlite数据库
(4)随机id生成类:用于给交换机、队列、消息等生成一个唯一的标识码
(5)字符串切割类:将字符串安装某个字符切成多段,与交换机的消息审核有关
(6)工作线程池
然后还要使用protobuf定义一些属性。