零基础学习RabbitMQ(5)--工作模式(1)

在前面的章节中我们简单介绍过一些RabbitMQ的工作模式,RabbitMQ共提供了七种工作模式进行消息传递,这里我们来详细介绍。

1. Simple(简单模式)

P:生产者

C:消费者

特点:一个生产者一个消费者,消息只能被消费一次,也称为点对点(Point-to-Point)模式。我们上期写的示例就是这个模式

适用场景:消息只能被单个消费者处理。

2. Work Queue(工作队列) 

一个生产者,多个消费者,将消息分给不同的消费者,每个消费者收到不同的消息。

特点:消息不会被重复处理

使用场景:集群环境中做异步处理,例如12306短信通知服务,订票成功后,订单消息会发送给RabbitMQ,短信服务从RabbitMQ中获取订单信息并发送通知信息 。

3. Publish/Subscribe(发布/订阅)

 X表示交换机,生产者将消息发送给Exchange,由交换机按一定的规则路由到一个或多个队列中。

特点:一个生产者多个消费者,生产者发送一条消息,交换机(Fanout)转发给所有绑定的队列。

适用场景:消息需要被多个消费者同时接收的场景,如实时通知或者广播消息。例如电商平台下单后,同时触发 “用户通知”“库存扣减”“订单统计” 多个操作。

RabbitMQ有四种类型的交换机,不同类型有不同的路由策略:

  1. Fanout:广播,将消息交给所有绑定到交换机的队列(Publish/Subcribe模式)
  2. Direct:定向,把消息交给符合指定routing key的队列(Routing模式)
  3. Topic:通配符,把消息交给符合routing pattern(路由模式)的队列(Topics模式)
  4. Headers:headers类型的交换机不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配,headers类型的交换机性能会很差,而且也不实用,基本不会看到它的存在。

Exchange只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息就会丢失

注意:简单模式 和 工作队列模式 也会使用交换机转发消息,不会在生产者把消息直接发送给队列的情况,通常这两种模式使用的是Direct交换机,routing key通常为队列名。

  • routing key:路由键,生产者将消息发送给交换机时指定的一个字符串,用来告诉交换机把消息转发到哪个队列。每个消息只能有一个routing key
  • binding key:绑定,队列在绑定到交换机时,需要指定 BindingKey 作为匹配规则,只接收routing key对应的消息。一个队列可以有多个binding key,通过多次绑定实现

 4. Routing(路由模式)

路由模式是发布订阅模式的变种,在发送订阅的基础上,增加routing key,发布订阅模式是无条件将消息转发给所有队列,路由模式Exchange会根据routing key的规则来转发。

适用场景,需要根据特定规则分发消息的场景,例如系统打印日志,日志等级分为error,warning,info,debug,就可以通过这种模式把不同日志发送到不同的队列,最终输出到不同的文件。

5. Topics(通配符模式)

路由模式的升级版,在 Routing的基础上,增加了通配符的功能,即队列的bingding key可以写作通配符的模式来匹配不同的routing key

通配符规则

  • *(星号):匹配一个单词(如"order.*"匹配"order.create"但不匹配"order.create.success")。
  • #(井号):匹配零个或多个单词(如"order.#"匹配所有以"order."开头的 Routing Key)。

适用场景:需要灵活匹配和过滤消息的场景 

6. RPC(RPC通信) 

在PRC通信中,没有生产者和消费者,通过两个队列实现了一个远程过程调用

  1. 客户端发送请求:将请求消息发送到服务端队列,并附带一个回调队列地址和唯一请求 ID(correlation ID)。
  2. 服务端处理并响应:接收请求、处理逻辑,然后将结果发送到回调队列,同时携带相同的 correlation ID。
  3. 客户端匹配响应:根据 correlation ID 将响应与请求关联,实现 “伪同步” 效果。

 

适用场景:

  • 需要异步解耦但又需即时结果的场景。例如微服务间的轻量级通信。
  • 跨语言服务调用(RabbitMQ 支持多语言客户端)。

7. Publisher Confirms(发布确认)

Publisher Confirms模式是RabbitMQ提供的一种确保消息可靠发送到RabbitMQ服务器的机制,在这种模式下,生产者可以等待RabbitMQ服务器的确认,确保消息已经被服务器接收并处理。在默认模式下,生产者发送消息后不会收到任何反馈,若网络故障或交换机异常,消息可能丢失。而发布确认机制可以解决这一问题:

  1. 生产者发送消息:生产者将Channel设置为confirm模式后,发送消息会附带唯一的序列号(Sequence Number)。
  2. RabbitMQ 确认:交换机收到消息后,异步返回一个确认帧(Confirm Frame),包含相同的序列号。
  3. 生产者处理确认:根据序列号匹配确认结果,标记消息为 “已确认” 或 “未确认”。

适用场景:对数据安全性要求高的场景,例如金融交易,订单处理 

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

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

相关文章

Android Liunx ffmpeg交叉编译

本文的交叉编译在window上安装VMware,使用Ubuntu20.4进行的编译。 一、安装NDK: 1、下载解压: 在NDK 下载 | Android NDK | Android Developers下载Liunx平台的NDK。 本人下载的是android-ndk-r27c-linux.zip版本的。 解压android-ndk-r…

极海G32R501双向数字电源解决方案 赋能AI服务器及电源应用创新

6月26日,Big-Bit商务网主办的2025中国电子热点解决方案创新峰会在东莞召开,峰会以“核心智变、能效跃迁”为主题,聚焦光储充、800V超充、AI服务器、BMS、智能汽车照明与汽车中小电机电控应用。 峰会期间,珠海极海半导体有限公司&a…

