消息队列RabbitMQ

news2024/11/27 4:27:13

1. 消息队列 RabbitMQ

消息队列是一种在应用程序之间发送和接收消息的方法,可以实现异步通信、解耦应用、提高系统性能等效果。RabbitMQ 是一款常用的开源消息中间件,它实现了 AMQP 协议规范,并提供了可靠性、灵活性、易用性等优秀特性。本文将介绍 RabbitMQ 的特点、工作模式、延迟队列和消息可靠性等方面的内容。

2. 特性

RabbitMQ 最突出的特点是可靠性和扩展性。具体来说,RabbitMQ 提供了如下特性:

  • 可靠性:确定性传输、持久化机制、生产者确认、消费者确认、事务机制等,确保消息传递的可靠性。

  • 灵活性:支持多种消息类型和传输模式、可根据需求选择不同的路由策略、支持集群部署、横向扩展等,满足不同场景的应用需求。

  • 易用性:提供了简单易用的 API 接口、交换机、队列和路由等功能模块、丰富的插件和工具支持,便于开发人员上手使用。

3. 工作模式

RabbitMQ 支持多种工作模式,常见的有点对点、工作、发布订阅、路由和主题等。

  • 点对点模式(Point-to-Point):消息发送方将消息发送到队列中,接收方从队列中取出消息并处理,一个消息只能被一个消费者接收。优点是简单可靠,缺点是无法广播消息。

  • 工作模式(Work Queues):一个消息被多个消费者同时消费,每个消费者消费一个消息后,该消息就被标记为“已消费”,其他消费者不会再次处理该消息。优点是提高了消息处理的并发性,缺点是无法对消息进行广播。

  • 发布订阅模式(Publish/Subscribe):在该模式下,消息发送方将消息发送到交换机中,订阅了该交换机的所有队列都会接收到该消息。优点是可以广播消息,缺点是无法保证消息传递的顺序。

  • 路由模式Routing:在该模式下,发送方将消息发送到指定的交换机中,而接收方则只接收满足特定条件(通过路由键标识)的消息。优点是可以针对特定条件进行过滤,缺点是需要对路由键进行配置,不够灵活。

  • 主题模式(Topic):主题模式是路由模式的扩展,可以使用通配符进行路由键的匹配。优点是支持更灵活的条件过滤,缺点是需要进行复杂的路由键配置。

RabbitMQ安装可以参考我的另一篇博客:

Linux安装RabbitMQ_源末coco的博客-CSDN博客进入erlang安装目录下的bin,erlang安装到了 /usr/local/erlang下。只要没提示 bash: erl: command not found... 就是安装成功了。创建/opt/rabbitmq目录,进入该目录。查看是否安装成功:任意位置输入erl。注意:防火墙放行对应的端口15672。下载比较慢,建议从本地上传。需要先解压成tar包再解压。https://blog.csdn.net/weixin_58724261/article/details/131235062

4. 延迟队列

RabbitMQ 延迟队列是指将消息先放入队列中,但是并不立即消费该消息,而是在一定时间后再进行消费的队列。延迟队列可以用来解决某些需要经过一段时间才能处理的任务,例如超时未支付订单的关闭、定时发送消息等场景。

在 RabbitMQ 中实现延迟队列有多种方法,比如使用 RabbitMQ 自带的插件 rabbitmq_delayed_message_exchange,或者结合 TTL 和死信队列来实现。

延迟队列的应用场景比较广泛,以下是几个典型的场景:

  • 超时未支付订单的关闭

在某些电商网站中,如果用户下单后一段时间内没有完成支付,系统会自动取消该订单。这种场景可以使用延迟队列来实现。当用户下单时,系统将该订单的信息发送到延迟队列中,设置一定的延迟时间,如果在延迟期间用户还未支付,则系统自动关闭该订单。

  • 定时发送消息

在某些场景下,需要在一定时间后向用户发送消息,比如提醒用户进行缴费、发送定期报告等。这种场景可以使用延迟队列,将消息先存储在队列中,设置一定的延迟时间,到达指定的时间后再将消息发送给用户。

  • 秒杀活动的处理

在秒杀活动中,大量用户同时抢购某种商品,如果系统一下子将所有订单信息发送给 RabbitMQ,可能会导致系统瘫痪。这时可以使用延迟队列,设置一定的延迟时间,逐步将订单信息发送到 RabbitMQ 中,避免一次性突发的流量压垮系统。

TTl和死信队列原理:

在 RabbitMQ 中,可以为队列设置 TTL。当消息达到设置的 TTL 时,RabbitMQ 会自动将其标记为过期并从队列中删除,并添加到死信交换机DLX中,死信交换机和普通交换机没有区别,它会将私信发送到私信队列中,消费者只需要消费死信队列中的消息。

