RabbitMQ 常见使用模式详解
RabbitMQ 常见使用模式详解
RabbitMQ 是一个强大的消息队列中间件,支持多种消息通信模式,能够适应不同的业务场景。在这篇文章中,我们将详细介绍 RabbitMQ 的几种常见使用方法及其对应的场景。
1. 发布/订阅(Publish/Subscribe)模式
在发布/订阅模式中,生产者发送消息到 交换器(Exchange),交换器会将消息路由到绑定的多个队列。不同于点对点的通信,消息可以被多个消费者接收。
常见的交换器类型包括:
- Direct Exchange:将消息精确地路由到指定的队列。
- Fanout Exchange:将消息广播到所有绑定的队列,适合广播场景。
- Topic Exchange:根据路由键(
routing key)模式,将消息路由到匹配的队列。 - Headers Exchange:根据消息头属性进行路由。
使用场景:
适用于需要将消息广播给多个消费者的场景,如发布新闻、发送系统通知等。
2. 工作队列(Work Queue)
工作队列模式用于任务分发的场景,多个消费者从队列中获取任务,进行负载均衡处理。
特性:
- 每个消费者从队列中获取并处理任务,保证每条消息只会被一个消费者处理。
- 消息确认机制:消费者处理完成后,向 RabbitMQ 发送确认,保证消息不会丢失。
使用场景:
适合任务处理型场景,如分布式图片处理、视频转码、邮件发送等。
3. 路由模式(Routing)
通过 Direct Exchange 实现,生产者发送消息时指定一个 routing key,消费者根据这个 routing key 来接收消息。
使用场景:
适合精确路由消息的场景,比如不同的日志级别将消息发送到不同的日志服务器。
4. 主题模式(Topic)
主题模式通过 Topic Exchange 实现,生产者根据模式匹配发送消息,消费者根据模式匹配接收消息。routing key 通过 . 分割,消费者可以使用通配符(* 和 #)来匹配消息。
使用场景:
例如一个股票系统,消费者可以订阅 stock.* 来接收所有股票消息,或者 stock.nasdaq.# 来接收纳斯达克的所有股票消息。
5. 请求/应答模式(RPC,Remote Procedure Call)
RPC 模式适合远程服务调用。客户端发送请求,服务端处理后返回结果。
使用场景:
适合微服务架构中的远程调用场景,常用于计算服务或数据库查询。
6. 延迟队列(Delay Queue)
延迟队列用于消息发布后延迟处理,通过设置 TTL(生存时间)来实现。
实现方式:
- 使用
x-delayed-message插件。 - 使用
TTL和死信队列(Dead Letter Queue)实现。
使用场景:
订单超时处理、定时任务执行等。
7. 优先级队列(Priority Queue)
RabbitMQ 支持优先级队列,优先级高的消息会被优先处理。通过 x-max-priority 参数设置队列的最大优先级,消息可以通过 priority 属性指定优先级。
使用场景:
适用于任务优先级不同的场景,如需要优先处理的客户订单。
8. 死信队列(Dead Letter Queue, DLQ)
当队列中的消息无法被消费时,会被转移到死信队列(DLQ)中进行处理。可以用于失败消息的重试和分析。
使用场景:
适用于任务失败重试机制,或者分析处理失败的消息。
9. 事务与确认模式
RabbitMQ 提供了两种机制来确保消息的可靠性:
- 事务模式:通过事务确保消息可靠投递,但性能较低。
- 确认模式(Publisher Confirms):更常用,生产者可以通过确认机制确保消息投递成功。
使用场景:
适用于需要高可靠性的场景,如金融交易系统。
10. 镜像队列(Mirrored Queue)
RabbitMQ 支持集群模式,镜像队列可以保证队列在多节点间同步,确保单点故障不会影响消息传递。
使用场景:
适合高可用场景,确保队列即使某个节点宕机也能继续运行。
总结
RabbitMQ 提供了丰富的使用场景和模式,从基本的发布/订阅、工作队列到复杂的延迟队列、优先级队列和死信队列,都可以满足不同业务场景的需求。合理使用 RabbitMQ 的这些模式,可以有效提高系统的可用性、可靠性和吞吐量。
相关文章:
RabbitMQ 常见使用模式详解
RabbitMQ 常见使用模式详解 RabbitMQ 是一个强大的消息队列中间件,支持多种消息通信模式,能够适应不同的业务场景。在这篇文章中,我们将详细介绍 RabbitMQ 的几种常见使用方法及其对应的场景。 1. 发布/订阅(Publish/Subscribe&a…...
JavaEE初阶——初识EE(Java诞生背景,CPU详解)
阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你! 目录 零:Java的发展背景介绍 一:EE的概念 二:计算机的构成 1:CU…...
iOS界面布局:屏幕尺寸与安全区域全面指南
引言 随着iPhone和iPad的更新迭代,iOS设备的屏幕尺寸和设计也在不断变化。无论是iPhone X系列的刘海屏,还是最新的iPhone 14,开发者都需要面对适配不同设备布局的问题。在项目开发中,导航栏、状态栏、TabBar的高度以及安全区域的…...
javascript-代码执行原理
js 是解释型语言 js 引擎执行流程 分为两个阶段: 语法分析执行阶段执行阶段涉及的数据结构: 调用栈。处理执行上下文和执行代码内存堆。给对象分配内存任务队列。暂存待执行的任务,分为宏任务队列和微任务队列语法分析 词法分析 > 语法分析 > 代码生成(字节码) …...
【C++ | tips】const Date* operator() const中这两个const有什么区别?他们的作用是什么?
const Date* operator&() const { return this; } 我们要明白operator&()这个函数是做什么的。 在C中,&操作符通常用于获取一个对象的地址。但是,有时候我们想要自定义这个行为,比如说,我们想要控制别人怎么获取…...
开放的数据时代:Web3和个人隐私的未来
在数字化和信息化的时代,数据隐私成为了公众关注的焦点。随着Web3技术的兴起,个人隐私保护进入了一个新的阶段。Web3作为去中心化的互联网架构,提出了对数据控制和隐私保护的新方案。本文将探讨Web3如何影响个人隐私的未来,并分析…...
Kafka 安全机制详解及配置指南
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱…...
渗透测试综合靶场 DC-2 通关详解
一、准备阶段 准备工具如Kali Linux,下载并设置DC-2靶场机。确保攻击机和靶机在同一网络段,通常设置为桥接模式或NAT模式。 1.1 靶机描述 Much like DC-1, DC-2 is another purposely built vulnerable lab for the purpose of gaining experience in …...
「iOS」——单例模式
iOS学习 前言单例模式的概念单例模式的优缺点单例模式的两种模式懒汉模式饿汉模式单例模式的写法 总结 前言 在一开始学习OC的时候,我们初步接触过单例模式。在学习定时器与视图移动的控件中,我们初步意识到单例模式的重要性。对于我们需要保持的控件&a…...
Selenium自动化测试面试必备:高频面试题及答案整理
自动化测试已经成为现代软件测试中不可或缺的一部分。在自动化测试中,Selenium是最受欢迎的工具之一,因为它可以模拟用户与Web应用程序的交互。因此,对于许多测试工程师来说,熟练掌握Selenium框架是非常重要的。如果你正在寻找一份…...
kettle 数据库迁移 使用分页原理实现 数据库mysql
使用 kettle 9.0 先修改配置文件: C:\Users\xx\.kettle 新增如下配置,解决mysql 空字符串 自动转 null bug KETTLE_EMPTY_STRING_DIFFERS_FROM_NULLY git地址: GitHub - 2292011451/kettle_tool 第一步: 先把要迁移的表进行读取,循环查询每个表的最大数量以及页数,追加到…...
量化回测bt框架,策略类bt.Strategy详解,不是backtrader!提供bt双均线策略示例,比backtrader还简单
前言 也不说那么多了,要用到bt,肯定也知道他是干嘛的,,给博主点点关注点点赞!!!这样博主才能更新更多免费的教程,不然就直接丢付费专栏里了 正文 bt.Strategy 是 bt 库中用于定义交…...
网络安全宣传周 | DNS安全威胁与应对措施分享
随着网络技术的快速发展和国际形势的日趋复杂,网络安全问题日益凸显,网络安全威胁开始呈现多样化、隐蔽化、高频化、系统化的发展态势。黑客攻击、网络诈骗、数据泄露等事件频发,不仅威胁到个人隐私和财产安全,也严重影响到国家政…...
【图书介绍】《Altium Designer 24入门与案例实践(视频教学版)》
本书重点 配套资源丰富,包括示例源文件、PPT课件、教学视频、电子教案、课程标准、教学大纲、模拟试题、作者微信群答疑服务。 内容简介 《Altium Designer 24入门与案例实践:视频教学版》以当前**的板卡级设计软件Altium Designer 24为基础,全面讲述…...
mysql事务的隔离级别学习
事务的隔离级别: ⅰ. 读未提交 ⅱ. 对已提交 (解决 脏读) ⅲ. 可重复读 (解决 不可重复读) ⅳ. 串行化 (解决 脏读 不可重复读 幻读 问题 ) 隔离级别分类如下,在不同的隔离级别下可能产生不…...
Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用增强扩展(text2sql)
前言 我在上一篇文章中《Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用(text2sql)》 利用langchain 中create_sql_agent 创建一个数据库代理智能体,但是实测中发现,使用 create_sql_agent 在对话中&#x…...
rapidocr 提取汇总
rapidocr介绍 A cross platform OCR Library based on OnnxRuntime. 以下资料是根据RapidOCR获得2024中国互联网发展创新与投资大赛(开源)二等奖整理汇编的 支持识别的文种如下: 中、英、日、韩、中文繁体、泰卢固文、卡纳达文、泰米尔文、拉丁文、 阿拉伯字母 、斯拉夫字…...
Linux:用户账号管理和组账号管理
用户账号管理 账号控制总述 用户账户 作用: 1.可以登陆操作系统 2.不同的用户具备不同的权限 唯一标识:UID(编号从0开始的编号,默认最大60000)zhangsan(UID 1200) 管理员root的UID:永远为0 系统用户(为程…...
MyBatis-Plus分页查询、分组查询
目录 准备工作1. 实体类2. Mapper类3. 分页插件4. 数据 分页查询1. 使用条件构造器2. 使用自定义sql 分组查询1. 分组结果类2. 自定义sql3. 测试类 准备工作 1. 实体类 对地址字段address使用字段类型转换器,将List转为字符串数组保存在数据库中 package com.exa…...
2024年9月HarmonyOS鸿蒙应用开发者高级认证全新题库(覆盖99%考题)
一个小时通过鸿蒙高级认证 1、在开发 Harmony0S 应用工程时, 随着业务的发展,现在需要创建一个模块, 关于在 DevEco Studio 中创建 Module , 下列选项哪种方式是错误的? 必对 在 hvigor 目录下,单击鼠标右键…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...
