繁体   English   中英

测试RabbitMQ交换

[英]Testing RabbitMQ Exchanges

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

测试都使用“主题”交换类型。 我遇到的问题是,当我使用多个交换进行测试时,我没有收到我发布的所有消息。 当我使用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”

有任何想法吗?

我不太确定你试图用你的测试来证明什么,但是记住IO和内存将是一个与队列总体大小相关的函数,而不是你绑定到单个队列的交换机数量。 您可能会发现这篇关于使用RabbitMQ进行性能和可伸缩性的路由拓扑的博客文章非常有帮助。

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

看一下Topic exchange 这里的部分,但重要的部分是:

发送到主题交换的消息不能具有任意的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管理来尝试在运行更大的测试之前尝试实现的路由行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM