消息队列RabbitMQ

消息队列

  • 一、起源
  • 二、原理
    • 预取值
    • 死信队列
      • 死信
    • 延迟队列
      • 应用场景
  • 三、用法

一、起源

消息队列简称MQ(Message Queue)。

假设有一个简单的订单处理系统,涉及三个业务:订单提交、库存更新和支付处理。

如果没有消息队列,订单处理系统可能会按照以下方式进行处理:

  1. 订单提交:用户在网站上提交订单后,网站后台服务直接接收到订单信息,并开始处理订单。订单处理的过程是同步的,网站后台服务会直接调用库存更新服务和支付处理服务来执行后续的业务逻辑。

  2. 库存更新:订单提交流程调用库存更新服务,进行商品库存的更新操作。这个操作是同步的,订单提交流程会阻塞直到库存更新完成。如果库存不足,库存更新服务可能会直接返回错误信息给订单提交流程。

  3. 支付处理:如果库存更新成功,订单提交流程会直接调用支付服务进行支付处理。支付操作同样是同步的,订单提交流程会阻塞直到支付处理完成。如果支付失败,支付服务可能会直接返回错误信息给订单提交流程。

在没有消息队列的情况下,整个订单处理过程是同步的,每个步骤都必须等待上一个步骤完成后才能进行。这种方式会导致系统的响应速度受限于处理速度最慢的步骤,并且难以处理高并发情况。此外,系统的可靠性也会受到影响,因为任何一个步骤的失败都可能导致整个订单处理过程失败。

在上述简化的订单处理系统中,如果引入消息队列,可以更好地体现解耦、异步和削峰的特性。

  1. 解耦:引入消息队列后,订单提交服务与库存更新服务和支付处理服务之间的耦合度降低了。订单提交服务只需将订单信息发送到消息队列,而不需要直接调用库存更新服务和支付处理服务。这样,订单提交服务与后续处理服务之间的依赖关系更松散,每个服务可以独立开发、测试和维护。

  2. 异步:引入消息队列后,订单处理过程变成了异步的。订单提交服务将订单信息发送到消息队列后,就可以立即响应用户请求,不需要等待后续业务处理完成。后续的库存更新和支付处理等业务逻辑则可以在自己的线程中异步处理,不会阻塞订单提交服务。这样可以提高系统的响应速度和并发能力。

  3. 削峰:消息队列可以用来平滑处理系统的高峰流量。在订单提交服务面对突发的订单请求时,如果后续的库存更新和支付处理服务处理不过来,消息队列可以暂时存储订单消息,避免系统因为负载过高而崩溃。后续的库存更新和支付处理服务可以按照自己的处理能力逐步消费消息队列中的订单消息,以平滑处理系统的高峰流量,保证系统的稳定性和可靠性。

综上所述,引入消息队列可以使订单处理系统实现解耦、异步和削峰的特性,提高系统的灵活性、可扩展性和稳定性。

二、原理

RabbitMQ 是一个流行的开源消息代理软件,用于实现高效的消息队列。它基于 AMQP(高级消息队列协议)标准,提供了可靠的消息传递机制,被广泛应用于构建分布式系统、微服务架构以及异步通信。
在这里插入图片描述

下面是 RabbitMQ 的基本原理:

  1. 消息生产者
    生产者是消息的发送方,它负责将消息发送到 RabbitMQ 交换机。消息可以是任何数据,通常以字节流的形式发送。生产者连接到 RabbitMQ,选择一个交换机,并将消息发送到该交换机。生产者可以选择指定消息的路由键,以确定消息被发送到哪个队列。

  2. 交换机(Exchange)
    交换机是消息的中转站,它接收来自生产者的消息,并将它们路由到一个或多个队列中。交换机根据特定的路由规则将消息路由到队列中。RabbitMQ 提供了几种类型的交换机,包括直接交换机、扇出交换机、主题交换机和头交换机,每种类型都有不同的路由规则。

  3. 队列(Queue)
    队列是消息的存储容器,它保存着被发送到交换机并满足特定路由规则的消息。生产者发送的消息最终都会被存储在一个或多个队列中。消费者连接到队列并从中接收消息。队列可以配置为持久化,以确保即使 RabbitMQ 服务器重启,也不会丢失消息。

  4. 消息消费者
    消费者是消息的接收方,它连接到 RabbitMQ 并订阅一个或多个队列,以接收消息。一旦有消息被发送到队列中,消费者就会收到通知,并从队列中接收消息。消费者处理消息的方式可以是同步或异步的,通常使用消费者来处理和执行从队列中接收到的消息。

  5. 虚拟主机(Virtual Host)
    虚拟主机提供了逻辑隔离机制,允许在单个 RabbitMQ 服务器上创建多个独立的消息代理环境。每个虚拟主机都有自己的一组交换机、队列和权限规则,使得不同的应用或团队可以在同一台 RabbitMQ 服务器上独立地使用消息队列服务而不会相互干扰。

  6. 持久化
    RabbitMQ 支持消息的持久化,包括交换机、队列和消息本身。通过持久化,可以确保即使在 RabbitMQ 服务器重启后,消息仍然不会丢失。

