在开始这篇博客之前,我希望您对什么是 RabbitMQ、它的用途、交换、队列、绑定和路由键有一个很好的了解。这篇文章只关注交换类型。
RabbitMQ 有四种不同的交换机类型;Exchanges; Direct, Topic, Fanout。每种交换机类型使用不同的参数和绑定设置以不同的方式路由消息。客户可以创建自己的交换机或使用预定义的默认交换机。交换机可以有绑定队列或其他的交换机。
交换- 交换绑定允许消息从一个交换机发送/路由到另一个交换机。Exchange-exchange 绑定的工作方式或多或少与exchange-to-queue 绑定相同。从表面上看,唯一值得注意的区别是两者的交换;必须指定源和目标。本博客中的示例将使用交换队列绑定。
RabbitMQ消息的简单循环如下:
现在,让我们看看几种不同的 RabbitMQ 交换机类型。
直接交换中的路由很简单——消息进入绑定键与消息的路由键完全匹配的队列。
直接交换类型对于使用简单的字符串标识符区分发布到同一交换的消息很有用。
假设我们有一个直接交换 OrderCreatedEvents_Direct 和两个绑定到它的队列。
order_create_queue与绑定键order-create绑定,order_create_log_queue与order-create-log路由键绑定。
当带有路由键order-create的新消息到达直接交换器时,交换器将其路由到具有适当路由键的队列,在本例中是队列 order_create_queue。
如果消息路由键与任何绑定键都不匹配,则丢弃该消息。如果多个队列绑定了相同的绑定键进行交换,则直接交换将消息广播到所有匹配的队列。
主题交换类似于直接交换,但路由是根据路由模式完成的。它不使用固定路由键,而是使用通配符。基于消息路由键和模式之间的匹配,消息被路由到一个或多个队列。路由键必须由以句点“.”分隔的单词列表组成。
例如,假设我们有以下路由模式。
路由模式还可以包含星号(“*”)以匹配路由键特定位置的单词。例如,“order.*.*.electronics”的路由模式只匹配第一个单词是“order”,第四个单词是“electronics”的路由键。
路由模式还可能包含一个井号(“#”),表示匹配零个或多个单词。例如,“order.logs.customer.#”的路由模式匹配任何以“order.logs.customer”开头的路由键。
消费者指定他们感兴趣并希望从中接收消息的主题。消费者创建一个队列并使用给定的路由模式设置到交换的绑定。具有匹配路由模式的路由键的所有消息都被路由到队列并留在那里直到消费者处理消息。
让我们看一个例子。
假设我们有一个绑定了三个队列的主题交换。
customer_orders_queue:想要接收所有客户订单日志。它使用路由模式order.logs.customer 绑定到主题交换。#
all_order_logs_queue:想要接收所有订单日志。它使用路由模式order.logs 绑定到主题交换。#
electronics_order_logs_queue:想要接收所有电子订单日志。它使用路由模式order.logs.*.electronics绑定到主题交换
当我们使用路由模式order.logs.customer.electronics发布消息时,所有绑定队列都会收到它。
扇出交换器将接收到的消息复制并路由到绑定到它的所有队列,而不管路由键或模式如何。提供的键将被忽略。
当需要将相同的消息发送到一个或多个队列,而消费者可能以不同的方式处理相同的消息时,扇出交换会很有用。
例如,当创建订单时,需要通知仓库以便准备订单,还需要通知货运公司,还需要通知希望保留订单日志的消费者。
假设我们有一个扇出交换器,它具有三个使用路由键绑定到它的队列。
发送消息以交换 OrderCreatedEvents_Fanout 。消息被路由到所有队列warehouse_queue、cargo_queue、logs_queue因为所有队列都绑定到交换器。路由键(如果有)将被忽略。
标头根据包含标头和可选值的参数交换路由消息。它使用消息头属性进行路由。
在交换机和队列之间的绑定中添加了一个名为“x-match”的特殊参数,指定是所有头都必须匹配还是只有一个。“x-match”属性可以有两个不同的值:“any”或“all”,其中“all”是默认值。“all”值表示所有头对(键、值)必须匹配,而“any”值表示至少有一个头对必须匹配。
让我们创建一个标头交换 OrderCreatedEvents_Header 并将三个队列绑定到它。
带参数的 Q1(键 = 值):格式 = pdf,类型 = 报告,x-match = 全部
带参数的 Q2(键 = 值):格式 = pdf,类型 = log,x-match = any
带参数的 Q3(键 = 值):格式 = zip,类型 = 报告,x-match = 全部
当消息通过标头参数(key = value)发布到交易所时:“format = pdf”,“type = report”,并带有绑定参数“x-match = all”,它将被传递到 Q1。
当消息以 (key = value): “format = pdf” 的标头参数和绑定参数 “x-match = any” 发布到交易所时,它将被传递到 Q2,因为它满足一个条件并且没有满足所有条件。
还有两种交换类型。
默认交换
默认交换是没有名称的预先声明的直接交换。它通常由一个空字符串引用。如果您使用默认交换,您的消息将被传递到名称与消息的路由键相同的队列。每个队列都使用与队列名称相同的路由键自动绑定到默认交换器。
死信交换
如果该消息没有匹配的队列,则丢弃该消息。RabbitMQ 提供了一个称为“死信交换”的 AMQP 扩展。此交换提供了捕获无法交付的消息的功能。
感谢您的阅读!
留言与评论(共有 0 条评论) “” |