1

我正在尝试编写一个应用程序来测试将 N 个交换绑定到内存、IO 等相同队列的效果。

测试都使用“主题”交换类型。我遇到的问题是,当我使用超过 1 个交换进行测试时,我没有收到我发布回来的所有消息。但是,当我使用 1 个交换器时,我会收到所有消息。

任何想法为什么会这样?

谢谢。

编辑:

我有一个使用相同绑定键绑定到两个“主题”交换的队列:

  • *.system.log.#
  • #。系统错误

我向每个交易所发布两条消息,如下所示:

  1. 交换 0

    • [正文] 消息 0 [路由密钥] #.system.error
    • [正文] 消息 1 [路由密钥] *.system.log.#
  2. 交换 1

    • [正文] 消息 0 [路由密钥] #.system.error
    • [正文] 消息 1 [路由密钥] *.system.log.#

我有一个消费者正在收听队列,但只收到以下消息:

  • 带有路由密钥 (*.system.log.#) 的消息,来自交换 0,正文为“消息 1”
  • 带有路由密钥 (*.system.log.#) 的消息,来自交换 1,正文为“消息 1”

有任何想法吗?

4

1 回答 1

3

我不太确定您要通过测试证明什么,但请记住 IO 和内存将是与队列整体大小相关的函数,而不是与单个队列绑定的交换数。您可能会发现这篇关于Routing Topologies for Performance and Scalability with RabbitMQ 的博文非常有帮助。

无论如何,问题似乎与您的绑定有关,我只需使用 RabbitMQ 的 Web 管理门户即可重现该问题而无需编写任何代码。

看看这里的主题交换部分,但重要的部分是:

发送到主题交换的消息不能有任意的 routing_key - 它必须是单词列表,由点分隔。这些词可以是任何东西,但通常它们指定与消息相关的一些特征。一些有效的路由键示例:“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”。路由键中可以有任意多的单词,最多为 255 个字节。

绑定键也必须采用相同的格式。主题交换背后的逻辑类似于直接交换 - 使用特定路由键发送的消息将被传递到与匹配绑定键绑定的所有队列。但是,绑定键有两个重要的特殊情况:

* (star) can substitute for exactly one word.
# (hash) can substitute for zero or more words.

这意味着当您发布消息时,您应该执行system.errorsystem.log

但是,我认为您的交换绑定实际上有问题。如果您尝试使用 RabbitMQ Web 管理使用这些路由密钥进行发布,您会注意到您的消息实际上并没有被路由到队列,这可以解释为什么您的消费者会得到它们......我会玩绑定并使用 RabbitMQ Web 管理在运行更大的测试之前尝试您尝试实现的路由行为。

于 2012-08-13T21:40:59.860 回答