当前位置: 首页 > 知识库问答 >
问题:

rabbitmq - RabbitMq中没有路由键的消息会被路由到哪些队列?

颜功
2024-04-24

在学习RabbitMq中,有几种情况我不太知道怎么回事:

情况一

假如我定义了一个队列test,他没有显示绑定交换机,那么会自动绑定到默认交换机,那么这个时候绑定键bindkey是不是队列名字test??现在生产者发了一个消息,假如这个消息没有定义路由键routingKey,那么这个时候消息会被路由到队列test吗?

情况二

假如我定义了一个队列test1和test2,他们也是没有显示绑定交换机,那么会自动绑定到默认交换机,现在生产者发了一个消息,假如这个消息没有定义路由键routingKey,那么这个时候消息会被路由到队列test1还是test2呢还是两个队列都会拿到这个消息呢?

共有1个答案

谷梁宝
2024-04-24

情况一

如果队列 test 没有显式绑定到交换机,那么它会自动绑定到默认交换机(通常命名为 amq.direct)。在这种情况下,绑定键(binding key)确实是队列的名字,即 test

当生产者发送一个没有定义路由键(routing key)的消息时,这个消息会被路由到默认交换机。由于队列 test 已经自动绑定到默认交换机,并且绑定键是 test,那么这个消息将会被路由到队列 test

情况二

对于队列 test1test2,同样地,如果没有显式绑定交换机,它们也会自动绑定到默认交换机。每个队列的绑定键分别是它们自己的名字,即 test1test2

当生产者发送一个没有定义路由键的消息时,这个消息也会被路由到默认交换机。然而,在这种情况下,因为没有指定具体的路由键,消息不会同时被路由到 test1test2 队列。RabbitMQ 只会根据消息的属性(如消息类型、优先级等)和队列的配置来决定消息应该被路由到哪个队列。

要实现将消息同时发送到多个队列,你需要显式地定义绑定关系,并为消息指定一个与这些绑定关系相匹配的路由键。例如,你可以为 test1test2 队列定义相同的绑定键,并在发送消息时使用这个绑定键,这样消息就会被同时路由到这两个队列。

 类似资料:
  • 我已经实现了如下所示的示例Spring Dynamic Destination 在rabbitmq中,它动态地创建一个交换,但没有提供绑定或路由密钥的选项。我的要求是用路由密钥向这个动态创建的exchange发送消息。我需要如何实现这一点来设置路由密钥?

  • 很好的一天。 有没有办法通过基于浏览器的UI检索现有交换(扇出或主题)的路由密钥? 我无法访问客户端源代码(生产者)以查看正在将哪些路由密钥发送到模型。 非常感谢。 编辑:想法是尝试锁定现有的扇出交换(我无法重新配置)。我想创建一个新的exchange,将其绑定到此exchange,并只过滤掉某些消息。

  • 我一直试图使用2.12.1-snapshot中的RabbitMQComponent版本让camel进行路由。这样做,我可以很容易地消费,但在路由到另一个队列时会遇到ad问题。 在这篇文章中,我已经验证了指定的交换机是否配置了适当的路由密钥。我注意到,我能够大量消费,但不能生产到out.queue。 以下是对处理消息的RabbitMQProducer的唯一引用。 我花了很多时间研究了RabbitMQ

  • 那有什么不好?我必须生成消息ID的原因是什么?

  • 在队列选项卡的rabbitMQ web界面上,我看到了“概述”面板,我在其中找到了以下内容: 排队消息: 准备好了 未确认 总数 我猜“总数”是多少。但什么是“准备就绪”和“未确认”?“准备好了”——传递给消费者的信息?“未确认”-? 消息费率: 发表 交付 重新交付 承认 这些信息是什么?尤其是“重新交付”和“确认”?这是什么意思?

  • 我正在考虑将Socket.io集成到一个express应用程序中。 js有一个非常好的特性,可以通过socket.io消息调用快速路由。 不过,帆在其他方面比我需要的要多一点。我正在寻找一种方法,使socket.io请求转发到快速路由,而不必使用整个sails框架。我想这是一个很常见的需求,所以我很惊讶我没有找到一个npm模块来做这件事,但是找了很长时间,我什么也没有找到。Express.io会这