从零开始实现消息队列(一)

从零开始实现消息队列

  • .
  • 什么是消息队列
  • 需求分析
    • 核心概念
    • 模型

.

在这里插入图片描述

什么是消息队列

相信大家都了解过阻塞队列和生产者消费者模型,而阻塞队列最大的用途,就是用于实现生产者消费者模型,生产者消费者模型有以下好处:

  1. 解耦合

解释:
当主机A给主机B发消息时,A给B发送请求,B给A返回响应,这样的场景中,A和B之间耦合性较高,但是如果在AB之间插入一个阻塞队列,在这种场景中,A发送的请求先存到阻塞队列中,B在接收来自A的请求的时候,取阻塞队列中取就行,就可以很好的解决AB之间的高耦合问题,避免了AB两个主机直接交互.

  1. 削峰填谷

当AB主机直接进行交互的时候,一旦用户访问量过高,可能主机A处理的业务比较轻松,因此不会出现太大的问题,但是主机B却承担着项目主要的工作,可能会因为业务过于超负荷,而导致主机B挂掉,而在有着阻塞队列的生产者消费者模型中,即使主机A接收了大量的用户请求,但是都会将其先放在阻塞队列中,主机B在这种情况下,依旧可以按照正常的状态进行工作.

在实际的后端开发中, 尤其是分布式系统里, 跨主机之间使用生产者消费者模型, 也是非常普遍的需求.因此, 我们通常会把阻塞队列, 封装成⼀个独立的服务器程序, 并且赋予其更丰富的功能.这样的程序我们就称为 消息队列 (Message Queue, MQ)
市面上成熟的消息队列有很多
• RabbitMQ
• Kafka
• RocketMQ
• ActiveMQ
今天,我们就仿照RabbitMQ,来模拟实现一个简单的消息队列

需求分析

核心概念

生产者(Producer)
消费者(Consumer)
中间者(Broker)阻塞队列
发布(Publish)生产者向中间者发送信息的过程
订阅(Subscribe)哪些消费者要从中间者这里获取数据,这个注册的过程就是订阅
消费(Consumer)消费者从中间者获取数据的动作

模型

由上述几个核心概念,构成了各种各样的生产者消费者模型,包括有一对一,一对多,多对多等
一个生产者,一个消费者

在这里插入图片描述
多个生产者,多个消费者
在这里插入图片描述
Broker是最核心的部分,负责消息的存储和转发
在Broker中,也是存在着以下几个概念
• 虚拟机 (VirtualHost): 类似于 MySQL 的 “database”, 是一个逻辑上的集合. 一个BrokerServer 上可以存在多个 VirtualHost.
• 交换机 (Exchange): 存在于VirtualHost,生产者把消息先发送到 VirtualHost的 Exchange 上. 再根据不同的规则, 把消息转发给不同的 Queue.
• 队列 (Queue): 真正用来存储消息的部分. 每个消费者决定自己从哪个 Queue 上读取消息.
• 绑定 (Binding): Exchange 和 Queue 之间的关联关系. Exchange 和 Queue 可以理解成 “多对多” 关系. 使用一个关联表就可以把这两个概念联系起来.
• 消息 (Message): 传递的内容.
这里的Exchange和Queue之间的关系可以类比生产者和消费者之间的关系
在这里插入图片描述
这些概念, 既需要在内存中存储, 也需要在硬盘上存储.
• 内存存储: 方便使用.
• 硬盘存储: 重启数据不丢失.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2778197.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Python实现计数排序

对于如果存在使用两个数组成员进行比较的操作,该方法会导致排序算法的时间复杂度会存在一个下界问题,该问题在使用计数排序的时候可以突破这个理论下界,也即是不适用元素比对的操作的算法之一,计数排序。 添加图片注释&#xff0c…

部门人力分配 - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 部门在进行需求开发时需要进行人力安排。当前部门需要完成 N 个需求,需求用 requirements[i] 表示,requirements[i] 表示第 i 个需求的工作…

开发JSP自定义标记

开发JSP自定义标记 您已经学习了如何用JavaBean处理JSP页面的业务逻辑。除此以外,您还可以用自定义标记处理JSP应用程序中反复出现的业务逻辑要求。 tag是程序中使用的执行重复性任务的可重用单元。例如, 是使主体文本在网页中间出现的HTML标记。JSP可用于创建于XML标记类似…

操作系统(13)-----文件管理

目录 一.内存映射文件 传统的文件访问方式: 内存映射文件: 内存映射文件与传统文件访问方式的区别: 文件共享的实现: 内存映射文件的优点: 二.文件的属性 三.文件的逻辑结构 1.无结构文件 2.有结构文件 四.…

多模态知识图谱:感知与认知的交汇

目录 前言1 多模态知识图谱的概念1.1 感知系统与认知系统的连接1.2 信息形式的整合与融合1.3 全面、多维度的认知基础 2 多模态的作用2.1 模态的知识互补2.2 模态实体消歧2.3 模态语义搜索2.4 知识图谱补全2.5 多模态任务增强 3 多模态知识图谱发展历史3.1 初期模态数据整合3.2…

CSS3 基本语法

