专栏首页Web技术研发MQ教程 | RabbitMQ 交换机类型(二)

MQ教程 | RabbitMQ 交换机类型(二)

RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储

1、性能排序:fanout > direct >> topic

2、比例大约为11:10:6

一、direct

Direct Exchange - 处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。

如果一个队列绑定到该交换机上要求路由键 “dog”,则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。

说明

  1. 一般情况可以使用rabbitMQ自带的Exchange:”"(该Exchange的名字为空字符串,下文称其为default Exchange)。
  2. 这种模式下不需要将Exchange进行任何绑定(binding)操作
  3. 消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。
  4. 如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。

二、topic

Topic Exchange – 将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。

因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到audit.irs。任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上。

说明:

  1. 这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的队列。
  2. 这种模式需要RouteKey,也许要提前绑定Exchange与Queue。
  3. 在进行绑定时,要提供一个该队列关心的主题,如“#.log.#”表示该队列关心所有涉及log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。
  4. “#”表示0个或若干个关键字,“*”表示一个关键字。如“log.*”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。
  5. 同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息。

三、headers

如果绑定的标头与消息的标头匹配,则交换标头会传递消息。

四、fanout

Fanout Exchange不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。

很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上。

说明

  1. 可以理解为路由表的模式
  2. 这种模式不需要RouteKey
  3. 这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。
  4. 如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。

本文分享自微信公众号 - Tinywan的杂货摊(TinywanIOT),作者:Tinywan

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MQ教程 | Exchange(交换机)介绍(六)

    Producer 将消息发送到 Exchange ,由 Exchange 将消息路由到一个或多个 Queue 中(或者丢弃)。Exchange 根据 Routi...

    Tinywan
  • MQ教程 | AMQP 名词解释(五)

    本文主要对消息队列 AMQP 涉及的专有名词和术语进行定义和解释,方便您更好地理解相关概念并使用。

    Tinywan
  • 如何防订单重复提交策略方法

    #### [原文链接:https://www.cnblogs.com/jett010/articles/9056567.html](https://www.cn...

    Tinywan
  • Chaos Mesh® X GitHub Actions —— 把混沌工程集成到你的 CI 中

    本文将介绍如何在 GitHub Actions 的 workflow 中使用 Chaos Mesh,从而将混沌工程集成到系统开发的 CI 中。

    PingCAP
  • SpringMVC:数据绑定入门(-)

    1.数据类型,可以绑定基本数据类型,如int age,或者包装类型如:Integer age;

    Dar_Alpha
  • MvvmCross 框架中的数据绑定语法

    数据绑定一直是 MvvmCross (Mvx) 框架的核心, 随着 Mvx 版本的版本更新, 绑定语法由 Json 变化到了 Swiss 语法, 并逐渐向 Ti...

    beginor
  • Rabbitmq基本原理

    Exchange类似于数据通信网络中的交换机,提供消息路由策略。rabbitmq中,producer不是通过信道直接将消息发送给queue,而是先发送给Exch...

    于霆霖
  • Python类的动态绑定实现原理

    使用实例引用类的属性时,会发生动态绑定。即python会在实例每次引用类属性时,将对应的类属性绑定到实例上。

    砸漏
  • jquery on绑定click事件执行多次

    用$(document).on('click','#XX',function(){...})为元素添加点击事件 结果导致事件会执行多次 。 出现这种情况是因为每...

    似水的流年
  • 织梦CMS去版权

    找到网站目录下的 \include\common.inc.php 文件,搜索 $cfg_version 可以看到以下信息,修改成你想要的就可以了。

    德顺

扫码关注云+社区

领取腾讯云代金券