0%

RabbitMQ Exchange 概念

RabbitMQ 交换机概念

Exchange 交换机

RabbitMQ 中的消息 不是直接发送到Queue中的,中间有一个Exchange 做消息分发。
producer甚至都不知道消息发送到哪个队列中去。因此,当Exchange收到message时,必须知道如何准备分发消息。
具体是append 到一定规则的queue,还是append到多个queue中,还是被丢弃?这些都是通过 exchange的类型定义的。
|type|作用|创建vhost时默认创建的exchange的名称|
|-|-|-|
|direct|路由模式|(Empty string) and amq.direct|
|fanout|发布/订阅模式|amq.fanout|
|Topic|主题模式|amq.topic|
|headers||amq.match (and amq.headers in RabbitMQ)|

一:Direct Exchange

它处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “dog”,则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。

直接交换通常用于:

  • 以循环方式在多个 workers(同一应用程序的实例)之间分配任务。当这样做时,消息在消费者之间而不是在队列之间是负载平衡的。

二、Fanout Exchange

它不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。

如果N个队列绑定到 Fanout Exchange ,则当向该交换机发布新消息时,将向所有N个队列传递消息的副本。 Fanout Exchange 是广播消息路由的理想选择。

Fanout Exchange 向每个绑定到它的队列传递消息副本,适用场景如下:

  • 大型多人在线(MMO)游戏可用于排行榜更新或其他全球性事件。
  • 体育新闻网站可以使用 Fanout Exchange 来实时更新移动客户端的评分更新。
  • 分布式系统可以广播各种状态和配置更新

三、Topic Exchange

它将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“”匹配不多不少一个词。因此“audit.#”能够匹配到 “audit.irs.corporate”,但是“audit.” 只会匹配到“audit.irs”。我在RedHat的朋友做了一张不错的图,来表明topic交换机是如何工作的:

每当问题涉及多个消费者/应用程序,它们有选择地选择它们想要接收哪种类型的消息时,应该考虑使用 Topic Exchange 。

示例用途:

  • 分配与特定地理位置相关的数据,例如销售点
  • 后台任务处理由多个工人完成,每个任务都能够处理特定的任务集。
  • 股票价格的更新(以及其他类型的金融数据的更新)
  • 涉及分类或标记的新闻更新(例如,仅针对特定的运动或团队)
  • 云中不同类型服务的编排
  • 分布式体系结构/ OS特定的软件构建或打包,其中每个构建器只能处理一个体系结构或操作系统。

四、Headers exchange

A headers exchange is designed to for routing on multiple attributes that are more easily expressed as message headers than a routing key. Headers exchanges ignore the routing key attribute. Instead, the attributes used for routing are taken from the headers attribute. A message is considered matching if the value of the header equals the value specified upon binding.

  It is possible to bind a queue to a headers exchange using more than one header for matching. In this case, the broker needs one more piece of information from the application developer, namely, should it consider messages with any of the headers matching, or all of them? This is what the “x-match” binding argument is for. When the “x-match” argument is set to “any”, just one matching header value is sufficient. Alternatively, setting “x-match” to “all” mandates that all the values must match.

  Headers exchanges can be looked upon as “direct exchanges on steroids”. Because they route based on header values, they can be used as direct exchanges where the routing key does not have to be a string; it could be an integer or a hash (dictionary) for example.

不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。

匹配规则x-match有下列两种类型:

x-match = all :表示所有的键值对都匹配才能接受到消息

x-match = any :表示只要有键值对匹配就能接受到消息

五、Default Exchange

它是一种特别的exchange,当你手动创建一个队列时,后台会自动将这个队列绑定到一个名称为空的Direct 类型交换机上,绑定路由名称与队列名称相同。有了这个默认的交换机和绑定,我们就可以像其他轻量级的队列,如Redis那样,直接操作队列来处理消息。不过只是看起来是,实际上在RabbitMQ里直接操作是不可能的。消息始终都是先发送到交换机,由交换级经过路由传送给队列,消费者再从队列中获取消息的。不过由于这个默认交换机和路由的关系,使我们只关心队列这一层即可,这个比较适合做一些简单的应用,毕竟没有发挥RabbitMQ的最大功能,如果都用这种方式去使用的话就真是杀鸡用宰牛刀了。

RabbitMQ 基础知识

欢迎关注我的其它发布渠道