跳至主内容

RabbitMQ 教程 - Topic

Topic

(使用 AMQP 1.0 Go 客户端)

信息

先决条件

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

哪里寻求帮助

如果您在学习本教程时遇到困难,可以通过 GitHub DiscussionsRabbitMQ 社区 Discord 联系我们。

上一篇教程中,我们改进了日志系统。我们没有使用只能进行盲目广播的 fanout 交换机,而是使用了 direct 交换机,从而获得了选择性接收日志的能力。

虽然使用 direct 交换机改进了我们的系统,但它仍然存在局限性——它无法基于多个标准进行路由。

在我们的日志系统中,我们不仅可能需要根据严重级别订阅日志,还可能需要根据发出日志的来源进行订阅。你可能从 Unix 的 syslog 工具中了解过这个概念,它会根据严重级别(info/warn/crit...)和工具设施(auth/cron/kern...)来路由日志。

这将为我们提供极大的灵活性——我们可能只想收听来自“cron”的关键错误,但也想收听来自“kern”的所有日志。

为了实现我们的日志系统,我们将使用 topic(主题)交换机。主题交换机实现了基于模式的消息路由。

topic 交换机功能强大,其行为可以类似于其他类型的交换机。

  • 当队列绑定键为 "*"(星号)时,它将匹配任何路由键。
  • 当绑定中不使用特殊字符 "*"(星号)和 "#"(井号)时,主题交换机的行为将与 direct 交换机完全相同。

发布

我们将使用名为 logs 的主题交换机,路由键的形式为 "<facility>.<severity>"

go run emit_log_topic.go kern.critical "A critical kernel error"
go run emit_log_topic.go auth.info "Auth info message"

查看完整的 emit_log_topic.go 以了解使用 TopicExchangeSpecification 的实现。

订阅

接收部分将展示主题交换机的强大之处。我们将创建带有基于模式路由键的绑定。

go run receive_logs_topic.go "kern.*"
go run receive_logs_topic.go "*.critical"
go run receive_logs_topic.go "kern.critical" "auth.warn"
  • 第一个消费者将接收来自 kern 设施的所有消息。
  • 第二个消费者将接收所有严重级别为 critical 的消息。
  • 第三个消费者将只接收来自 kern 的严重错误消息,以及来自 auth 的警告消息。

查看完整的 receive_logs_topic.go 以了解实现。

主题交换机绑定规则

主题交换机的绑定规则如下:

  • "#" 可以代替零个或多个单词。
  • "*" 可以精确代替一个单词。
  • 路由键由点分隔(例如:"kern.critical")。

总而言之

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

主要的模式是使用 TopicExchangeSpecification 代替 DirectExchangeSpecification,并使用 "*""#" 通配符来绑定带有基于模式路由键的队列。

现在我们可以继续学习教程 6,了解 RabbitMQ 中的 RPC(请求/回复)模式。

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