RabbitMQ——RabbitMQ的六种工作模式详解

news2024/11/26 15:34:37

RabbitMQ

是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ是使用Erlang(高并发语言)语言来编写的,并且RabbitMQ是基于AMQP协议的

AMQP协议

Advanced Message Queuing Protocol(高级消息队列协议),具有现代特征的二进制协议,是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息中间件设计

请添加图片描述

AMQP专业术语

  • Productor:消息的生产者,也是一个向交换器发布消息的客户端应用程序
  • Consumer:消息的消费者,表示一个从消息队列中取得消息的客户端应用程序
  • Queue:消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走
  • Message:消息,服务器与应用程序之间传送的数据,由Properties和Body组成.Properties可以对消息进行修饰,必须消息的优先级、延迟等高级特性;Body则是消息体内容
  • Broker:接受客户端的链接,接收和分发消息的应用
  • Connection:publisher/consumer 和 broker 之间的 TCP 连接
  • Channel:网络信道,几乎所有的操作都在channel中进行,Channel是进行消息读写的通道。客户端可以建立多个channel,每个channel代表一个会话任务
  • Virtual Host:虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个virtual host里面可以有若干个Exchange和Queue,同一个Virtual Host 里面不能有相同名称的Exchange 或 Queue
  • Exchange:交换机,接收消息,根据路由键转单消息到绑定队列
  • Binding:Exchange和Queue之间的虚拟链接,binding中可以包换routing key
  • Routing key:一个路由规则,虚拟机可用它来确定如何路由一个特定消息。(如负载均衡)

提示
Exchange和队列是多对多关系,实际操作一般为1个exchange对多个队列,为避免设计过于复杂

Channel多路复用

RabbitMQ的多路复用与IO多路复用类似,RabbitMQ是利用Channel做多路复用,来应对高并发的。
IO多路复用,详见博文:博文链接

RabbitMQ六种队列模式

简单队列模式

最简单的工作队列,其中一个消息生产者(P),一个消息消费者(C),一个队列。也称为点对点模式

在这里插入图片描述

工作队列

一个消息生产者,一个交换器,一个消息队列,多个消费者。同样也称为点对点模式

在这里插入图片描述

工作队列:用来将耗时的任务分发给多个消费者(工作者)

发布订阅

将消息发送给不同类型的消费者。做到发布一次,多个消费者来消费。

在这里插入图片描述

路由模式

在发布/订阅模式的基础上,有选择的接收消息,也就是通过 routing 路由进行匹配条件是否满足接收消息

在这里插入图片描述

上图是一个结合日志消费级别的配图,在路由模式它会把消息路由到那些 binding key 与 routing key 完全匹配的 Queue 中,此模式也就是 Exchange 模式中的direct模式。

以上图的配置为例,我们以 routingKey=“error” 发送消息到 Exchange,则消息会路由到Queue1(amqp.gen-S9b…,这是由RabbitMQ自动生成的Queue名称)和Queue2(amqp.gen-Agl…)

如果以 routingKey=“info” 或 routingKey=“warning” 来发送消息,则消息只会路由到 Queue2

如果以其他 routingKey 发送消息,则消息不会路由到这两个 Queue 中

主题模式

同样是在发布/订阅模式的基础上,根据主题匹配进行筛选是否接收消息。topics 主题模式跟 routing 路由模式类似,只不过路由模式是指定固定的路由键 routingKey,而主题模式是可以模糊匹配路由键routingKey,类似于SQL中 = 和 like 的关系。

在这里插入图片描述

topics 模式与 routing 模式比较相近,topics 模式不能具有任意的 routingKey,必须由一个英文句点号.(点)分隔的字符串(将被句点号.分隔开的每一段独立的字符串称为一个单词),比如 “lazy.orange.fox”。topics routingKey 中可以存在两种特殊字符*(星号)与#(井号),用于做模糊匹配,其中*(星号)用于匹配一个单词,#(井号)用于匹配多个单词(可以是零个)

*表示任何一个词#表示0或多个词

