ToB企服应用市场:ToB评测及商务社交产业平台

标题: 基于RabbitMQ原理的分布式消息队列系统 [打印本页]

作者: 嚴華    时间: 2024-9-28 19:50
标题: 基于RabbitMQ原理的分布式消息队列系统
1. 项目介绍

什么是RabbitMQ?

   ​RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息署理软件(亦称面向消息的中心件)。
  重要用途:

RabbitMQ现实上是实现了一个基于AMQP的生产者消耗者模型。生产者消耗者模型是后端开发的常用编程方式,它有诸多好处:

在现实的后端开发中,尤其是分布式系统里,跨主机之间使用生产者消耗者模型,也是很普遍的需求。因此我们以AMQP为焦点封装一个独立的服务器程序。这样的服务程序我们就称为消息队列(Message Queue)。市面上成熟的消息队列有很多:

2. 开发环境


3. 技术选型


3.1ProtoBuf使用介绍:


3.2 Muduo库

Muduo是由陈硕大佬开发,基于非阻塞IO和事件驱动的C++高并发TCP网络编程库。它是一款基于主从Reactor模型的网络库,使用的线程模型是one loop per thread,所谓one loop per thread指的是:


3.3 SQLite3

什么是SQLIte?

SQLite是一个进程内的轻量级数据库,它实现了自给自足的、无服务器的、零配置的、事件性的SQL数据库引擎。我们不需要再系统中配置。SQLite引擎不是一个独立的进程。可以按应用程序需求进行静态或动态链接。SQLite直接访问其存储文件。
为什么要用SQLite?


3.4 Gtest

什么是Gtest

Gtest是一个跨平台的C++单元测试框架,由google公司发布。gtest是为了在不同平台上为编写C++单元测试而天生的。提供了丰富的断言、致命和非致命、参数化等等。
4. 需求分析

4.1 焦点概念



上述数据结构,既需要再内存中存储,也需要在硬盘中存储

4.2 焦点API

对于Broker来说,要通过以下焦点API实现消息队列的根本功能。
而Producer和Consumer则通过网络长途调用这些API,实现生产者消耗者模型。
4.3 互换机范例

对于RAbbitMQ,重要支持四种互换机范例:

此中Header比较复杂且少见。常用的是前三种范例,项目中也重要实现这三种:

4.4 恒久化

Exchange、Queue、Binding、Message等数据都有恒久化需求,当程序重启 / 主机重启,包管上述内容不丢失。
4.5 网络通讯

生产者和消耗者都是客户端程序,Broker是服务端程序,通过网络进行通讯。
在通讯过程中,客户端要提供对应的API实现对服务器的操纵。
在Broker的基础上,还要增长Connection操纵和Channel操纵:

一个Connection中可以包含多个Channel(一个Connection能被多个Channel使用)。Channel和Channel之间数据独立,不会互干系扰。这样能更好地复用TCP连接,达到长连接的效果,制止频仍创建关闭TCP连接。
4.6 消息应答

被消耗的消息,需要消耗者客户端进行应答。应答模式分为两种:

手动应答目的是为了包管消耗者处理成功了,在一些对数据可靠性要求较高的场景比较常见。
5. 模块划分

5.1 服务端模块

5.1.1 恒久化数据管理中央模块

在数据管理模块中管理互换机、队列、队列绑定、消息等数据。
1.互换机管理:


2. 队列管理:


3. 绑定管理:


4. 消息管理:


这几个概念数据都要在内存和硬盘中存储。

5.1.2 捏造机管理模块

因为互换机、队列、绑定、都是以捏造机为单元团体进行操纵。因此捏造机是对以上数据管理模块的整合模块。
1. 捏造机管理信息:


2. 捏造机对外操纵:


3. 捏造机管理操纵:


5.1.3 互换路由模块

   当客户端发送一条消息到互换机后,这条消息应该转发给该互换机绑定的哪些队列中?
  由互换路由模块决定的。绑定信息中有bindingKey,而每条发布的消息中有routingKey。可否入队取决于两个要素:互换机范例和Key

bindingKey
由数字字母下划线构成,并使用 . 分成多少部分。
如: news.music.# 用于表示互换机绑定的当前队列是一个用于发布音乐新闻的队列。
支持 *# 两种通配符,但 * # 只能作为 . 切分出来的单独部分,不能和其他数字字母混用。如:

routingKey
由数字字母下划线构成,并且可以使用 . 划分成多少部分。如:

5.1.4 消耗者管理模块

消耗者管理是以队列为单元的,因为每个消耗者都会在开始的时候订阅一个队列的消息,当队列中有消息后,会将消息轮询推送给订阅该队列的消耗者(负载平衡)。
因此操纵流程为:从队列关联的消息管理中取出消息,从队列关联的消耗者中取出一个消耗者,将消息推送给消耗者。

  1. void(const std::string &tag, const BasicProperties& bp, const std::string &body)
复制代码
5.1.5 信道管理模块

在AMQP模型中,除了通讯连接Connection概念外,另有一个Channel概念。Channel是针对Connection连接的一个更细粒度的通讯信道,多个Channel可以使用同一个Connection进行通讯,同时一个Connection之间的Channel之间互相独立。
信道模块是再次将上述模块进行整合提供服务的模块。


5.1.6 连接管理模块

本项目的服务器是通过muduo库实现底层通讯的,muduo库并不能提供我们所需的全部操纵,我们需要连接管理模块实现对muduo库的二次封装(同时对信道管理模块的封装),以完成我们的需求。

5.1.7 Broker服务器管理模块

综合以上全部模块,搭建网络通讯服务器,实现与客户端的网络通讯,辨认客户端的哀求并提供哀求处理服务。

5.2 客户端模块

5.2.1 消耗者管理

消耗者在客户端存在感比较薄弱,在用户使用角度中,只要创建一个信道,就可以通过信道完成全部操纵。对于消耗者的感官更多的是在订阅时传入了一个消耗者标识。尤其是本项目的简朴实现是一个信道只能订阅一个队列,也就是说一个信道只能创建一个消耗者,一一对应更弱化了消耗者的存在。

5.2.2 信道哀求模块

与服务端信道类似,客户端也有Channel的概念。

信道管理操纵:

5.2.3 通讯连接模块

向用户提供一个实现网络通讯的Connection对象,内部可创建更细粒化的Channel对象与服务器通讯。


5.3 项目模块关系图


6. 项目效果简朴演示

7. 总结

本项目模仿RabbitMQ实现简化版的消息队列组件,内部实现了消息队列服务器以及客户端的搭建,并支持不同主机间消息的发布、订阅以及消息推送功能。
本篇博客,简朴搭建了项目总体框架,难点在于要理清各数据结构间的关系以及回调函数较为复杂。
项目链接:项目源码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4