【Rabbitmq的消息模型】

news2024/11/13 16:30:36

消息队列的特性

  • durable:队列持久化。如果设置持久化,那么无论RabbitMQ在关闭时,就会将队列存储到本地磁盘,无论宕机还是重启,队列也不会删除;如果设置不持久化,那么在RabbitMQ关闭时,就会将队列删除。
  • exclusive:独占队列。如果设置独占,那么当前队列只允许预先设置的Connection访问;如果设置不独占,则所有Connection都可以访问。
  • autoDelete:自动删除队列。如果设置自动删除,那么当消费者消费完该队列的消息时,该队列立刻被删除;如果设置不自动删除,那么当消费者消费完该队列的消息时,该队列还会继续被保留。

消息自动确认机制

在这里插入图片描述

如果开启消息自动确认,那么一旦MQ把消息发送给消费者,那么该消息就会立即标记为删除。又因为在默认情况下,在MQ把消息发送给对应Consumer时,是一次性把属于该Consumer的所有消息发送到对应的通道内。所有如果其中一个消费者正在消费一个长期的任务却只完成的一部分就死了,那么我们就会丢失正在消费的消息和发送给该消费者中通道内尚未消费的所有消息。

如上模型,如果是循环的分发方式,Consumer-1一次性被分到的消息为1,3,5号消息,Consumer-2一次性被分到的消息为2,4,6号消息。如果Consumer-1在消费3号消息时出错宕机了,那么正在消费的3号消息和通道中还未消费的5号消息就会全部丢失。如果Consumer-2在消费2号消息时宕机了,那么正在消费的2号消息和通道中还未消费的4号、6号消息就会全部丢失。

为了保证业务数据的完整性,我们需要修改两个点:

  1. 在MQ把消息发送给消费者后,该消息不会标记为删除。

  2. 当某一消费者在宕机时,能够将正在消费的消息和还未消费的消息交给其他消费者继续消费。

第一点如果要实现,就要关闭消息自动确认机制。目的是为了保证在消费者消费消息宕机时,当前消息不会丢失。在关闭消息自动确认后,我们需要在每一个消息被正常消费后,手动确认该消息,这样该消息才会被标记为删除,MQ才会发送下一个消息给该Consumer。

第二点如果要实现,那么就不能按照默认的那样,MQ一次性将消息发送给Consumer,需要设置MQ每一次只能发给Consumer一个消息。目的是为了保证在消费者消费消息时,对应通道内没有其他消息,以至于如果该消费者宕机了,本应分给该消费者的消息能够被MQ分配给其他消费者消费。

消息模型

RabbitMQ在3.5版本之前只支持五种消息发布模型,分别是:“Hello World!”,Work queues,Publish/Subscribe,Routing,Topics。在3.7版本支持六种消息发布模型(新增RPC),在3.9版本支持七种消息发布模型(新增Publisher Confirms)。

RPC模型和Publisher Confirms模型本文中不会描述,本文只描述常见的五种消息发布模型,足够应对多种业务场景。

生产者和对应的一个或多个消费者必须在同一个用户下,连接同一个Virtual host(虚拟主机)、Channel(通道)、Exchange(交换机)和MQ(消息队列),才能相互进行通信。

1. "Hello World!"模型

在这里插入图片描述

点对点模型,一个生产者、一个消息队列和一个消费者

生产者直接将消息发送进消息队列,消费者监听消息队列,不断地从中获取消息并消费。

点对点模型只能处理一些简单的业务,如果消息比较多,消费者处理消息比较耗时时,那么生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积的越来越多。

2. Work queues模型

在这里插入图片描述

任务模型,一个生产者、一个消息队列和多个消费者

生产者直接将消息发送进消息队列,多个消费者监听同一个消息队列,共同消费消息队列中的消息。

队列中的消息一旦被某一个消费者消费,就会消失,因此消息是不会被重复消费的。

在Work queues模型中,MQ绑定了多个消费者,RabbitMQ默认采用了循环的方式分发消息。

循环:RabbitMQ将按顺序将每个消息发送到下一个使用者,平均每个消费者都会收到相同数量的消息。例如,有编号1-10的消息在MQ中,同时存在两个消费者,则消费者A分到的消息为1,3,5,7,9,消费者B分到的消息为2,4,6,8,10。

因为RabbitMQ默认是以循环的方式分发消息,所以如果消费者中有消费能力较弱的消费者,那么也会造成消息的堆积越来越多,拖慢系统的运行速度。RabbitMQ还提供了能者多劳的分发消息的方式,消费能力强的消费者就会被分到更多的消息,消费能力弱的消费者就会被分到更少的消息,该方式需要作额外设置。

