消息队列的概念和原理

news2025/1/24 6:29:57

消息队列

  • 一、使用消息队列的场景
    • 1.1、消息队列的异步处理
    • 1.2、消息队列的流量控制(削峰)
    • 1.3、消息队列的服务解耦
    • 1.4、消息队列的发布订阅
    • 1.5、消息队列的高并发缓冲
  • 二、消息队列的基本概念和原理
    • 2.1、消息的生产者和消费者
    • 2.2、Broker
    • 2.3、点对点消息队列模型 ----- 线程池
    • 2.4、发布订阅消息模型
    • 2.5、消息的顺序性保证
    • 2.6、消息的ACK确认机制
    • 2.7、消息的持久化
    • 2.8、消息的同步和异步收发
    • 2.9、消费组的概念
  • 三、消息队列产品
  • 后言

一、使用消息队列的场景

  1. 异步处理。
  2. 流量控制。
  3. 服务解耦。
  4. 发布订阅。
  5. 高并发缓冲。

1.1、消息队列的异步处理

主要应用于短信通知、终端状态推送、App推送、用户注册等。

同步处理:

APP
网关
风控
库存
订单
短信
统计

异步处理:

生产
消费
消费
消费
APP
网关
风控
库存
消息队列
订单
短信
统计

异步处理的优势:更快速返回结果;减少等待,实现并发处理,提升系统总体性能。

消息队列的模式可以有:
(1)1对1:读取之后立刻从队列中移除消息。
(2)1对多:这种模型是发布订阅模型,消息队列的元素可以被重复消费。至于何时删除消息,可以设置消息的存活周期;比如kafka可以设置24H后删除消息。

1.2、消息队列的流量控制(削峰)

在秒杀场景下的下单状态,使用消息队列隔离网关和后端服务,以达到流量控制和保护后端服务的目的。

生产
消费
APP
网关
消息队列
秒杀服务

设置消息队列的最大限制数量,在达到最大数量时网关不再生成消息到消息队列中。

可以这么想:有一个商品秒杀活动,商品数量为100,当消息队列的数量达到100时不再生产秒杀成功消息,直接返回秒杀失败给用户,只有1到100的用户秒杀成功 获得商品。

1.3、消息队列的服务解耦

A系统负责数据分发,其他系统调用A系统提供的接口处理数据;当新增一个系统时,A系统需要改代码调用新的系统,并实现新的接口给新的系统去调用。这种方式是系统间高度耦合。

调用接口
调用接口
调用接口
调用接口
A系统
B系统
C系统
D系统
E系统(新增)

使用消息队列,A系统负责将数据分发到MQ,消费端根据需要从MQ获取消息即可,不需要就取消MQ的消费。

消费
消费
消费
消费
A系统
消息队列
B系统
C系统
D系统
E系统(新增)

1.4、消息队列的发布订阅

用户需要先去注册,才能收到相关消息。

消费
消费
消费
订阅
系统
消息队列
B系统
C系统
D系统
E系统(新增)

比如游戏里面跨服:
(1) 广播今天整体还剩多少把屠龙刀可以暴。
(2) 广播用户暴的屠龙刀的消息。

1.5、消息队列的高并发缓冲

这个和消息队列的流量控制(削峰)有些类似。区别在于,这里没有大小限流,可能在某个时间点会出现超过后端处理能力的访问;比如后端处理能力是50000每秒,在某个时间点出现每秒80000的访问,这就可能造成击穿。

针对此情况,消息全部放入消息队列,消息队列提供可以把数据固化到磁盘的能力,降低高峰数据对后端的短暂冲击。

生产
消费
短暂高峰时缓存
短暂高峰退去后恢复
APP
网关
消息队列
后端服务
磁盘

比如,后端处理能力50000,某个短暂时间点(比如一秒的时间)数据访问达到80000,消息队列将多的数据缓存到磁盘,后端仍然处理50000数据;冲击点退去后,访问数据降到了30000,那么消息队列将把缓存的数据放到后端处理。

比如kafka 日志服务、监控上报。

二、消息队列的基本概念和原理

