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

RabbitMQ中的交换机

文章目录

  • 使用交换机的好处


在这里插入图片描述

在这里插入图片描述

RabbitMQ 是一个消息中间件,它支持多种交换机类型,每种类型都有不同的用途。以下是常见的几种交换机类型及其用途:

  • Direct Exchange定向交换机):把消息交给符合指定routing key 的队列

    用途:直接交换机是最简单的交换机类型之一,它将消息通过路由键(Routing Key)发送到与其完全匹配的队列中。通常用于点对点的消息传递。

  • Fanout Exchange广播交换机):将消息交给所有绑定到交换机的队列

    用途:扇形交换机会将接收到的消息广播到所有与其绑定的队列中。不考虑消息的路由键,适用于广播消息给多个消费者的情况,比如发布/订阅模式。

  • Topic Exchange主题交换机):把消息交给符合routing pattern(路由模式) 的队列

    用途:主题交换机根据消息的路由键和交换机与队列的绑定规则,将消息发送到一个或多个与之匹配的队列中。可以根据通配符匹配路由键,灵活地进行消息路由。


要详细的探讨交换机, 先回顾下 RabbitMQ 中的其他组件:

  • Publisher:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机)
  • Exchange:交换机 : 一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。Exchange有以下3种类型:
    • Fanout:广播,将消息交给所有绑定到交换机的队列
    • Direct:定向,把消息交给符合指定routing key 的队列
    • Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列
  • Consumer:消费者,与以前一样,订阅队列,没有变化
  • Queue:消息队列也与以前一样,接收消息、缓存消息。

Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!


使用交换机的好处

  • 路由控制:通过交换机,可以根据消息的路由键将消息路由到与之匹配的队列。这样,可以根据消息的属性或标签来定向分发消息,实现精确的消息路由控制。
  • 消息过滤:交换机可以根据消息的路由键、消息头部属性等信息对消息进行过滤和筛选,将符合特定条件的消息发送到相应的队列。这样可以实现消息的订阅和过滤机制,灵活地处理不同类型的消息。
  • 广播和多播:通过使用扇形交换机(Fanout Exchange),可以将消息广播到所有与之绑定的队列,实现消息的广播和多播机制,方便实现发布-订阅模式。
  • 解耦和灵活性:通过将消息发送到交换机而不是直接发送到队列,生产者和消费者之间实现了解耦。生产者只需要将消息发送到指定的交换机,而不需要知道具体的队列。这样,可以灵活地增加、删除或修改队列,而不会对生产者产生影响。
  • 可扩展性:使用交换机可以实现消息的分发和负载均衡机制。通过将消息发送到多个队列,可以实现横向扩展和并发处理,提高系统的吞吐量和性能。

有了交换机我们的消息不是直接发给队列的而是发送给交换机再通过特殊的条件找到符合条件的队列再由队列发送给消费者,但这中间还有些概念需要我们了解一下分别是路由键和绑定键

路由键(RoutingKey)
生产者将消息发送给交换机的时候会指定RoutingKey指定路由规则

绑定键(BindingKey)
通过绑定键将交换机与队列关联起来,这样RabbitMQ就知道如何正确将消息路由到队列

总结:生产者将消息发给那个Exchanges是路由键决定的,而Exchanges与那个队列绑定是通过邦定键决定的。

在这里插入图片描述



相关文章:

  • Docker版本:18.06.1安装
  • 网络:udptcp套接字
  • Linux shell编程学习笔记42:md5sum
  • 傅立叶之美:深入研究傅里叶分析背后的原理和数学
  • LeetCode 面试经典150题 290.单词规律
  • 虚拟机-从头配置Ubuntu18.04(包括anaconda,cuda,cudnn,pycharm,ros,vscode)
  • 如何调试Clang源码
  • Llama模型下载
  • 双进程交互实现App自动重启
  • 电脑突然死机怎么办?
  • axios发送get请求但参数中有数组导致请求路径多出了“[]“的处理办法
  • 纯分享万岳外卖跑腿系统客户端源码uniapp目录结构示意图
  • sql造数据
  • zedboard+AD9361 运行 open WiFi
  • 【案例·增】获取当前时间、日期(含,SQL中DATE数据类型)
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 230. Kth Smallest Element in a BST
  • 30秒的PHP代码片段(1)数组 - Array
  • Akka系列(七):Actor持久化之Akka persistence
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • bootstrap创建登录注册页面
  • Flex布局到底解决了什么问题
  • laravel 用artisan创建自己的模板
  • orm2 中文文档 3.1 模型属性
  • Python十分钟制作属于你自己的个性logo
  • quasar-framework cnodejs社区
  • react-native 安卓真机环境搭建
  • RxJS: 简单入门
  • Yeoman_Bower_Grunt
  • 阿里研究院入选中国企业智库系统影响力榜
  • 对JS继承的一点思考
  • 数据科学 第 3 章 11 字符串处理
  • 跳前端坑前,先看看这个!!
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (2015)JS ES6 必知的十个 特性
  • (4)Elastix图像配准:3D图像
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (十三)Flask之特殊装饰器详解
  • (转)【Hibernate总结系列】使用举例
  • (转)memcache、redis缓存
  • (转)Sublime Text3配置Lua运行环境
  • .net core使用ef 6
  • .Net语言中的StringBuilder:入门到精通
  • .NET中两种OCR方式对比
  • .Net组件程序设计之线程、并发管理(一)
  • @Bean注解详解
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @property括号内属性讲解
  • @selector(..)警告提示