RabbitMQ配置工作模式可以参考我的另一篇博客:

RabbitMQ配置工作模式_源末coco的博客-CSDN博客以上是简单模式和工作模式,工作模式只需要创建多个消费者即可。消费者只需要消费对应队列即可。https://blog.csdn.net/weixin_58724261/article/details/131235268

5. 消息可靠性

Rabbit提供消息确认机制、return、消费者手动ACK机制确保消息的可靠性

  • 消息确认:

当消费提供者将消息发送到交换机时,交换机会对消费提供者进行反馈。

  • return:

当交换机把消息分发到队列后,会将分发的结果反馈给消息提供者。

  • 消费者手动ACK:

消费者正常处理完消息后手动确认已消费,如果处理过程出现故障则不确认,此时消息会回到队列中,然后将故障信息记录日志。

RabbitMQ消费端的确认机制分为3种:none、manual、auto(默认)

none:

表示没有任何应答会被发送。

manual:

表示监听者必须通过调用channel.basicAck()来告知消息被处理。

  • channel.basicAck(long,boolean):确认收到消息,消息将从队列中被移除,为false时只确认当前一个消费者收到的消息,为true时确认所有消费者收到的消息。
  • channel.basicNack(long,boolean,boolean):确认没有收到消息,第一个boolean表示是一个消费者还是所有的消费者,第二个boolean表示消息是否重新回到队列,为true时表示重新入队。
  • channel.basicReject(long,boolean):拒绝消息,requeue=false表示消息不再重新入队,如果配置了死信队列,则消息进入死信队列。消息重回队列时,该消息不会回到队列尾部,仍在队列头部,这时消费者又会接收到这条消息,如果想让消息进入队列尾部,需确认消息后再次发送消息。

auto:

表示自动应答,除非MessageListener(消费者)抛出异常,这是默认配置方式。

  • 如果消息成功处理,则自动确认。
  • 当发生异常抛出AmqpRejectAndDontRequeueException时,则消息会被拒绝且不重新进入队列。
  • 当发生异常抛出ImmediateAcknowledgeAmqpException时,则消费者会被确认。
  • 当抛出其他的异常时,则消息会被拒绝,且requeue=true时会发生死循环,可以通过setDefaultRequeueRejected(默认是true)设置抛弃消息。

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

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

相关文章

DBSyncer安装_配置postgresql和mysql_sqlserver_oracel全量增量同步---数据全量增量同步之DBSyncer001

国内做开源的大神做的,用了一下还可以,就是不能和Phoenix这种操作hbase等数据库一起用, https://gitee.com/ghi/dbsyncer#postgresql 这个是官网,下载安装非常简单,官网也有中文详细说明. 直接下载安装包: 然后解压到某个地方,主要要用unzip dbsyncer.zip -d /opt/module这样…

干翻Mybatis源码系列之第十篇:Mybatis拦截器基本开发、使用和细节分析

给自己的每日一句 不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽…

微信小程序 method传参 和 页面传参

method传参 标签&#xff1a; <image src"/img/b1.jpg" classbannerImg mode"widthFix" bindtap"gotoMessage" data-flag"msg"></image> 使用data-参数Key 指定参数值 method: gotoMessage(e){ let flagName e.targe…

9. 子查询

9.1 概述 ​ 子查询指一个查询语句嵌套在另一个查询语句内部&#xff0c;这个特性从 MySQL 4.1 开始引入。 ​ 从相对位置来说&#xff0c;子查询又被称为内查询&#xff0c;主查询又被称为外查询 9.1.1 子查询的结构 子查询的结构如下所示&#xff1a; SELECT select_lis…

Apache Zeppelin系列教程第九篇——SQL Debug In Zeppelin

SQL Debug介绍 首先介绍下什么是SQL Debug&#xff1f; 但是经常有这样一个需求&#xff0c;一大段sql 跑出来之后&#xff0c;发现不是自己想要的结果&#xff1f;比如&#xff1a; demo 1: select id,name from ( select id,name from table1 union all select id,name fr…

数据库(第五章)数据库的完整性

1.数据库的正确性和相容性 正确性&#xff1a;符合现实逻辑 相容性&#xff1a;两个表中的同一对象要完全相同 如何实现数据库的完整性&#xff1f; 1.定义完整性约束条件 2.提供完整性检查方法 3.进行违约处理 完整性我们之前学过。包括三个 1.实体完整性 2.参照完整性 3.用户…

Fiddler中 AutoResponder 使用