消息队列全称MessageQueue,简称MQ。本质是一个队列,FIFO先进先出,只不过队列中存放的内容是message,从而称为消息队列(消息+队列)。

主要用途:不同服务server、进程process、线程thread之间通信。

2.1、消息的生产者和消费者

消息生产者Producer:发送消息到消息队列。
消息消费者Consumer:从消息队列接收消息。
被动接受消息 s->c。
主动拉取消息 s<- c pull。

通常,是由消费者Consumer去拉取消息,避免采用推送的方式。因为服务端不知道消费者的处理能力,可能会造成数据丢失。

2.2、Broker

Broker的概念来自与Apache ActiveMQ,通俗的讲就是MQ的服务器。一般来说,一个服务器机器只有一个Broker,不要出现多个Broker。

如果有多个Broker,可以采用集群的方式。

生产
消费
Producer
Broker
Consumer

2.3、点对点消息队列模型 ----- 线程池

消息生产者向一个特定的队列发送消息,消息消费者从该队列中接收消息。
一条消息只有一个消费者能收到。
queue_module_fifo

发送消息
消费
确认
client 1
消息队列
client 2

2.4、发布订阅消息模型

实际操作过程中,发布订阅消息模型中,支持向一个特定的主题Topic发布消息,0个或多个订阅者接收来自这个消息主题的消息。在这种模型下,发布者和订阅者彼此不知道对方。
topic_mq

2.5、消息的顺序性保证

基于Queue消息模型,利用FIFO先进先出的特性,可以保证消息的顺序性。

2.6、消息的ACK确认机制

即消息的Ackownledge确认机制,为了保证消息不丢失,消息队列提供了消息Acknowledge机制,即ACK机制,当Consumer确认消息已经被消费处理,发送一个ACK给消息队列,此时消息队列便可以删除这个消息了。
如果Consumer宕机/关闭,没有发送ACK,消息队列将认为这个消息没有被处理,会将这个消息重新发送给其他的Consumer重新消费处理。

通过牺牲吞吐量获得实时性。

2.7、消息的持久化

消息的持久化,对于一些关键的核心业务来说是非常重要的,启用消息持久化后,消息队列宕机重启后,消息可以从持久化存储恢复,消息不丢失,可以继续消费处理。

对于生产者,将数据发送到消息队列,消息队列会保存多个副本,即使MQ服务器奔溃,重启仍能找到生产者的消息数据。
对于消费者,拉取到消息后,将返回一个信息给MQ告诉它已经获得了消息,MQ将保存相关数据,即使MQ服务器奔溃,重启仍能知道消费者已经获取了哪些数据,避免重复发送。

2.8、消息的同步和异步收发

同步: 消息的收发支持同步收发的方式 一应一答。
同时还有另一种同步方式:同步收发场景下,消息生产者和消费者双向应答模式。
消息的接收如果以同步的方式(Pull)进行接收,如果队列中为空,此时接收将处于同步阻塞状态,会一直等待,直到消息的到达。

异步: 消息的收发同样支持异步方式:异步发送消息,不需要等待消息队列的接收确认;异步接收消息,以Push的方式触发消息消费者接收消息。

2.9、消费组的概念

类似线程池;如果消费者的处理能力较低时,可以使用消费组来处理,一个消费组里面包含多个消费者。

发送消息
消费
消费组
消费者 1
消费者 2
消费者 ...
消费者 n
生产者
消息队列

比如,MQ推送数据的能力是10w每秒,而消费者的处理能力是1w每秒,那么就可以使用一个消费组包含10个消费者来处理消息。这时消费者使用的是点对点消息队列模型 。

三、消息队列产品

特性RabbitMQRocketMQKafkaZeroMQ
单机吞吐量万级,比 RocketMQ、Kafka 低一个数量级10 万级,支撑高吞吐10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景100万级别,最早设计用于股票实时交易系统
topic 数量对吞吐量的影响topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topictopic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 尽量保证 topic 数量不要过多,如果要支撑大规模的 topic,需要增加更多的机器资源
时效性微秒级,这是RabbitMQ 的一大特点,延迟最低ms 级延迟在 ms 级以内延迟在微妙级别/毫秒级
可用性高,基于主从架构实现高可用非常高,分布式架构非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用不是一个独立的服务,要嵌套到自己的程序里面去
消息可靠性基本不丢经过参数优化配置,可以做到 0 丢失同 RocketMQ
功能支持基于 erlang 开发,并发能力很强,性能极好,延时很低MQ 功能较为完善,支持分布式部署,扩展性好功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用如果需求是将消息队列的功能集成到系统进程中,可以考虑使用