3. Publish/Subscribe模型

在这里插入图片描述

广播模型,一个生产者、一个fanout交换机、多个消息队列和多个消费者,一个交换机绑定多个队列,一个消息队列绑定一个消费者

生产者首先将消息先发给交换机,交换机将消息发送给所有队列,队列接收到消息后再发送给对应绑定的消费者,实现一条消息被所有消费者消费。

根据AMQP协议,前两种模型也需要连接交换机,之所以没有在模型图中显示,是因为前两种模型使用的是RabbitMQ中的default交换机。

4. Routing模型

在这里插入图片描述

路由模型,一个生产者、一个direct交换机、多个消息队列和多个消费者,一个交换机绑定多个队列,一个消息队列绑定一个消费者

与广播模型的不同的是,广播模型的交换机与队列之间是任意绑定,也就是交换机绑定了所有队列。在路由模型中,交换机需要绑定一个RoutingKey(路由key)。队列也需要指定一个RoutingKey,交换机不再把消息发送给所有队列,而是根据队列的RoutingKey进行判断,只有队列的RoutingKey和交换机的RoutingKey完全一致,交换机才把消息发送给该队列进行消费。

例如上述模型,所有MQ绑定了 “info” 的RoutingKey,只有第一个MQ还另外绑定了 “error” 的RoutingKey。那么当生产者发送RoutingKey为 “info” 的消息时,交换机会将该消息发送给所有MQ;当生产者发送RoutingKey为 “error” 的消息时,交换机只会将该消息发送给第一个MQ。

注意:RoutingKey一般由一个或者多个单词组成,如果是以多个单词组成,单词之间以 “.” 分割

5. Topics模型

在这里插入图片描述

动态路由模型,一个生产者、一个topic交换机、多个消息队列和多个消费者,一个交换机绑定多个队列,一个消息队列绑定一个消费者

在路由模型中,如果队列需要绑定一个RoutingKey,那么就要单独设置一次RoutingKey,如果需要绑定多个RoutingKey,那么就要单独设置多次不同的RoutingKey,这样以来,会造成代码冗余,及其不方便。Topics模型提供了动态路由匹配规则,也就是在路由模型的基础上允许在RoutingKey中使用通配符,这样设置一个使用了统配符的RoutingKey就可以匹配多个符合规则的具体的RoutingKey了,从而不需要设置多次,大大简化了代码。

RabbitMQ中提供了两种通配符:

  • *:替换 1 个单词。
  • #:替换 0 个或者多个单词。

例如上述模型,第一个MQ绑定了 “*.rabbit.*” 的RoutingKey,最后一个MQ绑定了 “*.rabbit.#” 的RoutingKey。那么当生产者发送RoutingKey为 “user.rabbit.insert” 的消息时,交换机会将该消息发送给第一个MQ;当生产者发送RoutingKey为 “user.rabbit.insert.all” 的消息时,交换机会将该消息发送给最后一个MQ;当生产者发送RoutingKey为 “user.rabbit” 的消息时,交换机也会将该消息发送给最后一个MQ。

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

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

相关文章

发送邮箱API的性能指标有哪些,如何评估?

发送邮箱API的安全性措施?使用邮箱API的注意事项? 无论是用于事务性邮件、营销邮件还是通知邮件,发送邮箱API的性能直接影响用户体验和业务效果。AokSend将详细探讨这些问题,帮助您更好地理解和优化发送邮箱API。 发送邮箱API&a…

Shodan:互联网连接设备与漏洞分析的搜索引擎

前言 在当今数字化时代,互联网连接设备的数量急剧增长,从个人设备到企业服务器再到物联网(IoT)设备,这些设备构成了我们日常生活和工作的基础。然而,这些设备的连接也带来了潜在的安全风险,因为…

【算法 02】一题学习BFS和DFS算法

一题学习BFS和DFS算法 洛谷题目解析:【深基18.例3】查找文献 题目背景 小K热衷于在洛谷博客上阅读文章并探索其中的知识。每篇文章都可能包含指向其他博客文章的参考文献链接。小K的求知欲非常强,如果他阅读了某篇文章,他一定会去查看这篇文…

