当前位置: 首页 > news >正文

【RabbitMQ】七种工作模式介绍

文章目录

  • 1. 简单模式
  • 2. 工作队列模式
  • 3. 发布订阅模式
    • 交换机
      • 类型
    • Publish/Subscribe 模式
  • 4. Routing(路由模式)
  • 5. Topics(通配符模式)
  • 6. RPC(RPC 通信)
  • 7. Publisher Confirms(发布确认)

1. 简单模式

image.png

  • P:生产者
  • C:消费者
  • Queue:队列

特点: 一个生产者,一个消费者。

  • 也称为点对点模式
    适用场景: 消息只能被单个消费者处理

2. 工作队列模式

image.png

  • 一个生产者有多个消费者
    • 队列会将消息分派给不同的消费者
    • 每个消费者都会接收到不同的消息
  • 适用场景:集群环境中做异步处理

如果队列中有 10 条消息,那么 C1C2 是共同消费这 10 条消息,消息不会重复消费

比如 12306 短信通知服务,订票成功后,订单消息会发送到 RabbitMQ,短信服务从 RabbitMQ 中获取订单信息,并发送通知信息(在短信服务之间进行任务分配)image.png|499

3. 发布订阅模式

image.png

  • X:表示交换机

交换机

Exchange:交换机(X

作用:生产者将消息发送到 Exchange,由交换机将消息按一定规则路由到一个或多个队列中(上图中生产者将消息投递到队列中,实际上这个在 RabbitMQ 中不会发生)

类型

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

  1. Fanout广播,将消息交给所有绑定到交换机的队列(Publish/Subscribe 模式)
    • RabbitMQ 工作流程中,交换机和队列之间是有绑定关系的(一对一,一对多,一对无)
  2. Direct定向,把消息交给符合指定 routing key 的队列(Routing 模式)
    • Routing Key路由键。生产者将消息发送给交换器时,指定的一个字符串,用来告诉交换机应该如何处理这个消息
    • Binding Key绑定RabbitMQ 中通过 Binding交换器于队列关联起来,在绑定的时候一般会指定一个 Binding Key,这样 RabbitMQ 就知道如何正确地将消息路由到队列了image.png|628

比如下图:如果在发送消息时,设置了 RoutingKeyorange,消息就会路由到 Q1image.png|518
当消息的 Routing Key 与队列绑定的 BindingKey 相匹配时,消息才会被路由到这个队列

Bindingkey 其实也属于路由键中的一种,官方解释为:the routingkey to use for the binding。可以解释为:在绑定的时候使用的路由键。大多数时候,包括官方文档和 RabbitMQ Java API 中都把 BindingKeyRoutingKey 看做 RoutingKey,为了避免混淆,可以这么理解

  1. 在使用绑定的时候,需要的路由键是 BindingKey
  2. 正在发送消息的时候,需要的路由键是 RoutingKey
  1. Topic通配符,把消息交给符合 routing pattern(路由模式)的队列(Topic 模式)
  2. headers:此类型不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的 headers 属性进行匹配。headers 类型的交换器性能会很差,而且也不实用,基本上不会看到他的存在

Publish/Subscribe 模式

一个生产者 P,多个消费者 C1C2X 代表交换机消息复制多份,每个消费者接收相同的消息

  • 生产者发送一条消息,经过交换机转发到多个不同的队列,多个不同的队列就有多个不同的消费者
  • 适合场景:消息需要被多个消费者同时接收的场景。如:实时通知或者广播通信

比如中国气象局发布“天气预报”的消息送入交换机,新浪、百度、搜狐、网易等门户网站介入消息,通过对类绑定到该交换机,自动获取气象局推送的气象数据

4. Routing(路由模式)

image.png|325

  • 路由模式是发布订阅模式的变种,在发布订阅基础上,增加路由 key
  • 发布订阅模式是无条件的将所有消息分发给所有消费者,路由模式是 Exchange 根据 RoutingKey 的规则,将数据筛选后发给对应的消费者队列
  • 适用场景:需要根据特定规则分发消息的场景

比如系统打印日志,日志等级分为 errorwarninginfodebug,就可以通过这种模式,把不同的日志发送到不同的队列,最终输出到不同的文件

5. Topics(通配符模式)

image.png

  • 路由模式的升级版,在 Routingkey 的基础上,增加了通配符的功能,使之更加灵活
  • TopicsRouting 的基本原理相同
    • 即:生产者将消息发给交换机,交换机根据 RoutingKey 将消息转发给与 RoutingKey 匹配的队列,类似于正则表达式的方式来定义 RoutingKey 的模式
    • 不同之处在:RoutingKey 的匹配方式不同,Routing 模式是相等匹配,Topics 模式是通配符匹配
      • 如果 RoutingKeyb.a.c,就会发到 Q1
      • * 表示一个单词,# 表示多个单词
  • 适用场景:需要灵活匹配和过滤消息的场景

6. RPC(RPC 通信)

image.png
RPC 通信的过程中,没有生产者和消费者,比较像 RPC 远程调用,大概就是通过两个队列实现了一个可回调的过程

image.png

  1. 客户端发送消息到一个指定的队列,并在消息属性中设置 replyTo 字段,这个字段制定了一个回调队列,用于接收服务端的响应
  2. 服务端接受到请求后,处理请求并发送响应消息到 replyTo 指定的回调队列
  3. 客户端再回调队列上等待响应消息。一旦收到响应,客户端会检查消息的 correlatiodId 属性,以确保它是所期望的相应

7. Publisher Confirms(发布确认)

Publisher Confirms 模式是 RabbitMQ 提供的一直确保消息可靠发送到 RabbitMQ 服务器的机制。在这种模式下,生产者可以等待 RabbitMQ 服务器的确认,以确保消息已经被服务器接受并处理

  1. 生产者将 Channel 设置为 confirm 模式(通过调用 channel.confirmSelect() 完成) 后,发布的每一条消息都会获得一个唯一的 ID,生产者可以将这些序列号与消息关联起来,以便跟踪消息的状态
  2. 当消息被 RabbitMQ 服务器接收并处理后,服务器会异步地向生产者发送一个确认 (ACK) 给生产者 (包含消息的唯一 ID),表明消息已经送达

通过 Publisher Confirms 模式,生产者可以确保消息被 RabbitMQ 服务器成功接收,从而避免消息丢失的问题

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

image.png

工作模式的使用案例

简单模式

safj

相关文章:

【RabbitMQ】七种工作模式介绍

文章目录 1. 简单模式2. 工作队列模式3. 发布订阅模式交换机类型 Publish/Subscribe 模式 4. Routing(路由模式)5. Topics(通配符模式)6. RPC(RPC 通信)7. Publisher Confirms(发布确认&#xf…...

【C++进阶篇】二叉搜索树的实现(赋源码)

掌握二叉搜索树:从基础知识到实际应用的全貌 一. 二叉搜索树简介1.1 基本概念1.2 意义与价值1.3 典型应用场景1.4 性能分析1.5 总结与展望 二. 搜索二叉树实现2.1 插入2.2 查找2.3 删除2.3.1 单或无孩型2.3.2 双孩型2.3.4 整合代码 三. ⼆叉搜索树key和key/value使⽤…...

LLMs 其他 Trick

huggingface 下载不了模型问题? from modelscope.hub.snapshot_download import snapshot_download model_dir snapshot_download(damo/nlp_xlmr_named-entity-recognition_viet- ecommerce-title, cache_dirpath/to/local/dir, revisionv1.0.1) 方法一&#xff1…...

2025年金融创新、区块链与信息技术国际会议(FRCIT 2025 2025)

2025 International Conference on Financial Innovation, Regional Chains, and Information Technology (一)会议信息 会议简称:FRCIT 2025 大会地点:中国郑州 收录检索:提交Ei Compendex,CPCI,CNKI,Google Schola…...

rtty操作记录说明

rtty操作记录说明 前言 整理资料发现了几年前做的操作记录,分享出来,希望对大家有用。 rtty-master:rtty客户端程序,其中buffer\log\ssl为源码的子目录,从git上下载https://github.com/zhaojh329, rtty…...

股指期货是什么?有啥特点?怎么用?

股指期货,英文简称SPIF,全称是股票价格指数期货,也叫股价指数期货、期指。简单来说,它就是以股价指数为“赌注”的一种期货合约。想象一下,你和朋友打了个赌,约定在未来的某个日子,按照事先说好…...

提示词设计模板(基于最佳实践)

1. 任务清晰化 模糊指令 ➜ 明确指令 ❌ "写一篇关于环保的文章" ✅ *"列出5种城市环保措施,并分别说明其对减少碳排放的影响(要求:数据支持案例)"* 2. 任务步骤化 案例:策划线上营销活动 1.…...

涌现理论:连接万物的神秘力量

一、理论起源与概述 现象引介:通过蜂群“风浪”(蜜蜂抖动翅膀呈波浪式扩散)、鱿鱼变色捕猎等生物现象,引出涌现理论。理论定义:涌现理论可有效介入复杂问题,解释事物起源,适用于物理、化学、生…...

9.9 Ollama私有化部署Mistral 7B全指南:命令行交互到API集成全流程解析

Ollama私有化部署Mistral 7B全指南:命令行交互到API集成全流程解析 关键词:Ollama 私有化部署, Mistral 7B 运行, 本地大模型管理, 命令行交互, REST API 集成 一、Mistral 7B 模型特性解析 Mistral 7B 是由 Mistral AI 团队开发的高性能开源大语言模型,在同等参数量级模型…...

【Redis 进阶】缓存

思维导图: 1. 缓存的基本概念 1.1 缓存的实例化解释 以火车站刷身份证为例,身份证存放在皮箱中虽安全,但取用不便;而将其置于衣袋,则显著提高了访问效率。这一过程恰似计算机系统中缓存的运作机制——将常用数据暂存于…...

游戏资源传输服务器

目录 项目简介项目实现nginx配置服务器逻辑图 项目代码简介reactor 模型部分文件传输部分 项目演示视频演示演示分析 项目简介 使用C开发,其中资源存储在fastdfs 中,用户通过http上传或下载资源文件,此项目需要开启nginx中的nginx-upload-mod…...

dockerdesktop 重新安装

1、卸载 dockerdesktop 卸载时,最后一步删除镜像文件 会卡住 取消 2、在资源管理器中将镜像文件路径改名 如:e:\docker 修改 e:\docker1 3、重新安装wsl wsl --shutdown 以管理员身份运行hy.bat pushd "%~dp0" dir /b %SystemRoot%\servic…...

免费实用的远程办公方案​

假如你需要快速检索出远程电脑文件并下载? 假如你需要访问远程电脑的共享文件夹? 假如你需要访问远程电脑的USB设备,例如软件加密狗、调试器、固件烧录器、U盘等? 本篇文章能够解决以上痛点。 这个方案非常实用,也很…...

论文知识总结

参考1 一 Intelligent reflecting surface (IRS)跟RIS区别是什么 Intelligent Reflecting Surface (IRS) 和 Reconfigurable Intelligent Surface (RIS) 在很多情况下所指相同或相近,常被视为同一类技术的不同表述,但在一些特定语境下也有细微区别&…...

WebGIS 开发黑科技:解锁地理信息的新视界

你能想象吗?在我们生活的这个广袤星球上,每一处角落的地理信息,竟能通过网页,以超乎想象的方式呈现在眼前。WebGIS,这个看似神秘的词汇,实则是当下地理信息领域的 “黑科技”。它究竟有何神奇魔力&#xff…...

Postman启动时检测到版本不匹配错误

Postman启动时检测到版本不匹配错误,提示:Version mismatch detected. Looks like youve used a newer version of the Postman app on this system. 找到 C:\Users\AppData\Local\Postman C:\Users\AppData\Roaming\Postman 并删除现有的 postman 文件夹…...

Java Spring MVC -01

SpringMVC 是一种基于 的实现 MVC 设计模式的请求驱动类型的轻量级 Web 框架,属于 Spring FrameWork 的后续产品,已经融合在 Spring Web Flow 中。 First:SpringMVC-01-SpringMVC 概述 SpringMVC 是 Spring 框架的一个模块,用于构建 Web 应…...

遨游5G-A防爆手机:赋能工业通信更快、更安全

在工业数字化转型与5G-A商用进程加速的双重驱动下,中国防爆手机市场正迎来历史性发展机遇。作为“危、急、特”场景通信解决方案服务商,遨游通讯深刻洞察到:当5G-A网络以超高速率、海量连接和毫秒级时延重塑行业生态时,防爆手机这…...

MySQL 8.0 OCP 1Z0-908 51-60题

Q51.Examine this parameter setting: audit_logFORCE_LOG_PERMAENT What effect does this have on auditing? A)It will force the load of the audit plugin even in case of errors at server start.//插件在之前就必须加载完成,只有当插件之前通过 INSTALL PL…...

javax.servlet.Filter 介绍-笔记

1.javax.servlet.Filter 简介 javax.servlet.Filter 是 Java Servlet API 中的一个核心接口,用于在请求到达目标资源(如 Servlet 或 JSP)之前或响应返回给客户端之前执行预处理或后处理操作。它常用于实现与业务逻辑无关的通用功能&#xff…...

【2025年前端高频场景题系列】使用同一个链接,如何实现PC打开是web应用、手机打是-个H5 应用?

面试情境与问题引入 哈喽大家伙,我是布鲁伊。在前端开发面试中,面试官经常会抛出一些看似简单却能考察多方面能力的问题。"如何实现同一个链接在PC端和移动端展示不同应用?"就是这样一个典型问题。为什么面试官喜欢问这个问题?因为它能同时考察候选人的设备适配…...

GPT 经验

GPT 经验篇 一、gpt源码past_key_value是干啥的?二、gpt onebyone 每一层怎么输入输出?三、bert和gpt有什么区别四、文本生成的几大预训练任务?五、讲讲T5和Bart的区别,讲讲bart的DAE任务?六、讲讲Bart和Bert的区别&am…...

uniapp|实现获取手机摄像头权限,调用相机拍照实现人脸识别相似度对比,拍照保存至相册,多端兼容(APP/微信小程序)

基于uniapp以及微信小程序实现移动端人脸识别相似度对比,实现摄像头、相册权限获取、相机模块交互、第三方识别集成等功能,附完整代码。 目录 核心功能实现流程摄像头与相册权限申请权限拒绝后的引导策略摄像头调用拍照事件处理人脸识别集成图片预处理(Base64编码/压缩)调用…...

蓝桥杯13届国B 出差

题目描述 A、B、C、D四个人中要派两个人出差,按下述三个条件有几种安排方案,如何安排。 (1) 若A去,则C和D中要去一人。 (2) B和C不能都去。 (3) C去则D要留下。 输入描述 本题无输入。 输出描述 按字典序输出所有符合要求的安排方案&…...

论软件设计模式及其应用

三、正文 摘要 2023年 3 月,我所在的公司承接了某油企智慧加油站平台的建设工作。该项目旨在帮助加油站提升运营效率、降低运营成本和提高销售额。我在该项目中担任系统架构设计师,负责整个系统的架构设计工作。本文以该项目为例,详细论述了…...

实现 STM32 PWM 输出:原理、配置与应用详解

实现 STM32 PWM 输出:原理、配置与应用详解 在嵌入式开发领域,STM32 微控制器凭借其强大的功能和丰富的外设资源,被广泛应用。PWM(脉冲宽度调制)作为 STM32 的重要功能之一,对于电机调速、LED 调光、信号合…...

优艾智合机器人助力半导体智造,领跑国产化替代浪潮

在全球半导体产业加速自动化转型的背景下,传统物流已成为制约智能化升级的关键瓶颈。作为中国移动机器人行业的领军企业,优艾智合(YOUIBOT)自2017年起就敏锐洞察到"半导体设备国产化"的紧迫需求,依托在工业移…...

Pytorch张量和损失函数

文章目录 张量张量类型张量例子使用概率分布创建张量正态分布创建张量 (torch.normal)正态分布创建张量示例标准正态分布创建张量标准正态分布创建张量示例均匀分布创建张量均匀分布创建张量示例 激活函数常见激活函数 损失函数(Pytorch API)L1范数损失函数均方误差损失函数交叉…...

【RabbitMQ】工作队列和发布/订阅模式的具体实现

文章目录 建立连接工作队列模式实现创建队列和交换机生产者代码消费者代码运行程序启动消费者启动生产者 发布/订阅模式实现创建队列和交换机生产者代码创建交换机声明两个队列绑定队列和交换机发送消息完整代码 消费者代码完整代码 运行程序启动生产者启动消费者 建立连接 我…...

loki grafana 页面查看 loki 日志偶发 too many outstanding requests

问题描述 grafana 页面查看 loki 日志偶然出现 too many outstanding requests loki pod 日志报错 levelerror ts2025-05-13T06:15:52.509738812Z callerscheduler_processor.go:158 org_idfake traceID1570d49e6d15b25c msg"error notifying scheduler about finished …...

Python之with语句

文章目录 Python中的with语句详解一、基本语法二、工作原理三、文件操作中的with语句1. 基本用法2. 同时打开多个文件 四、with语句的优势五、自定义上下文管理器1. 基于类的实现2. 使用contextlib模块 六、常见应用场景七、注意事项 Python中的with语句详解 with语句是Python…...

tomcat搭建内网论坛

准备工作: 准备jdk-8u291-linux-x64.tar.gz压缩包与apache-tomcat-9.0.16.tar.gz压缩包。 jdk安装: tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/ cd /usr/local/ ln -s jdk1.8.0_291/ jdk vim /etc/profile.d/jdk.sh cat /etc/profile.d/jdk.s…...

基于开源AI大模型AI智能名片S2B2C商城小程序的零售结算技术创新研究——以京东AI与香港冯氏零售集团智能结算台为例

摘要:本文以京东AI与香港冯氏零售集团共同打造的人工智能结算台为切入点,结合开源AI大模型、AI智能名片及S2B2C商城小程序的技术特性,深入探讨其在零售结算领域的创新应用。研究发现,开源AI大模型为智能结算提供了强大的图像识别与…...

supabase 怎么新建项目?

在 Supabase 中新建项目主要通过官方网站的仪表盘 (Dashboard) 来完成。以下是详细步骤: 通过 Supabase 仪表盘新建项目: 注册/登录 Supabase 账户: 访问 Supabase 官网:https://supabase.com/如果你还没有账户,点击 …...

框架篇八股(自用)

框架篇 Spring框架中的bean不是线程安全的 Scope() singleton单例 prototype多例 一个类中有可修改的成员变量需要考虑线程安全 bean没有可变状态(service类,DAO类) 某种程度单例bean是线程安全的 AOP面向切面编程…...

Flask Docker Demo 项目指南

首先,创建一个新的项目目录并创建必要的文件: mkdir flask-docker-demo cd flask-docker-demo创建一个简单的Flask应用 (app.py): from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, Docker World…...

蓝卓AI智能体平台

在数字化浪潮席卷全球的今天,制造业企业正面临前所未有的挑战:如何将海量数据转化为精准决策?如何让传统生产流程具备“自进化”的智能?如何打破数字化与智能化之间的鸿沟?蓝卓数字科技凭借对工业场景的深刻理解&#…...

typedef unsigned short uint16_t; typedef unsigned int uint32_t;

你提到的这两行是 C/C 中的类型别名定义: typedef unsigned short uint16_t; typedef unsigned int uint32_t;它们的目的是让代码更具可读性和可移植性,尤其在处理精确位数的整数时非常有用。 ✅ 含义解释 typedef unsigned short uint16_t;…...

黑马k8s(五)

1.Namespace 2.Pod run nginx:nginx是pod控制器的名称,不是pod的名称 查看pod更高的参数: 启动一个不存在的镜像:pod 查看 dev下面的pod,第二个pod处于容器创建的状态 查看pod的详情描述: 通过pod的ip&…...

进程间通信分类

前提: 进程具有独立性,要通信就是要让它们:看到同一份资源(某种形式的内存空间,操作系统提供) 本地通信:同一台主机,OS,用系统调用通信。标准:systemV。 S…...

uniapp-商城-56-后台 新增商品(弹窗属性继续分析)

1、概述 前面我们讲了布局和相应商品属性的页面布局。属性是一个弹窗,它是一个cell的组件的实现属性。点击该cell就会调用uni-popup 进行弹窗。基本的页面布局如下: 属性显示其实是个一嵌套的数据显示。 2 页面显示商品属性 点击添加属性 2.1 代码如…...

奇怪的公式

奇怪的公式 背景导入 在剑桥大学,瞥了一眼下面这个公式,我眩晕了,庆幸自己没学数学专业。 1 2 3 4 ⋯ − 1 12 1234\dots -\frac{1}{12} 1234⋯−121​ 一天,剑桥大学教授哥德弗雷哈代收到一封来自印度的信。写信人叫拉马…...

web 自动化之 PO 设计模式详解

文章目录 一、什么是 POM二、如何基于 POM 进行自动化框架架构?1、base 层封装2、pageobjects 层封装3、TestCases 层封装 三、元素和方法分离&数据分离1、哪些部分可以进行分离2、示例代码 四、总结 一、什么是 POM POM page object model 页面对象模型 WEB 自…...

golang 定时器

写法一&#xff1a; package mainimport ("fmt""sync""time" )type DemoTicker struct {ch <-chan time.Timestop chan struct{}sg *sync.WaitGroup }func main() {count, stopCount : 0, 5demo : DemoTicker{ch: time.Tick(time.Seco…...

ETL 数据集成平台与数据仓库的关系及 ETL 工具推荐

数字化时代企业每天都会产生海量的数据&#xff0c;这些数据分散在不同的系统、数据库和应用中。为了能够有效地利用这些数据&#xff0c;进行数据分析、商业智能决策等&#xff0c;ETL数据集成平台和数据仓库成为了企业数据管理架构中的关键组成部分。本文将深入探讨ETL数据集…...

java架构设计

1.可维护性 封装性&#xff0c;例如将缓存redis封装到一个service&#xff0c;别的地方用到&#xff0c;只需要传参调用就行。如果有一天换国产缓存&#xff0c;只需要修改service&#xff0c;而不需要修改多出引用地方 * 可维护性&#xff1a;后期功能迭代&#xff0c;不可避…...

UDP--DDR--SFP,FPGA实现之指令监测模块实现

指令监测模块实现介绍 如下图所示&#xff0c;为指令监测模块的运行框图 将指令设置为8bytes数据&#xff0c;故需要一个64位寄存器进行缓存&#xff0c;在进行数据缓存时&#xff0c;数据不可以输出至下一级模块&#xff0c;故对数据和有效指示信号也应该进行相应延迟&#…...

Houdini安装SideFX Labs工具架

开源免费的 https://github.com/sideeffects/SideFXLabs/releases 下载后解压 放到文档里 新建一个packages文件夹 把SideFXLabs.json 复制到packages文件夹 删除一些没用的平台 修改相关路径即可 然后就能在houdini里搜到 autouv 节点 不然没装是没有这个节点的 参考教程 …...

uniapp+vue3+uview来开发我们的项目

前言&#xff1a; 就像我们vue的web的框架element、iview等一样&#xff0c;我们的uni-app开发也有适合的他的框架&#xff0c;除了他本身的扩展组件以外&#xff0c;第三方好用的就是就是uview了。 实现效果&#xff1a; 官网信息&#xff1a; vue2版本&#xff1a;uview-ui …...

MySQL 5.7在CentOS 7.9系统下的安装(上)——以rpm包的形式下载mysql

这里我们主要以CentOS 7.9为例进行介绍&#xff0c;会顺带讲讲Ubuntu的操作方式。 目录 一、检查自己的机器上是否安装有MySQL&#xff1a; &#xff08;1&#xff09;第一步&#xff1a;检查系统中是否有正在运行的MySQL服务&#xff1a; &#xff08;2&#xff09; 检查当…...