这些是 RabbitMQ 的基本原理,它们提供了一个强大而灵活的消息传递机制,适用于各种分布式系统和应用场景。

预取值

预取值可以理解为消费者一次从队列中获取的消息的个数。

默认情况下,RabbitMQ 的 prefetchCount 参数为 0,表示没有限制,即消费者会尽可能快地从队列中获取消息。

调用 channel.basicQos(prefetchCount) 来设置 prefetchCount 参数为 1,即每次只能获取一条消息。这样做可以确保消费者在处理完当前的消息之前不会收到新的消息,从而实现了不公平的消息分发

死信队列

死信

无法被消费者消费的消息;
来源:

  1. 消息过期(超过TTL还没有消费者接收消息,则成为死信)
  2. 队列达到最大长度(队列满了,无法再添加数据到 mq 中)
  3. 消息被拒绝(basic.reject 或
    basic.nack)并且 requeue=false.

死信消息会由正常队列发送给死信交换机,再由死信交换机发送给死信队列,由别的消费者取到。
因此正常队列要设置queueDeclare()的最后一个参数,绑定到某个死信交换机。还要设置routing-key指定死信消息去往哪个死信队列。

Map<String, Object> params = new HashMap<>();
// 正常队列设置死信交换机 参数  key  是固定值
params.put("x-dead-letter-exchange", DEAD_EXCHANGE);
// 正常队列设置死信  routing-key  参数  key  是固定值
params.put("x-dead-letter-routing-key", "lisi");
String normalQueue = "normal-queue";
channel.queueDeclare(normalQueue, false, false, false, params);

死信队列

延迟队列

基于死信队列的实现(队列中延迟):本质就是一个死信队列。利用了消息过期会成为死信消息,进入死信队列。(过期时间可以在队列上设置,也可以在生产者上设置)

在这里插入图片描述

基于插件的实现(交换机中延迟)

因为队列中的消息是排队处理的,如果使用在消息属性上设置 TTL 的方式,消息可能并不会按时“死亡“,因为 RabbitMQ 只会检查第一个消息是否过期,如果过期则丢到死信队列,如果第一个消息的延时时长很长,而第二个消息的延时时长很短,第二个消息并不会优先得到执行。

因此就有了基于插件的实现,将消息的延迟放在了交换机中。
在这里插入图片描述

应用场景

适用于需要延迟处理的场景。如: 用户发起退款,如果三天内没有得到处理则通知相关运营人员。

三、用法

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx(三)实现反向代理客户端 IP透传

正常情况下&#xff0c;客户端去访问代理服务器&#xff0c;然后代理服务器再取访问真实服务器&#xff0c;在真实服务器上&#xff0c;只能显示代理服务器的ip地址&#xff0c;而不显示客户端的ip地址&#xff0c;如果想让客户端的ip地址也能在真实服务端看见&#xff0c;这一…

matlab实现不同窗滤波器示例

1 汉明窗低通滤波器 &#xff1a; 在Matlab中使用汉明窗设计低通滤波器可以通过fir1函数实现。汉明窗通常用于设计滤波器&#xff0c;可以提供更突出的频率特性。 下面是一个示例代码&#xff0c;演示如何在Matlab中使用汉明窗设计低通滤波器&#xff1a; % 定义滤波器参数 fs …

景联文科技:引领战场数据标注服务,赋能态势感知升级

自21世纪初&#xff0c;信息化战争使战场环境变得更为复杂和难以预测&#xff0c;持续涌入的海量、多样化、多来源和高维度数据&#xff0c;加大了指挥员的认知负担&#xff0c;使其需要具备更强的数据处理能力。 同时&#xff0c;计算机技术和人工智能技术的飞速发展&#xff…

机试指南:Ch5:线性数据结构 Ch6:递归与分治

文章目录 第5章 线性数据结构1.向量 vector2.队列 queue(1)队列的特点、应用(2)基本操作(3)例题例题1&#xff1a;约瑟夫问题2 &#xff08;难度&#xff1a;中等&#xff09; (4)习题习题1&#xff1a;排队打饭 &#xff08;难度&#xff1a;中等&#xff09; 3.栈 stack(1)栈…

进程的通信以及信号的学习

一&#xff0c;进程的通信&#xff1a; 种类&#xff1a;1.管道 2.信号 3.消息队列 4.共享内存 5.信号灯 6.套接字 1.管道: 1.无名管道 无名管道只能用于具有亲缘关系的进程间通信 pipe int pipe(int pipefd[2]); 功能: 创建一个无名管道 …

NodeJS安装

1. NodeJS官网下载与安装 链接 2. 查看NodeJS安装版本 &#xfeff; 3. 查看npm版本 &#xfeff; 4.vscode安装4 &#xfeff;https://code.visualstudio.com/

亚马逊自养号测评:如何安全搭建环境,有效规避风险

要在亚马逊上进行自养号测评&#xff0c;构建一个真实的国外环境至关重要。这包括模拟国外的服务器、IP地址、浏览器环境&#xff0c;甚至支付方式&#xff0c;以创建一个完整的国际操作环境。这样的环境能让我们自由注册、养号并下单&#xff0c;确保所有操作均符合国际规范。…