分享一个基于微信小程序的智慧校园服务平台(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

LLM可解释性的未来希望?稀疏自编码器是如何工作的,这里有一份直观说明

点击访问我的技术博客https://ai.weoknow.comhttps://ai.weoknow.com 简而言之:矩阵 → ReLU 激活 → 矩阵 在解释机器学习模型方面,稀疏自编码器(SAE)是一种越来越常用的工具(虽然 SAE 在 1997 年左右就已经问世了&am…

keil工程一下子跳出来非常多错误的原因可能

1.没有选择c99编译模式 2.没有选择优化模式为编码时合适的模式 3.start文件有问题 4.路径没有引用

用模方软件做单体化建模,修图时需要用哪种软件?可以用Photoshop吗

联动单体可以用草图大师、3Dmax;修纹理可以联动使用Photoshop。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能,支持一键自动提取房屋结…

一芯解锁「看家」新体验,航芯高性价比猫眼智能锁方案,让安全看得见!

随着智能门锁市场规模逐年递增,行业“内卷”也持续激烈。伴随着一路加码的功能卖点,智能门锁制造商正面临着产品功能芯片增多和成本优化的双重挑战。消费者不仅追求易用性、智能化和美观性,更期待产品具有良好的性价比。 而在智能门锁的众多…

ICML 2024 论文解析:解读量化感知的 Transformer 模型密态推理

导语:ICML 国际机器学习大会(International Conference on Machine Learning,简称 ICML)是机器学习领域最重要和最有影响力的学术会议之一。《Ditto: Quantization-aware Secure Inference of Transformers upon MPC(量…

【中项】系统集成项目管理工程师-第10章 项目整合管理-10.2制订项目管理计划

前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…

【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks

问题现象 客户将一个100G的表的数据插入到另一个表中,使用insert into select插入数据。从第一天下午2点开始执行,到第二天上午10点,一直未执行完毕。 由于需要实施下一步操作,客户kill重启了数据库,之后数据库一直回…

《清远折叠》,数智广东第一个SPN政务专网故事

今天,越来越多物理世界中的产业,正在与数字世界完成交汇,改变着我们习以为常的生活方式。 比如政务专网,就通过一张专用网络,将物理世界的政府部门与城市居民,在数字世界中“折叠”到一起,让人们…

Weblogic 漏洞

1.弱口令 访问默认用户名:weblogic 密码: Oracle123 点击安装 点击上载文件 将jsp木马打包,改为war,上传,一直下一步,最后点完成,访问99/99.jsp 使用工具连接 2.CVE-2017-3506 使用工具检测&#xff0c…

static的注意事项

总结 /*** ClassName Student* author gyf* Date 2024/8/5 23:48* Version V1.0* Description : */ public class Student {String name;int age;static String tecname;// 这个this 是虚拟机默认的public void show(Student this){System.out.println(this);System.out.prin…

ASP.NET Core 基础 - Razor Pages Web 应用

目录 一. 创建项目 二. 检查项目文件 三. 添加模型 四. 添加数据 五. 基架 六. 使用数据库 七. 总结 一. 创建项目 新建项目 点击运行 二. 检查项目文件 Pages 文件夹 包含 Razor 页面和支持文件。 每个 Razor 页面都是一对文件: 一个 .cshtml 文件&#xf…

如何白手起家?

作者:明王 日期:2016-07-1121:19 白手起家第一步,不是开公司,是脱离原生家庭,白手起家第二步,不是开公司,是挑个上升行业。白手起家第三步,不是开公司,是攒启动资金,白手起家笔四步&…

php反序列靶场serial

1.安装环境 2.使用kali扫描nat端口 3.使用物理机首先访问80端口,提示这里是新cookie进行程序测试,那我们查看cookie 4.f12查看,是一段base64编码 5.进行目录扫描 6.进入backup子目录发现有压缩包 7.下载bak.zip里面有三个源代码&#xff0…

单机部署ELK + Filebeat 收集应用日志

目录 前言一、ELK是什么?二、系统环境(CentOS 7)(2C4G的机器。。。)三、安装步骤3.1 安装ElasticSearch3.1.1 解压到/usr/local3.1.2 修改jvm堆配置(可选,测试服务器内存低)3.1.3 修…

C++初阶:类和对象(下)

✨✨小新课堂开课了,欢迎欢迎~✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C:由浅入深篇 小新的主页:编程版小新-CSDN博客 1.再探构造函数 1.1构造函数体内赋值 之前…

Parsing error: The keyword ‘interface‘ is reserved配置优化

当我们在创建Vue项目时,Vue默认是配置了eslint代码规范检查的,不过我们在项目中Typescript来编写代码时,却报了标题的错误,对应的代码如下: <script lang="ts"> export default{name: "DlHeader" } </script><script setup lang=&quo…