【问题标题】:RabbitMQ exchange bind replicating messages published to one exchange across two other exchangesRabbitMQ 交换绑定复制消息发布到一个交换跨两个其他交换
【发布时间】:2020-11-10 19:27:20
【问题描述】:

我的 rabbitMQ 中有 3 个不同的交换,我正在尝试通过其他两个交换 dmyex 和 monex 路由发送到 ma​​inex 的所有消息> 我尝试使用 channel.exchngeBind 方法来绑定交易所。

我仍然无法看到发布到 mainex 的消息会发送到 dmyex 和 monex。

这在 RabbitMq 中可行吗?

我在这里做的有什么错误吗?

ch.exchangeDeclare("mainex", DIRECT_EXCHANGE_TYPE, true, false, null);
ch.exchangeDeclare("dmyex", CONSISTENT_HASH_EXCHANGE_TYPE, true, false, null);
ch.exchangeDeclare("monex", CONSISTENT_HASH_EXCHANGE_TYPE, true, false, null);
ch.exchangeBind("dmyex","mainex","abcd_KEY");
ch.exchangeBind("monex","mainex","abcd_KEY");

【问题讨论】:

    标签: binding rabbitmq amqp messagebroker rabbitmq-exchange


    【解决方案1】:

    刚刚发现下面的模型正在工作。

       ch.exchangeDeclare("mainex", DIRECT_EXCHANGE_TYPE, true, false, null);
       ch.exchangeDeclare("dmyex", CONSISTENT_HASH_EXCHANGE_TYPE, true, false, null);
       ch.exchangeDeclare("mongoex", CONSISTENT_HASH_EXCHANGE_TYPE, true, false, null);
       
       
       ch.exchangeBind("dmyex","mainex", "abcd_KEY");
       ch.exchangeBind("monex","mainex", "abcd_KEY");
       
       
       for (String q : Arrays.asList("sharding: dmyex - rabbit@node1 - 0", "sharding: dmyex - rabbit@node2 - 0","sharding: dmyex - rabbit@node3 - 0","sharding: dmyex - rabbit@node4 - 0","sharding: dmyex - rabbit@node5 - 0","sharding: dmyex - rabbit@node6 - 0")) {
           ch.queueBind(q, "dmyex", "1");
       }
       
       
       for (String q : Arrays.asList("sharding: mongoex - rabbit@node1 - 0", "sharding: mongoex - rabbit@node2 - 0","sharding: mongoex - rabbit@node3 - 0","sharding: mongoex - rabbit@node4- 0","sharding: mongoex - rabbit@node5 - 0","sharding: mongoex - rabbit@node6 - 0")) {
           ch.queueBind(q, "mongoex", "1");
       }
       
       
         AMQP.BasicProperties.Builder bldr = new AMQP.BasicProperties.Builder();
         for (int i = 0; i < 10; i++) {
         ch.basicPublish("mainex", "abcd_KEY", bldr.build(), "TestMessage".getBytes("UTF-8"));````
    
    

    【讨论】:

      【解决方案2】:

      我认为交换 mainex 需要成为主题交换才能使通配符路由起作用,因为直接交换根据路由密钥的精确匹配来进行路由。根据这个CloudAMQP blog post on exchange types and routing:

      直接交换根据消息路由键将消息传递到队列。路由键是生产者添加到消息头的消息属性。将路由键视为交换用来决定如何路由消息的“地址”。 消息使用与消息的路由键完全匹配的绑定键进入队列。

      (this answer to a question about wildcard routing keys on SO 也提到了这一点)

      应该足以让您的路由正常工作。也许更简单,如果您要为绑定到mainex 的所有交换匹配任何路由密钥,则可以将mainex 设为扇出交换。

      【讨论】:

      • 感谢您的回复 greg,我使用特定的路由键进行了尝试,当我使用“grid”路由键发布时,我可以在 mainex 交换中看到消息,但这些相同的消息不会发送到 dmyex和monex。
      • 你有绑定到交易所@RajeshBabu 的队列吗?
      • 是的,我对一致的哈希交换 dmyex 和 monex 有一个分片策略,并且集群上每个节点有 2 个分片。
      猜你喜欢
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 2012-06-30
      相关资源
      最近更新 更多