以上图中的配置为例:

  • 如果一个消息的 routingKey 设置为 “xxx.orange.rabbit”,那么该消息会同时路由到 Q1 与 Q2,
  • routingKey=“lazy.orange.fox” 的消息会路由到Q1与Q2
  • routingKey=“lazy.brown.fox” 的消息会路由到 Q2
  • routingKey=“lazy.pink.rabbit” 的消息会路由到 Q2(只会投递给Q2一次,虽然这个routingKey 与 Q2 的两个 bindingKey 都匹配)
  • routingKey=“quick.brown.fox”、routingKey=“orange”、routingKey=“quick.orange.male.rabbit” 的消息将会被丢弃,因为它们没有匹配任何bindingKey

RPC模式

与上面其他5种所不同之处,RPC模式是拥有请求/回复的

RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据

在这里插入图片描述

RPC的处理流程:

  1. 当客户端启动时,创建一个匿名的回调队列
  2. 客户端为RPC请求设置2个属性:replyTo,设置回调队列名字;correlationId,标记request
  3. 请求被发送到rpc_queue队列中
  4. RPC服务器端监听rpc_queue队列中的请求,当请求到来时,服务器端会处理并且把带有结果的消息发送给客户端。接收的队列就是replyTo设定的回调队列
  5. 客户端监听回调队列,当有消息时,检查correlationId属性,如果与request中匹配,那就是结果了

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

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

相关文章

JVM之垃圾回收器一

如何判断对象是否存活 引用计数器 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器都为0的对象就是不可能再被使用的。 Java语言中没有选用引用计数算法…

对比分析小游戏引擎孰优孰劣

随着微信生态中,小程序应用指数级的增长,许多休闲游戏变成为了众多游戏厂商流量变现的新手段。以近期很火的“羊了个羊”为例,它便是我们常常所说的小游戏。 游戏和小游戏的区别 要盘点小游戏开发引擎之前,我们得先来了解下游戏…

leetcode 638. 大礼包-思路整理

题目 在 LeetCode 商店中, 有n件在售的物品。每件物品都有对应的价格。然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品。 给你一个整数数组price表示物品价格,其中price[i]是第i件物品的价格。另有一个整数数组nee…

扩散模型(Diffusion)最新综述+GitHub论文汇总-A Survey On Generative Diffusion

扩散模型(Diffusion Model)最新综述GitHub论文汇总-A Survey On Generative Diffusion 本综述来自香港中文大学Pheng-Ann Heng、西湖大学李子青实验室和浙江大学陈广勇团队,对现有的扩散生成模型进行了全面的回顾。本文首先提出了diffusion model改进算法的细化分类…

Thread类及常见方法

文章目录一、Thread常见构造方法二、Thread常见属性三、Thread常见方法start()获取当前线程休眠当前线程中断线程join()一、Thread常见构造方法 Thread类是JVM用来管理线程的一个类,每个线程都有唯一一个Thread对象与之对应,JVM会将这些对象组织起来&am…

世界杯征文活动 | 神奇!一段JavaScript代码生成会动的足球

世界杯征文活动 | 神奇!一段JavaScript代码生成会动的足球 文章目录前言一、效果展示二、代码解析1.把足球图片转换为base64格式2.根据base64格式的字符串,创建img标签图片对象3.创建存放图片img的div标签对象4.使div旋转起来总结前言 花有重开日&#…

python中的import详解

0. 什么是导入? 导入从本质上讲,就是载入另一个文件,并能够读取那个文件的内容 0.1 模块和属性 模块往往就是变量名的封装,被认作是命名空间属性就是绑定在特定对象上的变量名 0.2 from和import 通过import得到了具有属性的模…

697226-52-1, 细胞穿膜肽TAT-amide

TAT-amide 是一种细胞穿透肽。细胞穿透肽 (CPPs) 是能够进入不同细胞的短氨基酸序列,用于细胞的物质细胞递送。TAT-amide is a cell penetrating peptide. Cell-penetrating peptides (CPPs) are short amino acid sequences able to enter different cells[1][2]. …

软件测试工程师应该学Python还是学Java?

