rabbitmq exchange queue topic的关系

news/2024/11/26 7:30:45/

在RabbitMQ中,ExchangeQueueTopic 是三个核心概念,它们之间有着密切的关系。理解这些概念及其相互作用对于正确使用RabbitMQ非常重要。下面是对这三个概念的详细解释以及它们之间的关系:

1. Exchange(交换器)

  • 定义:交换器是生产者发送消息的目标。它接收生产者发送的消息,然后根据一定的规则将消息路由到一个或多个队列中,或者丢弃消息。
  • 类型
    • Direct:消息会被路由到那些绑定键与路由键完全匹配的队列。
    • Fanout:消息会被广播到所有绑定到该交换器的队列,而不考虑路由键。
    • Topic:消息会被路由到所有与路由键部分匹配的队列。支持通配符,如 *(匹配一个单词)和 #(匹配零个或多个单词)。
    • Headers:不依赖于路由键,而是依赖于消息头属性进行路由。

2. Queue(队列)

  • 定义:队列是存储消息的地方。队列是消息的缓冲区,消息从生产者到达队列后,等待消费者消费。
  • 特性
    • 持久化:队列可以设置为持久化,这样即使RabbitMQ重启,队列也不会丢失。
    • 排他性:队列可以设置为排他性,即仅限于当前连接使用,连接断开后队列自动删除。
    • 自动删除:队列可以设置为自动删除,当最后一个消费者断开连接后,队列自动删除。

3. Topic(主题)

  • 定义:主题是一种特殊的路由键,用于在Topic类型的交换器中进行消息路由。主题路由键可以包含多个单词,单词之间用点号.分隔。
  • 通配符
    • *:匹配一个单词。
    • #:匹配零个或多个单词。

关系

  • 生产者:生产者将消息发送到特定的交换器,并指定一个路由键。
  • 交换器:交换器根据路由键和绑定规则将消息路由到一个或多个队列。
  • 队列:队列接收并存储消息,等待消费者消费。
  • 消费者:消费者从队列中获取并处理消息。

示例

假设我们有一个Topic类型的交换器myTopicExchange,两个队列queue1queue2,以及以下绑定关系:

  • queue1 绑定到 myTopicExchange,绑定键为 topic1.*
  • queue2 绑定到 myTopicExchange,绑定键为 topic2.*
生产者发送消息
rabbitTemplate.convertAndSend("myTopicExchange", "topic1.key1", "Message for topic1");
rabbitTemplate.convertAndSend("myTopicExchange", "topic2.key2", "Message for topic2");
rabbitTemplate.convertAndSend("myTopicExchange", "topic1.key2", "Another message for topic1");
消息路由
  • 消息 "Message for topic1" 路由键为 topic1.key1,匹配 topic1.*,因此会被路由到 queue1
  • 消息 "Message for topic2" 路由键为 topic2.key2,匹配 topic2.*,因此会被路由到 queue2
  • 消息 "Another message for topic1" 路由键为 topic1.key2,匹配 topic1.*,因此也会被路由到 queue1
消费者接收消息
@RabbitListener(queues = "queue1")
public void receiveMessageFromQueue1(String message) {System.out.println("Received from queue1: " + message);
}@RabbitListener(queues = "queue2")
public void receiveMessageFromQueue2(String message) {System.out.println("Received from queue2: " + message);
}

总结

  • Exchange 负责接收消息并根据路由键和绑定规则将消息路由到一个或多个队列。
  • Queue 存储消息,等待消费者消费。
  • Topic 是一种特殊的路由键,用于在Topic类型的交换器中进行灵活的消息路由。

http://www.ppmy.cn/news/1550009.html

相关文章

Sortable插件实现最简单的拖拽效果

1.安装并引入Sortable插件 2.直接获取需要拖动的dom节点 <template><div><ul id"list"><li v-for"item in list1" :key"item.id" :data-id"item.id" v-on:drag"saveDragItem">{{ item.name }}<…

【Rust练习】23.生命周期

练习题来自https://practice-zh.course.rs/lifetime/basic.html 1 /* 为 i 和 borrow2 标注合适的生命周期范围 */// i 拥有最长的生命周期&#xff0c;因为它的作用域完整的包含了 borrow1 和 borrow2 。 // 而 borrow1 和 borrow2 的生命周期并无关联&#xff0c;因为它们的…

选择使用whisper.cpp进行语音转文字

需要将一些wav格式的语音文件转成文字&#xff08;ASR&#xff0c;STT&#xff09;&#xff0c;接到这个任务后&#xff0c;首先上网搜索有没有现成免费的工具或服务可以使用。常用的关键字如“语音转文字 免费 在线”。 搜到的很多野鸡网站&#xff0c;都可以免注册免费提供短…

代码随想录算法训练营第五十七天|Day57 图论

prim算法精讲 https://www.programmercarl.com/kamacoder/0053.%E5%AF%BB%E5%AE%9D-prim.html prim算法核心就是三步&#xff0c;熟悉这三步&#xff0c;代码相对会好些很多&#xff1a; 第一步&#xff0c;选距离生成树最近节点第二步&#xff0c;最近节点加入生成树第三步&a…

【AI技术赋能有限元分析应用实践】pycharm终端与界面设置导入Abaqus2024自带python开发环境

目录 一、具体说明1. **如何在 Windows 环境中执行 Abaqus Python 脚本**2. **如何在 PyCharm 中配置并激活 Abaqus Python 环境**3. **创建 Windows 批处理脚本自动执行 Abaqus Python 脚本**总结二、方法1:通过下面输出获取安装路径导入pycharm方法2:终端脚本执行批处理脚本…

LeetCode Hot100 - 矩阵篇

前言 刷力扣hot100&#xff0c;记录一下每题的思路~ 这次是矩阵相关的题目 &#xff08;1&#xff09;73. 矩阵置零 ①两个boolean数组记录要置零的行列号&#xff0c;遍历数组置零对应的行列 class Solution {public void setZeroes(int[][] matrix) {int mmatrix.length, …

《地质学报》

《地质学报》是中国地质学会主办的地质科学学术刊物。《地质学报》反映地质科学各分支学科及边缘学科中最新、最高水平的基础理论研究和基本地质问题研究成果。《地质学报》登载论文范围主要包括&#xff1a;古生物与地层、构造地质、地球物理、矿物、岩石、地球化学、矿床、石…

文件上传代码分析

目录 不同类型的语言脚本语⾔/解释型语⾔⼀次编译到处运⾏编译型语⾔ 不同语⾔的webshell上传差异脚本语⾔/解释型语⾔⼀次编译到处运⾏编译型语⾔ ⽂件上传到webshell任意⽂件上传js检测解析规则MIME⽂件头后缀检测失效 NTFS Tricks 不同类型的语言 脚本语⾔/解释型语⾔ 代表…