后言

本专栏知识点是通过<零声教育>的系统学习,进行梳理总结写下文章,对c/c++linux系统提升感兴趣的读者,可以点击链接,详细查看详细的服务:C/C++服务器课程

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

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

相关文章

【Linux修炼】9.环境变量

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 环境变量本节目标1. 环境变量1.1 环境变量的概念1.2 环境变量PATH1.3 其他常见环境变量2. 和环境变量相关的命令2.1 env 命令2.2 export命令2.3 set命令2.4 unset命令3. 环境变量的意义4. 命令行参数4.1 什么是命令行参数&…

Array reduce() 如何计算元素内数值总合,计算总合

Array reduce() 如何计算元素内数值总合&#xff0c;计算总合 一、需求 有时候我们需要计算一个数组中所有元素的总合&#xff0c;这个数组可能是组 Number 类型&#xff0c;也可能是 Object 类型&#xff0c;像这样&#xff1a; const tempArray [2,3,4,6,456,89,24] // 或…

1.1MQ的基本概念,优劣势介绍及 RabbitMQ简介

1.MQ的基本概念 1.1 MQ概述 M Q 全称 Message Queue 消息队列&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间的通信。 1.2 MQ 的优势 1.2.1应用解耦 当订单系统强依赖库存系统&#xff0c;支付系统&#xff0c;物流系统等&#xff0c;若其中一个系…

Lambda求和函数在excel上的应用

目录 一、Lambda函数 二、Lambda求和函数 三 、实际表格运用 四、计算结果 一、Lambda函数 Lambda函数是使用lambda运算符创建的&#xff0c;其语法如下&#xff1a; 语法&#xff1a; lambda 参数&#xff1a;表达式 Python lambda函数可以包含任意多的参数&#xff0c;但…

Js逆向教程-16极验滑块 找到w加密位置

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; Js逆向教程-16极验滑块 找到w加密位置 一、如何下第一个断点 https://www.geetest.com/demo/slide-float.html 接口有多个w参数&…

springboot+vue 任课教师考评评价系统 Java 前后端分离

随着我国教育改革的发展&#xff0c;各大高校的大学生数量也在不断的增加&#xff0c;相对应如何去评价教学的质量问题也是很多高校一直以来所关注的内容。只有有了一个好的教学评价制度才能够让各大高校的教学质量稳步提升&#xff0c;本系统就是这样一个根据各项指标对教学质…

day77:注解、自定义注解、元注解

一、注解 1.什么是注解 注解是对程序进行标注和解释 2.常用注解 Override 描述子类重写父类的方法Deprecated 描述此方法已过时SuppressWarnings 压制警告 3.图解 4.注解与注释的区别 注解&#xff1a;给编译器看的&#xff0c;让虚拟机知道程序的特殊功能注…

【吴恩达机器学习笔记】

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

PostgreSQL 同步复制原理解析

背景 Postgresql 在主备架构的场景下&#xff0c;支持同步流复制功能。本文将以一主一备架构为例&#xff0c;介绍同步流复制&#xff08;同步备机&#xff09;的工作方式以及内核代码的相关原理。 配置同步备机 工欲善其事&#xff0c;必先利其器。我们现简单的配置一个同步…

微信小程序图书管理系统

目 录 摘 要 I Abstract II 目 录 V 1 绪论 1 1.1研究背景 1 1.2研究课题和意义 2 1.3研究内容和论文结构 3 2 移动网络环境下图书管理系统的现状分析 4 2.1移动网络环境下图书管理系统的特点 4 2.2当前国内外移动网络环境下图书管理系统的现状 7 2.3微信给移动网络环境下图书管…