【修电脑的小记录】连不上网

问题概述 问题表现为:电脑连接网络后,显示已连接但无法上网。 环境信息: - DNS 修改无效,ping 外网(8.8.8.8)失败 - 尝试重置网络参数、多种命令无果 🔍 排查过程 1. 执行以下命令重置网络&a…

QT中QSS样式表的详细介绍

转自个人博客 **Qt样式表(Qt Style Sheets,简称QSS)**是一种类似于HTML中的CSS(层叠样式表)的机制,用于自定义Qt应用程序的外观。通过QSS,开发者可以轻松地修改控件的外观,而无需更改…

Spring 依赖注入:官方推荐方式及最佳实践

Spring 依赖注入:官方推荐方式及最佳实践 你正在遭遇以下困境吗? 项目变大后,依赖关系像一团乱麻,牵一发而动全身?单元测试难如登天,被迫启动整个Spring容器?NullPointerException 总在运行时突…

javaweb听课笔记day1

MySQL数据模型 关系型数据库: 通过表来存储数据 关系型数据库是建立在关系模型基础上的数据库,简单说,关系型数据库是由多张能互相连接的二维表组成的数据库 优点: 都是使用表结构,格式一致,易于维护;使用通用的SQL语言操作…

《从量子奇境到前端优化:解锁卡西米尔效应的隐藏力量》

卡西米尔效应由荷兰物理学家亨德里克卡西米尔于1948年提出,它源于量子场论中“真空不空”的奇异观点。在传统认知里,真空是一片虚无,但量子理论指出,真空中充满了持续涨落的能量,即零点能。想象有两片中性的金属板被放…

【学习笔记】强化学习的数学原理

软活硬整,纳什又把RL翻出来讲了一遍,我以为是温故而知新,原来是在卖书。 不过温故而知新还是没啥毛病的。 PS:今天装Notepad时看到的,我还以为现在连用个Notepad都要给天线宝宝们捐款了。 文章目录 PART 11 overview…

深入“火星棒球数据API”:用数据解锁棒球世界的无限可能

在棒球运动日益数据化的今天,高效获取和处理海量比赛信息已成为球队制胜、媒体解读、球迷深入理解比赛的关键。“火星棒球数据API” 应运而生,成为连接棒球智慧与大数据技术的桥梁。本文将探讨这一API的核心价值、功能亮点及其如何重塑我们体验和分析棒球…

[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的校园服务平台管理系统,推荐!

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本校园服务平台管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…

「Java EE开发指南」如何用MyEclipse创建一个WEB项目?(三)

在本文中,您可以找到有关WEB项目的信息。将了解: Web项目结构和参数Web开发生产力工具JSP代码完成和验证 这些特性在MyEclipse中可用。在上文中(点击这里回顾>>),我们为大家介绍了Web开发效率工具、Web项目参数…

笨方法学python -练习6

程序: print("Mary had a little lamb.") print("Its fleece was white as {}.".format(snow)) print("And everywhere that Mary went.") print("." * 10) # what′d that do? end1 "C" end2 "h&qu…

【MySQL】Binlog文件占用空间比较大,如何清理

一、前言 在进行一次数据导入之后,发现服务器磁盘爆满,初步判断是数据库产生了大量binlog所致,接下来进行分析处理。 二、分析 1、查看磁盘空间 通过df -h命令,查看磁盘空间占用情况 2、查找占用文件或目录 通过命令:…

车载诊断架构 --- 非易失性存储器(NVM)相关设置项

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

C#: 输入对话框窗口函数

这是一个 C# 输入对话框函数,主要功能包括: 基础功能:创建带标题、提示文本和输入框的对话框,返回用户输入或空字符串(取消时) 增强特性: 支持必填项验证支持正则表达式格式验证实时错误提示与…

PCB工艺学习与总结-20250628

一、PCB板材 1、结构组成 基板:作为电路板的支撑体,通常由绝缘材料制成,如玻璃纤维或塑料。 导线:用于连接电路板上的各个元件,传输电流和信号。 元件:包括电阻、电容、电感、二极管、晶体管等,用于实现电路的各种功能。 焊盘:用于焊接元件引脚的金属片,确保元件…

VUE2与VUE3项目环境变量创建与使用区别

环境变量文件是项目中的.env开头的文件,如下图: 下图是VUE2.env文件中的配置,是以VUE_APP开头的 VUE_APP_PAGE_TITLE系统 VUE_APP_SERVICE_PREFIX/gateway/xxxxx在使用时 只需要 调用 process.env.VUE_APP_SERVICE_PREFIX 就可以获取到值 而…

php flush实时输出线上环境好使,本地环境等待一段时间后一次性输出结果的原因

近期对接deepseek接口时为了拥有较好的用户体验,等待答案返回时采用了flush分布输出,但是线上环境下可以正常分布输出,同样代码在本地总是等待许久后一次性出结果,排查许久,发现竟然是本地和线上不同的php加载模式导致…

【世纪龙科技】东风风光580汽车维护与底盘拆装检修仿真教学软件

在职业院校汽车专业的教学实践中,传统的汽车维护与底盘拆装实训常面临诸多挑战。实车操作不仅存在安全隐患,设备损耗、教学成本高的问题也不容忽视;部分学生因操作机会有限,难以系统掌握规范流程和仪器使用,教师在教学…

React大型项目目录结构设计

以下这种结构设计适合以下场景: 10人以上开发团队协作长期维护的中大型项目需要高度模块化和可扩展性的项目需要严格类型检查的TypeScript项目 根据实际需求,可以适当调整模块划分和目录结构,但保持核心的模块化思想和分层架构是关键。 Re…