RabbitMQ是怎么做消息分发的?——Java全栈知识(14)

news2024/11/24 20:01:47

RabbitMQ是怎么做消息分发的?

RabbitMQ 的消息分发分为五种模式:分别是简单模式、工作队列模式、发布订阅模式、路由模式、主题模式。

1、简单模式

image.png|900

  • publisher 直接发送消息到队列
  • 消费者监听并处理队列中的消息
    简单模式是最基本的工作模式,也是最简单的消息传递模式。在简单模式中,一个生产者将消息发送到一个队列中,一个消费者从队列中获取并处理消息。这种模式适用于单个生产者和单个消费者的简单场景,消息的处理是同步的。

2、工作队列模式

image.png|900
Work queues,工作队列模式。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息。
当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。
此时就可以使用 work 模型,多个消费者共同处理消息处理,消息处理的速度就能大大提高了。

3、发布/订阅模式(Fanout 交换机)

image.png|900

  • 1)  可以有多个队列
  • 2)  每个队列都要绑定到 Exchange(交换机)
  • 3)  生产者发送的消息,只能发送到交换机
  • 4)  交换机把消息发送给绑定过的所有队列
  • 5)  订阅队列的消费者都能拿到消息
    也就相较于工作队列模式来讲,工作队列中的一条消息只有一个消费者消费,由多个消费者进行消费,不会出现重复消费。
    发布订阅模式的交换机会把一条消息分发到每个队列中,然后由队列绑定的消费者消费,也就是一条消息由所有的消费者消费

4、路由模式(Direct 交换机)

在 Fanout 模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到 Direct 类型的 Exchange。
image.png|900
在 Direct 模型下:

  • 队列与交换机的绑定,不能是任意绑定了,而是要指定一个 RoutingKey(路由 key)
  • 消息的发送方在向 Exchange 发送消息时,也必须指定消息的 RoutingKey
  • Exchange 不再把消息交给每一个绑定的队列,而是根据消息的 Routing Key 进行判断,只有队列的 Routingkey 与消息的 Routing key 完全一致,才会接收到消息

5、主题模式(Topic 交换机)

Topic 类型的 ExchangeDirect 相比,都是可以根据 RoutingKey 把消息路由到不同的队列。
只不过 Topic 类型 Exchange 可以让队列在绑定 BindingKey 的时候使用通配符!
图示:
image.png
假如此时 publisher 发送的消息使用的 RoutingKey 共有四种:

  • china.news 代表有中国的新闻消息;
  • china.weather 代表中国的天气消息;
  • japan.news 则代表日本新闻
  • japan.weather 代表日本的天气消息;
    解释:
  • topic.queue1:绑定的是 china.# ,凡是以 china. 开头的 routing key 都会被匹配到,包括:
    • china.news
    • china.weather
  • topic.queue2:绑定的是 #.news ,凡是以 .news 结尾的 routing key 都会被匹配。包括:
    • china.news
    • japan.news

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

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

相关文章

C++:哈希表和unordered系列容器的封装

一、unordered系列关联式容器的介绍 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log2N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是&…

软件测试必问的33个面试题

1.你为什么选择软件测试行业 因为之前有了解软件测试这个行业,觉得他的发展前景很好。 2.根据你以前的工作经验描述一下软件开发、测试过程,由那些角色负责,你做什么 要有架构师、开发经理、测试经理、程序员、测试员。我在里面主要是负责所…

软件公司为什么很少接二开项目?

前言 很多企业由于原有项目还在继续运营,但原有技术公司不想再合作或者不想再维持整个技术团队等原因,就需要找一个新的软件公司继续维护原有软件系统。但是一接触往往发现很多软件公司拒绝接手第三方的软件项目,这究竟是什么原因呢&#xff…

控制台调试 hover 后才出现的元素

调试 hover后才出现的元素 打开开发者工具,鼠标放在hover时才出现的元素上,然后点击右键; 不要选中任何选项,将鼠标移动到开发者工具的调试面板中; 按下N键,此时悬浮的元素不会消失,定位成功。…

Vue-组件中的data

一个组件的data选项必须是一个函数。保证每个组件实例,维护独立的一份数据对象。如下图: 组件一旦封装好了,可以使用多次,比如数字框组件使用了三次: 每次创建新的组件实例,都会重新执行一次data函数&#…

OCC笔记:图形可视化的实现方式

注:文中参看的occ的源码版本为7.4.0 1、实现思路概览 整体架构 主要有3大块:AIS(Application Interactive Services ,直译为:应用程序交互服务)、Graphics(图形)、Geometry & T…

Java面试题:多线程3

CAS Compare and Swap(比较再交换) 体现了一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性. 线程A和线程B对主内存中的变量c同时进行修改 在线程A中存在预期值a,修改后的更新值a1 在线程B中存在预期值b,修改后的更新值b1 当且仅当预期值和主内存中的变量值相等…