vue3+vite+ts配置多个代理并解决报404问题

之前配置接口代理总是报404,明明接口地址是对的但还是报是因数写法不对;用了vue2中的写法 pathRewrite改为rewrite 根路径下创建env文件根据自己需要名命 .env.development文件内容 # just a flag ENVdevelopment# static前缀 VITE_APP_PUBLIC_PREFIX"" # 基础模块…

xlive.dll文件丢失了要怎么处理?快速修复xlive.dll的方法

涉及到Windows系统上运行游戏或应用程序时&#xff0c;xlive.dll文件丢失可能成为一个影响体验的常见错误。这个DLL&#xff08;动态链接库&#xff09;文件是Microsoft Games for Windows LIVE的一部分&#xff0c;对于确保很多游戏和程序能够正常运行至关重要。如果您在尝试启…

如何运行github上的项目

为了讲明白这个过程&#xff0c;特意做了一个相对来说比较好读懂的原理图&#xff0c;希望和我一样初学的小伙伴也能很快上手哈&#x1f60a; 在Github中找到想要部署的项目&#xff0c;这里以BartoszJarocki/CV&#xff08;线上简历&#x1f4c4;&#xff09;项目为例 先从头…

SQLSERVER 2014 删除数据库定时备份任务提示失败DELETE 语句与 REFERENCE 约束“FK_subplan_job_id“冲突

SQLSERVER 2014 删除数据库定时备份任务提示失败DELETE 语句与 REFERENCE 约束“FK_subplan_job_id“冲突 &#xff0c;错误如图&#xff1a; 问题原因&#xff1a;不能直接删除作业 任务&#xff0c;需要先删除计划里面的日志、删除代理作业、删除子计划以后才能删除作业。 解…

java面试(网络)

TCP和UDP有什么区别&#xff1f;TCP三次握手不是两次&#xff1f; TCP&#xff1a;面向连接&#xff0c;可靠的&#xff0c;传输层通信协议。点对点&#xff0c;占用资源多&#xff0c;效率低。 UDP&#xff1a;无连接&#xff0c;不可靠&#xff0c;传输层通信协议。广播&…

如何在Linux使用Docker部署Nexus容器并实现公网访问本地仓库【内网穿透】

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

服务器数据恢复-异常断电导致服务器硬盘离线的数据恢复案例

服务器数据恢复环境&#xff1a; dell某型号服务器中有一组通过raid卡组建的raid10&#xff0c;该raid阵列中一共有4块磁盘。上层部署XenServer虚拟化平台&#xff0c;作为网站服务器使用。 服务器故障&#xff1a; 服务器异常断电导致服务器上的一台虚拟机不可用。需要恢复这…

SQL进阶(三):Join 小技巧:提升数据的处理速度

复杂数据结构处理&#xff1a;Join 小技巧&#xff1a;提升数据的处理速度 本文是在原本sql闯关的基础上总结得来&#xff0c;加入了自己的理解以及疑问解答&#xff08;by GPT4&#xff09; 原活动链接 用到的数据&#xff1a;链接 提取码&#xff1a;l03e 目录 1. 课前小问…

神经网络系列---常用梯度下降算法

文章目录 常用梯度下降算法随机梯度下降&#xff08;Stochastic Gradient Descent&#xff0c;SGD&#xff09;&#xff1a;随机梯度下降数学公式&#xff1a;代码演示 批量梯度下降&#xff08;Batch Gradient Descent&#xff09;批量梯度下降数学公式&#xff1a;代码演示 小…

五种查看Spring容器中bean的方法

五种查看Spring容器中bean的方法 在Spring应用程序中&#xff0c;了解和查看容器中的Bean是进行调试和问题排查的关键。Spring提供了多种方法来查看容器中注册的Bean&#xff0c;以便我们深入了解应用程序的内部结构和调试潜在问题。本文将介绍五种常用的查看Spring容器中Bean的…

如何在宝塔面板中设置FTP文件传输服务并实现远程文件管理

文章目录 1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固定FTP地址连接 宝塔FTP是宝塔面板中的一项功能&#xff0c;用于设置和管理FTP服务。通过宝塔FTP&#xff0c;用户可以创建FTP账号&#xff0c;配置FTP用户权限…

Docker使用数据卷自定义镜像Dockerfile

目录 一、数据卷 1.1、简介 1.2、用途 1.3、特性&#xff1a; 1.4、数据卷相关操作 1.5、使用情况 二、自定义镜像Dockerfile 2.1、Dockerfile 2.1、使用情况 2.3、具体操作 a、自定义centos 创建文件 编辑内容 制作镜像 测试 b、自定义tomcat 创建文件 编…

人工智能到深度学习:药物发现的机器智能方法(综述学习)

Artificial intelligence to deep learning: machine intelligence approach for drug discovery - PubMed (nih.gov) 人工神经网络、深度神经网络、支持向量机、分类和回归、生成对抗网络、符号学习和元学习是应用于药物设计和发现过程的算法的例子。人工智能已应用于药物设计…