中间件系列三 RabbitMQ之交换机的四种类型和属性
概述
本文介绍RabbitMQ中交换机类型和属性,主要内容如下:
交换机的作用
交换机的类型:Direct exchange(直连交换机)、Fanout exchange(扇型交换机)、Topic exchange(主题交换机)、Headers exchange(头交换机)、默认存在的交换机、Dead Letter Exchange(死信交换机)
交换机的属性
交换机的作用
之前的例子中,我们是通过队列发送和接收消息的,但是实际上里面还有一个重要的组合交换机,完整消息流程如下:
在RabbitMQ中,生产者不是直接将消息发送给消费者,生成者根本不知道这个消息要传递给哪些队列。实际上,生产者只是将消息发送到交换机。交换机收到消息到,根据交换机的类型和配置来处理消息,有如下几种情况:
将消息传送到特定的队列
有可能发送到多个队列中
也有可能丢弃消息
RabbitMQ各个组件的功能重新归纳一下如下:
生产者:发送消息
交换机:将收到的消息根据路由规则路由到特定队列
队列:用于存储消息
消费者:收到消息并消费
交换机的类型:
交换机主要包括如下4种类型:
Direct exchange(直连交换机)
Fanout exchange(扇型交换机)
Topic exchange(主题交换机)
Headers exchange(头交换机)
另外RabbitMQ默认定义一些交换机:
默认交换机
amq.* exchanges
还有一类特殊的交换机:Dead Letter Exchange(死信交换机)
Direct exchange(直连交换机)
直连型交换机(direct exchange)是根据消息携带的路由键(routing key)将消息投递给对应队列的,步骤如下:
将一个队列绑定到某个交换机上,同时赋予该绑定一个路由键(routing key)
当一个携带着路由值为R的消息被发送给直连交换机时,交换机会把它路由给绑定值同样为R的队列。
Fanout exchange(扇型交换机)
扇型交换机(funout exchange)将消息路由给绑定到它身上的所有队列。不同于直连交换机,路由键在此类型上不启任务作用。如果N个队列绑定到某个扇型交换机上,当有消息发送给此扇型交换机时,交换机会将消息的发送给这所有的N个队列
Topic exchange(主题交换机)
主题交换机(topic exchanges)中,队列通过路由键绑定到交换机上,然后,交换机根据消息里的路由值,将消息路由给一个或多个绑定队列。
扇型交换机和主题交换机异同:
对于扇型交换机路由键是没有意义的,只要有消息,它都发送到它绑定的所有队列上
对于主题交换机,路由规则由路由键决定,只有满足路由键的规则,消息才可以路由到对应的队列上
Headers exchange(头交换机)
类似主题交换机,但是头交换机使用多个消息属性来代替路由键建立路由规则。通过判断消息头的值能否与指定的绑定相匹配来确立路由规则。
此交换机有个重要参数:”x-match”
当”x-match”为“any”时,消息头的任意一个值被匹配就可以满足条件
当”x-match”设置为“all”的时候,就需要消息头的所有值都匹配成功
RabbitMQ默认定义一些交换机
在RabbitMQ默认定义一些交换机,主要如下:
默认交换机
默认交换机(default exchange)实际上是一个由RabbitMQ预先声明好的名字为空字符串的直连交换机(direct exchange)。它有一个特殊的属性使得它对于简单应用特别有用处:那就是每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同。
如:当你声明了一个名为”hello”的队列,RabbitMQ会自动将其绑定到默认交换机上,绑定(binding)的路由键名称也是为”hello”。因此,当携带着名为”hello”的路由键的消息被发送到默认交换机的时候,此消息会被默认交换机路由至名为”hello”的队列中。即默认交换机看起来貌似能够直接将消息投递给队列,如同我们之前文章里看到一例子。
类似amq.*的名称的交换机
这些是RabbitMQ默认创建的交换机。这些队列名称被预留做RabbitMQ内部使用,不能被应用使用,否则抛出403 (ACCESS_REFUSED)错误
Dead Letter Exchange(死信交换机)
在默认情况,如果消息在投递到交换机时,交换机发现此消息没有匹配的队列,则这个消息将被悄悄丢弃。为了解决这个问题,RabbitMQ中有一种交换机叫死信交换机。当消费者不能处理接收到的消息时,将这个消息重新发布到另外一个队列中,等待重试或者人工干预。这个过程中的exchange和queue就是所谓的”Dead Letter Exchange 和 Queue”
交换机的属性
除交换机类型外,在声明交换机时还可以附带许多其他的属性,其中最重要的几个分别是:
Name:交换机名称
Durability:是否持久化。如果持久性,则RabbitMQ重启后,交换机还存在
Auto-delete:当所有与之绑定的消息队列都完成了对此交换机的使用后,删掉它
Arguments:扩展参数
---------------------
作者:hry2015
来源:CSDN
原文:https://blog.csdn.net/hry2015/article/details/79118804?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!
中间件系列三 RabbitMQ之交换机的四种类型和属性的更多相关文章
- 中间件系列一 RabbitMQ之安装和Hello World Demo
https://blog.csdn.net/hry2015/article/details/79016854 1. 概述 RabbitMQ是一个由erlang开发的AMQP(Advanced Mess ...
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
Redis总结(五)缓存雪崩和缓存穿透等问题 前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...
- {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证
Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...
- RabbitMQ学习系列三-C#代码接收处理消息
RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理 http://www.80iter.com/blog/1438251320680361 http://www. ...
- RabbitMQ的交换机类型(三)
RabbitMQ的交换机类型共有四种,是根据其路由过程的不同而划分成的 分别是Direct Exchange(直连交换机), Fanout Exchange(扇型交换机), Topic Excha ...
- ASP.NET Core3.1使用IdentityServer4中间件系列随笔(三):创建使用[ClientCredentials客户端凭证]授权模式的客户端
配套源码:https://gitee.com/jardeng/IdentitySolution 上一篇<ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建 ...
- 【SpringBoot MQ 系列】RabbitMq 核心知识点小结
[MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...
- SpringBoot系列之RabbitMQ使用实用教程
SpringBoot系列之RabbitMQ使用实用教程 @ 目录 1. 消息队列概述 1.1 MQ的概述 1.2 MQ目的地形式 2. 消息队列实现方式 2.1 常见MQ框架 2.2 MQ实现方式 3 ...
- python浅学【网络服务中间件】之RabbitMQ
一.关于AMQP: AMQP,即Advanced Message Queuing Protocol,高级消息队列协议. AMQP使符合要求的客户端应用程序能够与符合要求的消息传递中间件代理进行通信. ...
随机推荐
- struts+ajax+jquery:实现异步新增数据
很久未有更新,最近因为团队其它事耽误没有继续学习,但心中十分忐忑不安,抽空把自己薄弱的点拿来再巩固一下! 本身异步刷新用处非常多,SSH框架对我来讲,已无难度,但结合ajax处理一些增删查改分页等,就 ...
- 原创:《Excel在零售及电商行业数据化管理中的应用》之“什么是数据化管理?
<Excel在零售及电商行业数据化管理中的应用>之“什么是数据化管理?” 各位: “随着全零售时代的到来,传统商业的每一个供应链细节都离不开数据的支 ...
- matlab中的常用的函数——在稀疏表示中学习到的
1, 矩阵的逆: inv()函数: 2. 矩阵的伪逆: pinv()函数: 3. 矩阵的克罗内克尔积: kron()函数: 4. 得到一个dct变换的字典: dctmtx()函数, 它可以得到一个 n ...
- Solr系列一:Solr(Solr介绍、Solr应用架构、Solr安装使用)
一.前言 前面已经学习了Lucene的分词.索引详解.搜索详解的知识,已经知道开发一个搜索引擎的流程了.现在就会有这样的一个问题:如果其他的系统也需要使用开发的搜索引擎怎么办呢?这个时候就需要把开发的 ...
- 发现eclipse红叉,查看markers发现Target runtime Apache Tomcat 6.0 is not defined
1.导入以前的项目(Markers中注意查看,就在console选项卡旁边),报以下错误,但不影响操作: Description Resource Path Location TypeTarget r ...
- Erlang HTTP client:ibrowse
ibrowse: https://github.com/cmullaparthi/ibrowse
- 共享锁(S锁)和排它锁(X锁)
释义 共享锁:(读取)操作创建的锁.其他用户可以并发读取数据,但任何事物都不能获取数据上的排它锁,直到已释放所有共享锁. 共享锁(S锁)又称为读锁,若事务T对数据对象A加上S锁,则事务T只能读A:其他 ...
- middle
/** * Created by lkl on 2017/7/31. *//** * Created by lkl on 2017/6/26. *///spark-shell --driver-cla ...
- 腾讯大湘网某处csrf(city.hn.qq.com)可投诉刷留言
触发点: http://city.hn.qq.com http://city.hn.qq.com/auto/c=shop&m=bbs&id=668 POST /msgboard/mes ...
- 给zTree添加onSelect callback
由于jquery ui没有集成tree控件,所以在网上找到了zTree v3.zTree无疑是功能非常强大的一款jquery的插件,而且是国人作品,zTree的文档写得也非常好,效果很炫.但是我在使用 ...