【RabbitMQ 项目】项目概述

news/2024/9/18 22:56:16/ 标签: rabbitmq, 分布式

项目概述

  • 一.角色划分
  • 二.服务器模块概述
    • 1.本地模块
    • 2.网络模块
    • 3.服务器模块
  • 三.模块详细划分
    • 1.服务端
    • 2.客户端

一.角色划分

该项目的模型是一个跨主机的生产消费模型,有三种角色:生产者,消费者,中间人。对应就要实现三个大模块:服务端,消息生产客户端,消息消费客户端。服务端要完成一个消息队列服务器模块,这个模块是整个项目的核心

二.服务器模块概述

服务器模块又可以划分成三个模块:

  1. 本地模块:服务器的核心模块,也可以叫业务模块,对本地消息的增删查,完全自主实现
  2. 协议模块:数据序列化和反序列化,报文封装与解包。使用 Protobuf 完成前者,使用 muduo 库实例代码中提供的自定义协议完成后者
  3. 网络模块:字节流接受和发送,以及连接管理。前者由 muduo 库完成,后者自己封装实现

1.本地模块

核心概念:

  1. 虚拟机:虚拟机是逻辑上的概念,就好比 MySQL 中的数据库,一台 MySQL 服务器上可以有多个数据库,那么一台消息队列服务器上也可以有多台虚拟机。虚拟机是一个逻辑上的集合,里面有很多对象,有哪些呢?有以下这些:
  2. 消息队列:一个虚拟机中可以有很多不同类型的消息队列,用来存储不同类型的消息,实际上消息队列中只存储了消息 id,并没有存储消息主体,真正的消息大部分存储在磁盘上,少部分存储在内存中。消息存储在内存中是为了提高查找效率,存储在磁盘中一方面是内存容量不够,另一方面是为了持久化,便于重启恢复
  3. 交换机:生产者的目的是要将消息发布到指服务器的消息队列中,但有时候想要把一条消息发布到多个队列,比如我现在有一份素材,想要交给消息队列服务器,推送给消费者,去加工素材形成新闻。服务器上有很多类型的队列,比如和音乐素材队列,体育素材队列,我的素材是某体育明星创作了一首歌曲,我想要同时发布到音乐和体育队列,那么我就就要去发布两次,比较繁琐。所以引出了交换机的概念,我不会直接把把消息给消息队列,而是先给交换机,让交换机使用交换路由算法,把消息发布到音乐和体育素材队列中去。
  4. 绑定:交换机要把消息发送到队列,那么一定要和队列建立联系,Binding 对象就代表它们之间的关联关系。Binding 和交换机的交换路由算法有关,这里不展开谈
  5. 消息:要传递的内容,需要持久化,除了消息,上述的对象都需要持久化,只不过消息直接写到文件,其它对象用的是 sqlite 数据库

核心接口:
该项目简是了 RabbitMQ 的简化版,服务器上只有一台虚拟机,所以本地模块的核心接口就是虚拟机的核心接口,有如下这些:

  1. 交换机,消息队列,绑定的创建与销毁
  2. 发布消息
  3. 订阅队列和取消订阅
  4. 确认消息:消息发送给消费者后暂时不会删除,直到消费者手动调用应答的接口,发送应答请求,服务器收到后,调用确认应答的接口,把消息删除

2.网络模块

网络模块主要是进行网络 IO,除此之外,还要还要管理 Connection 和 Channel
核心概念:
Connection 和 Channel:Connection 对应一个 TCP 连接,Channel 是一个逻辑上的信道,一个 Connection 可以包含多个 Channel,Channel 之间数据是独立的。服务器和客户端建立的连接,不是一个个 Connection,而是逻辑上的 Channel,当然 Channel 本质上还是使用 Connection 通信。
为什么要把 Connection 细分:达到长连接的效果,更好地复用 TCP 连接,避免频繁创建和关闭 TCP 连接。

我们使用的是 muduo 库来搭建服务器,所以 IO 相关的接口就不用自己实现了,我们要实现的是:

  1. Connection,Channel 的连接和关闭
    网络模块

3.服务器模块

核心接口:

  1. Connection,Channel 的连接和关闭
  2. 交换机,队列,绑定的创建和销毁
  3. 发布消息
  4. 订阅队列和取消订阅
  5. 确认消息

你会发现,服务器提供的几个接口,本地模块,网络模块不是也有吗?实际上,这几个接口实现就是使用的是网络模块和本地模块,这就是分层设计的思想。
网络模块,协议模块和本地模块怎么关联起来的呢?muduo 库中的回调机制:TCP 连接建立成功了,回调,创建 Connection,创建信道;TCP 连接关闭,回调,销毁 Connection,销毁信道;缓冲区中的数据读取上来了,回调,去用协议处理器解析字节流,得到结构化的请求,再分发给相应的业务回调函数,业务回调函数中,做增删查,然后构建响应报文,给客户端返回过去

三.模块详细划分

1.服务端

本地模块:

  1. 数据管理模块
    准确的说是虚拟机数据管理模块,因为一台服务器上只有一个虚拟机。包含以下子模块:
    以上的四种数据都要持久化管理,所以数据管理包含内存和磁盘两方面管理
  2. 路由交换模块
    生产者把消息发布给交换机,交换机决定放入哪些队列,这个决定就由路由交换模块提供的算法来完成。路由交换算法,要结合交换机的类型,以及消息中的 routing key,绑定中的 binding key 做规则匹配
  3. 消费者管理模块
    这里的消费者是指订阅了某个消息队列的对象,一个用户可能通过消费客户端订阅了多个队列,所以虽然这些订阅都来自同一客户端,但在我服务端看来,有多个消费者。服务端为什么要管理消费者?是因为当有消息发布到队列中,就需要推送给订阅该队列消息的客户端,所以要把消费者管理起来

网络模块:

  1. 信道管理模块
    信道是比连接粒度更细的通信通道,一个连接中有一个或多个信道,客户端关闭通信,关闭的是信道而不是连接,信道关闭后,就要把客户端的一个或多个订阅取消
  2. 连接管理模块
    Connection 是对 muduo 库中 TcpConnectionPtr 的封装,而后者是对套接字的封装,所以一个 Connection 对应一个 TCP 连接。当连接关闭后,与之关联的信道也要随之关闭。

服务器模块:

  1. 服务器模块
    对以上所有模块的整合,并且还使用了 muduo 库,Protobuf,应用层协议等,搭建的一个高并发服务器

2.客户端

  1. 消费者管理模块——消息订阅客户端才会用到
  2. 信道管理模块
  3. 连接管理模块
    基于以上三个模块,就可以分别实现发布客户端和订阅客户端

http://www.ppmy.cn/news/1525804.html

相关文章

golang学习笔记16——golang部署与运维全攻略

推荐学习文档 golang应用级os框架,欢迎star基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学…

简单数据库sqlite

目录 数据库 简介 1、分类: 大型 中型 小型 2、名词: 3、嵌入式数据库: 4、sqlite3的安装: LTS long term support 5.1、sqlite3的使用: 0、启动sqlite3 1、系统维护命令:> .help 5.2、标准SQL…

《 C++ 修炼全景指南:六 》深入探索 C++ 标准库中的 stack 与 queue 容器适配器

1、引言 1.1、容器适配器的概念与应用 容器适配器(Container Adapters)是 C 标准库提供的一种特殊容器,它不是一种独立的容器,而是对其他标准容器的封装,用来实现特定的数据结构如栈(stack)和…

CSP-J 算法基础 图论

文章目录 前言图的简介1. **图的定义**2. **图的类型**3. **图的表示方法**a. **邻接矩阵(Adjacency Matrix)**b. **邻接表(Adjacency List)** 4. **图的基本操作**5. **图的遍历**6. **图的应用**7. **图的算法** 出度与入度1. *…

5--SpringBoot、Mybatis

目录 Mybatis Mybatis入门操作步骤 1.准备工作 创建springboot工程 创建数据库表和实体类 连接数据库 创建接口XxxMapper 2.数据库连接池 Lombok 使用 Mybatis 准备工作 删除 日志输入 参数占位符 新增 更新 查询 驼峰命名 条件查询 XML 创建XML文件 编…

【LeetCode每日一题】——LCR 078.合并 K 个升序链表

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 优先队列 二【题目难度】 困难 三【题目编号】 LCR 078.合并 K 个升序链表 …

LeetCode题练习与总结:基本计算器 Ⅱ--227

一、题目描述 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-2^31, 2^31 - 1] 的范围内。 注意:不允许使用任何将字符串作为数学表达式计算…

深度挖掘| 如何高效实现Cloudera 安装之基础环境搭建

Cloudera Manager是CDH市场领先的管理平台。它以其强大的数据管理和分析能力,帮助企业能够轻松驾驭海量数据,实现数据的实时分析与洞察。 作为业界第一的端到端 Apache Hadoop 的管理应用,Cloudera Manager对CDH的每个部件都提供了细粒度的可…

软件测试工程师面试整理-编程与自动化

在软件测试领域,编程与自动化是提升测试效率、覆盖率和可靠性的关键因素。掌握编程技术和自动化测试框架,能够帮助测试人员有效地执行大量重复性测试任务,并迅速反馈软件的质量状况。以下是编程与自动化在测试中的主要应用及相关技术介绍: 1. 编程语言与自动化 ● 常用编程…

k8s dashboard token 生成/获取

创建示例用户 在本指南中,我们将了解如何使用 Kubernetes 的服务帐户机制创建新用户、授予该用户管理员权限并使用与该用户绑定的承载令牌登录仪表板。 对于以下每个和的代码片段ServiceAccount,ClusterRoleBinding您都应该将它们复制到新的清单文件(如)…

Java应用压测工具JMeter

目录 1、下载JMeter 2、配置环境变量 3、配置语音 4、使用 1、下载JMeter Apache JMeter - Apache JMeter™ 千万别下载这个,会报错、 千万别下载这个,会报错、 千万别下载这个,会报错 下载这个,失败多下载几次 2、配置环…

http的请求方式

HTTP协议支持多种请求方法,每种方法都有其特定的用途和场景。以下是HTTP中最常用的几种请求方法及其用途: ‌‌GET‌:用于请求服务器发送资源,通常用于请求数据。GET请求常用于获取信息,如查询操作,其参数附…

明天考教资之作文素材

草木不经霜雪,则生意不顾;吾人不经忧患,则德惠不成。人生的大海波澜壮阔,纵然狂风骤雨卷起千堆雪,海也只当吹皱了春水,永远吹不走的,是那颗永恒的直面磨难的心。 追风赶月莫停留,平芜…

ISP住宅网络的特点是什么

在互联网服务领域,ISP(互联网服务提供商)住宅网络是连接家庭用户与互联网世界的重要桥梁。随着技术的发展和用户需求的增长,ISP住宅网络已经成为现代生活中不可或缺的一部分。本文将探讨ISP住宅网络的特点、它所带来的优势以及在不…

【CSS|第1期】网页设计的演变:从表格布局到Grid布局

日期:2024年9月9日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉在这里插入代码片得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对…

分治算法之归并排序详细解读(附带Java代码解读)

分治算法中的归并排序(Merge Sort) **归并排序(Merge Sort)是一种基于分治法(Divide and Conquer)**的排序算法。其核心思想是将数组递归地分成若干个子数组,分别对每个子数组进行排序&#xf…

【计算机网络 - 基础问题】每日 3 题(四)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…

25届计算机专业选题推荐-基于python的线上拍卖会管理系统【python-爬虫-大数据定制】

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于python的线上拍卖会管理…

老古董Lisp实用主义入门教程(8):挠痒痒先生建网站记

是时候来个真正的应用 几位奇形怪状, 百无聊赖的先生, 用Common Lisp 搞东搞西一阵子, 总觉得没有干什么正经事. 一般而言, 学习编程语言总是应该先搞点计算, 让CPU燥起来. 但是Lisp搞计算总感觉有点不太对劲, 虽然颠倒先生已经尝试把数学公式改成中序以增强动力, 但是不行. 隔…

鸿蒙 ArkUI组件一

ArkUI组件 布局 布局指用特定的组件或者属性来管理用户页面所放置UI组件的大小和位置。在实际的开发过程中,需要遵守以下流程保证整体的布局效果: 确定页面的布局结构。分析页面中的元素构成。选用适合的布局容器组件或属性控制页面中各个元素的位置和大…