遥感技术及高分遥感影像在地震中的应用及高分二号获取

长期以来&#xff0c;地震预报监测、灾害调查、灾情信息获取主要依靠实地勘测手段&#xff0c;其获取的数据精度和置信度虽然较高&#xff0c;但存在工作量大、效率低、费用高和信息不直观等缺点。遥感技术手段可在一定程度上克服传统实地勘测手段的缺点&#xff0c;并具有其他…

我参加第七届NVIDIA Sky Hackathon——训练ASR模型

如何从0开始训练自己的ASR模型 第一步 获取NGC密钥 第二步 配置Ubuntu22.04的运行环境 第三步 开始训练ASR模型 文章目录如何从0开始训练自己的ASR模型前言一、获取NGC密钥二、配置Ubuntu22.04的运行环境1.安装 NVIDIA 驱动 460 以上版本2.安装 docker 与 nvidia-docker23.安装…

iClient for Leaflet实现动态绘圆的几何查询

作者&#xff1a;ls 【目录】 背景前期准备呈现效果实现过程完整代码 【背景】 几何查询是WebGIS项目中一项比较常用的功能&#xff0c;SuperMap iClient 产品支持的几何对象类型众多&#xff0c;能够满足用户的许多需求。 近期遇到许多小伙伴反应&#xff0c;绘制圆形进行…

spring复习03,注解配置管理bean

spring复习03,注解配置管理bean注解的配置1.标识组件的常用注解&#xff1a;2.扫描组件&#xff1a;3.基于注解的自动装配&#xff1a;4.使用注解以后:基于注解自动装配的小例子1.dao层&#xff1a;2.service层&#xff1a;3.controller层&#xff1a;4.spring配置文件5.测试输…

Python控制程控电源

文章目录前言一、环境搭建二、使用步骤三、执行结果总结前言 本文章主要是记录汽车电子或嵌入式设备自动化测试中&#xff0c;部分场景需要控制被测设备的供电电源&#xff0c;以下就以常见的艾德克斯程控电源为例&#xff0c;分享如何通过Python来控制程控电源。 一、环境搭建…

Java字符串(String类)

目录 &#x1f6f4;一.认识String类 &#x1f6f4;二.String类的使用 &#x1f384;2.1构造字符串 &#x1f384;2.2字符串长度 &#x1f384;2.3String对象的比较 &#x1f384;2.4字符串查找 &#x1f45c;charAt方法 &#x1f45c;indexOf方法 &#x1f45c;lastI…

浅谈 Class.forName() 的用法

目录 什么是class对象 获得class对象的三种方法 class的作用和方法 Class.forName()用法 什么时候用Class.forName()&#xff1f; newInstance和new关键字的区别 应用问题解析 情景一&#xff1a;载入数据库驱动的时候 情景二&#xff1a;使用AIDL与电话管理Servic进行通…

[Spring Boot 5]安全管理

本文介绍了Spring Security 以及Shiro 在Spring Boot中的使用&#xff0c;对于Spring Security 有基于传统认证方式的Session认证&#xff0c;也有使用OAuth 协议的认证。一般来说&#xff0c;传统的Web架构中&#xff0c;使用Session 认证更加快速&#xff0c;但是&#xff0c…

2. 如何给在 SAP Business Application Studio 里开发的 OData 服务准备测试数据

在开始本步骤的学习之前,请大家务必完成前一步骤1. SAP Business Application Studio 里创建一个基于 CAP 模型的最简单的 OData 服务的学习。换言之,大家已经在 SAP Business Technology Platform 上的 Business Application Studio 里,创建好了 Dev Space,并且拥有一个能…

JVM 别和我说你还不知道这几种垃圾回收器?Serial |Parallel|ParNew|CMS|G1|ZGC

Serial / Serial Old 从单词翻译过来看 serial 串行&#xff0c;每次它就是一款单线程收集器。 Serial 工作在新生代垃圾回收&#xff0c;Serial Old在老年代进行垃圾回收&#xff0c;Serial Old一般作为CMS 并发收集失败后的备选回收方案。 在垃圾收集器面前&#xff0c;它…