前言 对于一个软件测试工程师来说,选哪一门语言来入手编程一直是件非常纠结的事情,当然立志做一辈子功能测试的人除外。 当你学完软件测试基本理论,掌握业务测试流程,功能测试可以搞定,数据库和linux玩的也很溜时&am…

Day822.Happens-Before 规则 -Java 并发编程实战

Happens-Before 规则 Hi,我是阿昌,今天学习记录的是关于Happens-Before 规则的内容。 可见性、原子性、有序性这三者在编程领域属于共性问题,所有的编程语言都会遇到,Java 在诞生之初就支持多线程,自然也有针对这三者…

Blender 雕刻

文章目录简介.基本操作.进入雕刻.雕刻工作区.动态拓扑.动态拓扑属性.重构网格.物体数据属性重构网格.雕刻自带的重构网格.简介. 1 雕刻的本质是是用笔刷对顶点进行移动 2 被雕刻的物体要有足够多的顶点才行,可以使用动态拓扑解决顶点不够的问题 基本操作. 进入雕…

你猜,怎么用一句话证明你是项目经理?

早上好,我是老原。 熟悉我的老朋友都知道,我有两大爱好,一是钟情于挖招聘JD,二是喜欢逛知乎。 今天在知乎上看到一个很有趣的话题:你如何用一句话证明你是项目经理? 项目管理发展至今,有技术/…

JavaScript大作业(餐厅美食网站设计与实现)

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

【CBAM||目标识别||注意力机制||gated卷积】Convolutional Block Attention Module

这篇是2018年的paper,已经有很多中文资料可以学习,因而不做重复工作~记录一下核心要点,后续可阅。【学习资源】CBAM:卷积注意力机制模块 【学习资源】论文阅读-CBAM: Convolutional Block Attention Module CBMA:卷积注意力机制模…

10K起步的软件测试岗到底需要学什么?零基础进阶自动化测试需要哪些技术...

软件测试的正确路线 1、软件测试基础: 对软件测试整理的测试流程有清晰的概念,了解软件测试到底是做什么的,软件测试的各种专业术语是什么意思,以及多种不同的软件测试类型区分,测试用例的作用、本质以及如何撰写&…

开关电源环路稳定性分析(2)-从开环到闭环

大家好,这里是大话硬件。 在上一节中,基于欧姆定律,基尔霍夫定律,伏秒平衡这些已知的知识点,可以推导出Buck变换器的输入输出关系。 今天这一节,我们还是从全局的概念来解析开关电源。 1. 运放和开关电源…

盘点世界杯有趣小知识!带你感受体育赛事数据可视化的快乐!

2022年卡塔尔世界杯是第二十二届世界杯足球赛,是历史上首次在卡塔尔和中东国家境内举行、也是第二次在亚洲举行的世界杯足球赛。 今年卡塔尔世界杯可谓精彩纷呈,花2000个亿在沙漠里打造出的空调球场、洗脑又魔性的“母鸡生蛋”主题曲《Tukoh Taka》、世界…

角逐「视觉感知」万亿市场,这家国内领跑者如何挑战性能天花板?

随着智能汽车渗透率快速提升,车用视觉感知摄像头装配量大幅增长。以前向ADAS摄像头为例,今年1-8月中国市场(不含进出口)乘用车新车标配交付为639.10万颗,同比增长29.54%;而这个数字在2021年同期为55.67%。 …

ppt 的基本操作1

一 基本操作 1.1 隐藏和显示功能区 1.点击有上角,小箭头标志 2.显示 1.2 工作区 和编辑区的比例拖放 1.1 箭头放到红色标注的部分,当鼠标变为箭头形状,可以动态拖动 2.可以看到二者之间的比例,发生变化 1.3 编辑区设置网格线…

Minianaconda安装jupyter notebook遇到的问题及解决

文章目录前言一、如何安装jupyter notebook二、其他问题解决1、安装时报错2、安装之后不能打开3、Verifying transaction: failedRemoveError注意:使用时命令提示符窗口不可以关闭前言 提示:这里可以总结遇到的各种问题: 1、如何安装jupyte…