RabbitMQ 教程 - 路由
路由
(使用 AMQP 1.0 Go 客户端)
先决条件
本教程假设 RabbitMQ 已 安装 并在 localhost 上的 标准端口 (5672) 上运行。如果您使用不同的主机、端口或凭据,则需要调整连接设置。
哪里寻求帮助
如果您在学习本教程时遇到困难,可以通过 GitHub Discussions 或 RabbitMQ 社区 Discord 联系我们。
在上一篇教程中,我们构建了一个简单的发布/订阅系统。我们能够将日志消息广播给多个接收者。
在本教程中,我们将为其添加一项功能——实现只订阅一部分消息。例如,我们可以只将严重错误消息定向到日志文件(以节省磁盘空间),同时仍然能够在控制台上打印所有日志消息。
绑定
在之前的示例中,我们已经创建了绑定。您可能还记得这样的代码
_, err = conn.Management().Bind(ctx, &rmq.ExchangeToQueueBindingSpecification{
SourceExchange: "logs",
DestinationQueue: qInfo.Name(),
BindingKey: "",
})
绑定是交换机和队列之间的关系。这可以简单地理解为:队列对来自此交换机的消息感兴趣。
绑定键(binding key)的使用方式取决于交换机类型。对于 direct(直连)交换机,消息会被路由到那些绑定键与消息路由键(routing key)完全匹配的队列中。
这种逻辑实现了有选择性的消息投递。让我们用一个例子来说明这一点。
在此设置中,我们可以看到一个 direct 交换机 X 和绑定到它的两个队列。第一个队列绑定了绑定键 orange,第二个队列有两个绑定,一个是绑定键 black,另一个是 green。
在这种设置下,发布到具有路由 key orange 的交换机的消息将被路由到队列 Q1。具有路由 key black 或 green 的消息将发送到 Q2。所有其他消息将被丢弃。
多个绑定
用相同的绑定键绑定多个队列是完全合法的。在我们的示例中,我们可以在 X 和 Q1 之间添加一个绑定键为 black 的绑定。在这种情况下,direct 交换机的行为将类似于 fanout,并将消息广播给所有匹配的队列。路由键为 black 的消息将被同时投递到 Q1 和 Q2。
发送日志
我们将为日志系统采用这种模式。我们将不再使用 fanout,而是将消息发送到 direct 交换机。我们将提供日志级别作为 routing key。这样,接收程序就能够选择它想要记录的严重性级别。让我们从发送日志开始。
go run emit_log_direct.go warn "A warning message"
go run emit_log_direct.go error "An error message"
查看教程源代码以获取完整实现。与上一篇教程的关键区别在于使用了 DirectExchangeSpecification,并在绑定和发布时提供了路由键。
订阅
接收的工作方式与上一篇教程类似,但有一个区别——我们将为每个我们感兴趣的严重性级别创建一个新的绑定。
go run receive_logs_direct.go info warn
这将仅接收严重性级别为 info 或 warn 的消息。
查看完整的 receive_logs_direct.go 以了解具体实现。消费者使用 DirectExchangeSpecification 并为每个键单独绑定,从而绑定到多个路由键。
总而言之
完整的代码示例可在以下位置获取:
核心模式是使用 DirectExchangeSpecification 代替 FanOutExchangeSpecification,并使用特定的路由键绑定队列,而不是使用空的绑定键。
现在我们可以继续学习教程 5,了解如何使用主题(topic)交换机进行基于模式的路由。