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

embedded/2024/9/25 2:33:19/

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.ppmy.cn/embedded/35893.html

相关文章

三维dp,LeetCode 1463. 摘樱桃 II

目录 一、题目 1、题目描述 2、接口描述 python3 cpp 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 python3 cpp 一、题目 1、题目描述 给你一个 rows x cols 的矩阵 grid 来表示一块樱桃地。 grid 中每个格子的数字表示你能获得的樱桃数目。 你有…

今日分享【微信小程序中一个左右摇摆的小灯泡】

1、废话少说&#xff0c;先上效果&#xff1a; 2、具体实现代码如下&#xff1a; wxml <view class"con {{off?off:}}" catchtap"close"><view class"box {{off?off:}}"><view class"box_view {{off?off:}}">…

数字电路-5路呼叫显示电路和8路抢答器电路

本内容涉及两个电路&#xff0c;分别为5路呼叫显示电路和8路抢答器电路&#xff0c;包含Multisim仿真原文件&#xff0c;为掌握FPGA做个铺垫。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、5路呼叫显…

R语言数据探索与分析-运用时间序列预测模型对成都市API进行预测分析

一、研究背景 “绿水青山就是金山银山&#xff0c;要让绿水青山变成金山银山”让人们深刻的意识到环境的重要性。与此同时&#xff0c;由于现代生活水平的不断提高&#xff0c;所带来的环境污染也不断增多&#xff0c;空气以及环境的污染带来了越来越多的疾病&#xff0c;深刻…

Faiss:高效相似度搜索与索引技术深度解析

Faiss&#xff1a;高效相似度搜索与索引技术深度解析 一、引言 在大数据时代&#xff0c;信息的海量化使得快速、准确地从海量数据中检索出相似信息变得至关重要。Faiss&#xff08;Facebook AI Similarity Search&#xff09;是一个由Facebook AI团队开发的开源库&#xff0…

【前沿模型解析】一致性模型CM(一)| 离散时间模型到连续时间模型数学推导

文章目录 1 离散时间模型2 连续时间模型 得到 SDE 随机微分方程2.1 从离散模型到SDE的推理步骤 3 补充&#xff1a;泰勒展开近似 1 − β i \sqrt{1-\beta_i} 1−βi​ ​ CM模型非常重要 引出了LCM等一系列重要工作 CM潜在性模型的数学公式推导并不好理解 一步一步&#xf…

Spring管理第三方依赖

在开发中&#xff0c;我们常需要根据业务需求导入我们需要的第三方依赖包&#xff0c;本文主要以导入druid数据库来连接池为案例讲解有关spring管理第三方依赖 目录 纯注解文件注入 1.在pom.xml中导入依赖 2.在com.lcyy包下建立一个config包用于配置类的实现 3.在config包下…

【栈】Leetcode 1047. 删除字符串中的所有相邻重复项

题目讲解 1047. 删除字符串中的所有相邻重复项 算法讲解 使用栈这个数据结构&#xff0c;每一次入栈的时候观察此时的字符和当前栈顶字符是否相等&#xff0c;如相等&#xff1a;栈顶出栈&#xff1b;不相等&#xff1a;入栈 class Solution { public:string removeDuplica…