CSS3 基本语法 1. CSS3 新增长度单位 rem 根元素字体大小的倍数,只与根元素字体大小有关。vw 视口宽度的百分之多少 10vw 就是视口宽度的 10% 。vh 视口高度的百分之多少 10vh 就是视口高度的 10% 。vmax 视口宽高中大的那个的百分之多少。(了解即可&am…

微信视频号文章数据统计

微信视频号后台里有关于单篇文章的数据(见下图)。如果要做进一步的分析,可以将数据下载到本地。 from datetime import datetime import math import csvdef parse_date_time(date_time_str):# 将输入字符串解析为datetime对象date_time_obj …

问题:2、计算机网络的目标是实现________。 #媒体#知识分享

问题:2、计算机网络的目标是实现________。 A.数据处理 B.信息传输与数据处理 C.资源共享与信息传输 D.文献查询 参考答案如图所示

新春快乐(烟花、春联)【附源码】

新春快乐 一&#xff1a; C语言 -- 烟花二&#xff1a;Python -- 春联三&#xff1a;Python -- 烟花四&#xff1a;HTML -- 烟花 一&#xff1a; C语言 – 烟花 运行效果&#xff1a; #include <graphics.h> #include <math.h> #include <time.h> #include…

Matlab使用点云工具箱进行点云配准ICP\NDT\CPD

一、代码 主代码main.m&#xff0c;三种配准方法任选其一 % 读取点云文件 source_pc pcread(bun_zipper.ply); target_pc pcread(bun_zipper2.ply);% 下采样 ptCloudA point_downsample(source_pc); ptCloudB point_downsample(target_pc);% 配准参数设置 opt param_set…

node网站 宝塔 面板配置 防止刷新404

1.问题 我现在配置了一个网站 后台项目 放到了宝塔上 将相应的域名和项目都配置好了 域名也可以访问 但是有的时候 出现了404 类似这种404 这个资源找不到 2.说明 其实这个问题的原因是nginx 的问题 反向代理的原因 3.解决 在这个配置文件中 有个配置文件 # 防止刷新404l…

Python算法题集_K 个一组翻转链表

Python算法题集_K 个一组翻转链表 题25&#xff1a;K 个一组翻转链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【依次反转】2) 改进版一【列表反转】3) 改进版二【堆栈大法】4) 改进版三【递归大法】 4. 最优算法 本文为Python算法题集之一…

在JSP中实现JAVABEAN

在JSP中实现JAVABEAN 问题陈述 创建Web应用程序以连接数据库并检索作者名、地址、城市、州及邮政编码等与作者的详细信息。JavaBean组件应接受作者ID、驱动程序名及URL作为参数。信息要从authors表中检索。 解决方案 要解决上述问题,需要执行以下任务: 创建Web应用程序。创…

Backtrader 文档学习- Plotting - Plotting Date Ranges

Backtrader 文档学习- Plotting - Plotting Date Ranges 1.概述 1.9.31.x版本增加了绘制部分图形的功能。 可以使用策略实例中保留完整长度的时间戳数组的索引或者使用实际的datetime.date 或datetime.datetime 实例来限制需要绘制的内容。 仍然可以使用标准的cerebro.plot…

基于 multiprocessing.dummy 的多线程池与单线程访问多网页的比较示例

一、示例代码&#xff1a; from multiprocessing.dummy import Pool as ThreadPool import time import requestsurls [ # URL队列&#xff0c;通过多线程访问http://www.python.org,http://www.python.org/about/,http://www.…

Eclipse导入maven项目或者创建maven项目时,报错Could not calculate build plan: Plugin

问题&#xff1a;Eclipse导入maven项目或者创建maven项目时,报错Could not calculate build plan: Plugin 1.上述问题大概是项目不能加载此maven插件&#xff0c;在pom文件中添加依赖项 <dependency><groupId>org.apache.maven.plugins</groupId><artifa…

微服务入门篇:http客户端Feign(远程调用,自定义配置,Feign的性能优化,Feign服务抽取)

目录 1.基于Feign的远程调用1.RestTemplate方式调用存在的问题2.Feign的介绍3.定义和使用Feign客户端 2.自定义配置1.方式一&#xff1a;配置文件方式2.方式二: java代码方式&#xff0c;需要先声明一个Bean: 3.Feign的性能优化1.Feign底层的客户端实现2.连接池配置 4.Feign的最…

EMNLP 2023精选:Text-to-SQL任务的前沿进展(下篇)——Findings论文解读

导语 本文记录了今年的自然语言处理国际顶级会议EMNLP 2023中接收的所有与Text-to-SQL相关&#xff08;通过搜索标题关键词查找得到&#xff0c;可能不全&#xff09;的论文&#xff0c;共计12篇&#xff0c;包含5篇正会论文和7篇Findings论文&#xff0c;以下是对这些论文的略…

c语言中的隐式类型转换

数据类型转化 我们在实际编程中&#xff0c;不管你是有意的还是无意的&#xff0c;有时候都会让两个不同类型的数据参与运算&#xff0c;编译器为了能够生成CPU可以正常 执行的指令&#xff0c;往往会对数据做类型转换&#xff0c;将两个不同类型的数据转换成同一种数据类型。…

Springboot+vue的社区养老服务平台(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的社区养老服务平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的社区养老服务平台&#xff0c;采用M&#xff08;model&…