跳至主内容

RabbitMQ 教程 - 路由

路由

(使用 AMQP 1.0 Go 客户端)

信息

先决条件

本教程假设 RabbitMQ 已 安装 并在 localhost 上的 标准端口 (5672) 上运行。如果您使用不同的主机、端口或凭据,则需要调整连接设置。

哪里寻求帮助

如果您在学习本教程时遇到困难,可以通过 GitHub DiscussionsRabbitMQ 社区 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 blackgreen 的消息将发送到 Q2。所有其他消息将被丢弃。

多个绑定

用相同的绑定键绑定多个队列是完全合法的。在我们的示例中,我们可以在 XQ1 之间添加一个绑定键为 black 的绑定。在这种情况下,direct 交换机的行为将类似于 fanout,并将消息广播给所有匹配的队列。路由键为 black 的消息将被同时投递到 Q1Q2

发送日志

我们将为日志系统采用这种模式。我们将不再使用 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

这将仅接收严重性级别为 infowarn 的消息。

查看完整的 receive_logs_direct.go 以了解具体实现。消费者使用 DirectExchangeSpecification 并为每个键单独绑定,从而绑定到多个路由键。

总而言之

完整的代码示例可在以下位置获取:

核心模式是使用 DirectExchangeSpecification 代替 FanOutExchangeSpecification,并使用特定的路由键绑定队列,而不是使用空的绑定键。

现在我们可以继续学习教程 5,了解如何使用主题(topic)交换机进行基于模式的路由。

© . This site is unofficial and not affiliated with VMware.