数据处理学习笔记9

一些其他的函数 “Resize”和“Reshape”的区别主要在于它们对数组元素数量和形状的处理方式不同,以下是详细介绍: “Resize”通常会改变数组的元素数量,在放大数组形状时会用0补全新增的元素,而在缩小数组形状时会丢弃多余的元素…

oracle 8i系统检查

oracle 8i系统检查 set echo on spool d:\bk\1.txt select sysdate from dual; --版本信息 select * from v$version; --安装的产品 col PARAMETER for a50; col value for a10; select * from v$option order by 2; --用户信息 set linesize 100 set pagesize 100 COL USE…

浅析扩散模型与图像生成【应用篇】(二十一)——DALLE·2

21. Hierarchical Text-Conditional Image Generation with CLIP Latents 该文提出一种基于层级式扩散模型的由文本生成图像的方法,也就是大名鼎鼎的DALLE2。在DALLE2之前呢,OpenAI团队已经推出了DALLE和GLIDE两个文生图模型了,其中DALLE是基…

KAN:Kolmogorov–Arnold Networks

KAN: Kolmogorov–Arnold Networks 论文链接:https://arxiv.org/abs/2404.19756 代码链接:https://github.com/KindXiaoming/pykan 项目链接:https://kindxiaoming.github.io/pykan/intro.html Abstract 受Kolmogorov-Arnold表示定理的启…

03_Redis

文章目录 Redis介绍安装及使用redis的核心配置数据结构常用命令stringlistsethashzset(sortedset) 内存淘汰策略Redis的Java客户端JedisRedisson Redis 介绍 Redis是一个NoSQL数据库。 NoSQL: not only SQL。表示非关系型数据库(不支持SQL标准语法)。 …

大模型_DISC-MedLLM基于Baichuan-13B-Base医疗健康对话

文章目录 DISC-MedLLM介绍概述数据集部署推理流程 DISC-MedLLM 介绍 DISC-MedLLM 是一个专门针对医疗健康对话式场景而设计的医疗领域大模型,由复旦大学数据智能与社会计算实验室 (Fudan-DISC) 开发并开源。 该项目包含下列开源资源: DISC-Med-SFT 数据集 (不包…

视频降噪算法 Meshflow 介绍

介绍 Meshflow 视频降噪算法来自于 2017 年电子科技大学一篇高质量论文。 该论文提出了一个新的运动模型MeshFlow,它是一个空间平滑的稀疏运动场 (spatially smooth sparse motion field),其运动矢量 (motion vectors) 仅在网格顶点 (mesh vertexes) 处…

创造未来知识管理新篇章:Ollama与AnythingLLM联手打造个人与企业的安全知识库!

一 Ollama 1.1 简介 Ollama是一个开源的大型语言模型服务工具,它帮助用户快速在本地运行大模型。通过简单的安装指令,用户可以执行一条命令就在本地运行开源大型语言模型,如Llama 2。Ollama极大地简化了在Docker容器内部署和管理LLM的过程,使得用户能够快速地在本地运行大…

(论文阅读-多目标优化器)Multi-Objective Parametric Query Optimization

目录 摘要 一、简介 1.1 State-of-the-Art 1.2 贡献和大纲 二、定义 三、相关工作 四、问题分析 4.1 分析 4.2 算法设计影响 五、通用算法 5.1 算法概述 5.2 完备性证明 六、分段线性代价函数算法 6.1 数据结构 6.2 基本运算实现 6.3 复杂度分析 七、实验评估 …

02 Activiti 7:环境

02 Activiti 7:环境 1. 开发环境2. 流程设计器2.1. 在线安装2.2. 离线安装2.3. 中文乱码 3. 数据库 1. 开发环境 这是我本地开发环境 软件版本Jdk17Mysql8.0.36tomcat10.1.23IDEA2024.1Activiti7.0 2. 流程设计器 2.1. 在线安装 在 Plugins 搜索 activiti &…

【stm32笔记】DSP库调用

参考:DSP库调用 , __CC_ARM,__TARGET_FPU_VFP, __FPU_PRESENT1U, ARM_MATH_CM4把需要的库复制出来单独用,方便移植

基于java的CRM客户关系管理系统的设计与实现(论文 + 源码 )

【免费】基于Java的CRM客户关系管理系统的设计和实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89273409 基于Java的CRM客户关系管理系统的设计与实现 摘 要 随着互联网的高速发展,市场经济的信息化,让企业之间的竞争变得&#xff0…

ssh远程免密登录

ssh远程连接分为五个阶段 版本号协商阶段密钥和算法协商阶段认证阶段会话请求阶段交互会话阶段而上图的SessionKey即是在阶段2:密钥和算法协商阶段,服务器端和客户端利用DH交换(Diffie-Hellman Exchange)算法、主机密钥对等参数,生成的会话密钥 远程免密登录需要在客户端生…