测试RabbitMQ交换

时间:2012-08-13 09:00:37

标签: java rabbitmq rabbitmq-exchange

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

测试都使用'主题'交换类型。我遇到的问题是,当我使用多个交换进行测试时,我没有收到我发布的所有消息。但是,当我使用1个交换时,我会收到所有消息。

为什么会出现这种情况?

感谢。

编辑:

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

  • *。SYSTEM.LOG。#
  • #。system.error

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

  1. 兑换0

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

    • [正文]消息0 [路由密钥]#.system.error
    • [正文]消息1 [路由密钥] * .system.log。#
  3. 我有一个消费者正在侦听队列,但只收到以下消息:

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

    有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

无论如何,问题似乎与您的绑定有关,我可以通过仅使用RabbitMQ的Web管理门户来重现问题,而无需编写一行代码。

请查看主题交换here部分,但重要部分是:

  

发送到主题交换的消息不能有任意的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.error system.log

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