Fiddler的 AutoResponder &#xff0c;即URL重定向功能非常强大。不管我们做URL重定向&#xff0c;还是做mock测试等&#xff0c;都可以通过该功能进行实践。 下面&#xff0c;小酋就来具体讲下该功能的用法。 如果你想学习Fiddler抓包工具&#xff0c;我这边给你推荐一套视频…

【C++进阶】带你手撕AVL树

文章目录 一、什么是AVL树二、AVL树的定义三、AVL树的插入1.理论讲解2.代码实现 四、AVL树的旋转1.左单旋2.右单旋3.左右双旋4.右左双旋 五、 AVL树的验证六、完整源码 一、什么是AVL树 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为…

Kafka集群部署

Kafka是一个高吞吐量、基于ZooKeeper&#xff08;ZooKeeper维护Kafka的broker信息&#xff09;的分布式发布订阅信息系统&#xff0c;它可以处理消费者在网站中的所有动作&#xff08;网页浏览&#xff0c;搜索和其他用户的行动&#xff09;流数据。通常情况下&#xff0c;使用…

Linux(CentOS 7)下安装配置Maven3.9.2

Linux&#xff08;CentOS 7&#xff09;下安装配置Maven3.9.2 环境 JDK 1.8OS:Centos 7.5 tar包安装 下载 apache-maven-3.9.2-bin.tar.gz https://maven.apache.org/download.cgi 安装步骤 公共服务&#xff0c;将maven安装在root用户下。 创建maven安装地址解压安装…

UE4/5样条线学习(三):样条线与时间轴

目录 简单的小模板 物品跟随样条线移动 粒子特效类&#xff1a; 简单的小模板 通过之前的案例&#xff0c;我们可以直接创建一个actor蓝图&#xff0c;加上要用的样条组件&#xff1a; 然后我们就可以通过时间轴做出不同的一些效果 在蓝图中找到时间轴的这个节点 双击时间…

Web安全测试中常见逻辑漏洞解析(实战篇)

前言&#xff1a; 越权漏洞是比较常见的漏洞类型&#xff0c;越权漏洞可以理解为&#xff0c;一个正常的用户A通常只能够对自己的一些信息进行增删改查&#xff0c;但是由于程序员的一时疏忽&#xff0c;对信息进行增删改查的时候没有进行一个判断&#xff0c;判断所需要操作的…

网络安全学习路线+自学笔记(超详细)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

2023我的前端面试准备

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 回顾过往&#xff0c;至今已有三个年头了&#xff0c;《2023年我的前端面试准备》在小…

我的创作纪念日——创作历程,机缘,与成就

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 写在前面 一.机缘 二.收获 三.日常 四.成就 五.憧憬与规划 六.分享 写在前面 大…

Vivado 下 IP核之FIFO 实验

目录 Vivado 下 IP核之FIFO 实验 1、FIFO IP 核简介 2、实验任务 3、程序设计 3.1、FIFO IP 核配置 3.1.1、“Basic” 选项卡下各参数配置 3.1.2、“Native Ports”选项卡下各参数配置 3.1.3、“Status Flags” 选项卡下各参数配置 3.1.4、“Data Counts&#xff08;数…

私域开始收费后,还值得做吗?

这些年&#xff0c;私域成为不少企业挖掘增量的新阵地。 私域指品牌自有的可随时、重复、低成本触达用户的场域。《2023私域运营趋势白皮书》&#xff08;后称<白皮书>&#xff09;显示&#xff0c;接受调研的企业中有70%将私域运营阵地放在腾讯旗下的企业微信。 不过&…

美的中间件面试(部分)

用redis有遇到过大key问题吗&#xff0c;怎么解决 我介绍项目中用异步解耦的思路来从mysql同步数据到redis&#xff0c;具体就是binlogkafaka。面试官问读的主mysql的binlog,还是从的binlog。A&#xff1a;主mysql。Q&#xff1a;可以用什么中间件读binlog。A&#xff1a;可以…

高效操作!linux在终端里快速跳转到文件管理器对应的目录下

在linux下&#xff0c;可能会有一个经常的操作&#xff0c;是在终端下&#xff0c;进入某个文件夹&#xff0c;用vim修改了某些操作&#xff0c;比如修改了一个html文件&#xff1b; 然后你想用chrome打开这个html文件&#xff0c;那么你可能需要打开文件管理器&#xff0c;切…

第五章 模型篇: 模型保存与加载

参考教程&#xff1a; https://pytorch.org/tutorials/beginner/basics/saveloadrun_tutorial.html 文章目录 pytorch中的保存与加载torch.save()torch.load()代码示例 模型的保存与加载保存 state_dict()nn.Module().load_state_dict()加载模型参数保存模型本身加载模型本身 c…