【问题标题】:what does the Mandatory argument in rabbitpy mean and how does it really work?rabbitpy 中的 Mandatory 参数是什么意思,它是如何工作的?
【发布时间】:2019-08-20 18:09:22
【问题描述】:

所以我正在使用 RabbitMqPython 3.7 进行项目。我首先使用 Pika,但后来我切换到 rabbitpy,因为它是线程安全的,并且我们在项目中使用 Multithreading。我查看了 rabbitpy 的文档,我真的很喜欢这个 API,所以上次我在项目中添加了 强制发布 功能,但发生了一些有趣的事情。

当我订阅然后发布消息时,一切正常。这意味着如果在发布之前已经声明了消费者队列,那么它工作得很好但是如果我尝试在订阅 rabbitpy 之前发布这个异常:NO_ROUTE(312)

在我添加 Mandatory=True 参数之前,一切对我来说都很好。所以我不明白幕后发生了什么,老实说,rabbitpy Docs 并不是最好的,也没有多少人在他们的项目中使用它,这就是为什么互联网上没有太多示例的原因。这就是为什么我希望有人已经有了这个并以某种方式修复它。我知道我可以轻松删除 Mandatory 参数,然后一切都会很好,但我喜欢 Mandatory Publishing 的想法,因为它会指示 Rabbitmq 是否已收到已发布的 msg,因此我可以通过它监视我的消息。现在这就是我从文档中了解到的,但正如我提到的那样,rabbitpy 的文档没有得到很好的解释(至少对我而言),所以如果有人对强制发布以及即时论点有一些意见或理解,这将使我的一天变得更好听到任何解释。这是提及rabbitpy_mandatory 的文档的链接。我使用的代码示例与文档中的代码基本相同,这就是为什么我不会添加一些代码并混淆的原因。

PS:另一个可能有助于调试问题的信息是我正在使用多线程。所以我在 Main 中创建了一个 rabbitpy Connection 对象,然后我为每个线程分配了一个独立的 Channel。所以线程共享连接但不共享通道。这应该没问题,因为在使用强制发布之前它已经对我有用,但我只是将它作为信息添加,也许它会在最后有所帮助

【问题讨论】:

    标签: python multithreading rabbitmq publish-subscribe rabbitpy


    【解决方案1】:

    基本上在这种护理中,Rabbitpy 隐藏在 basic.nack 的底层,这是来自 Broker 的否定确认,它没有有效的路由来进一步路由消息,因此它不再对消息负责。因此,发布者有责任进行适当的调用以重新发布消息或根据需要采取任何其他行动。

    当 Mandatory 标志设置为 False 时,如果消息被进一步路由到交换器,代理不会回复发布者。

    您应该阅读 RabbitMQ 的 Publisher Confirms 文档以获得更好的理解。 Publisher Confirms

    【讨论】:

    • 我已经阅读了该文档,但我没有弄清楚发生了什么。好的,所以 Rabbitmq 收到了消息,但不知道如何处理它,因为 Exchange 尚未声明,这就是为什么会有异常?还是因为味精已经在 Exchange 但尚未声明消费者队列,所以 Exchange 不知道在哪里发布味精,这就是为什么它把它发回给发布者?如果是这两种情况中的一种情况,那是哪一种?以及如何防止这种情况发生?
    • 在我使用它的时候,我虽然实际上这个功能会表明 Rabbitmq 本身是否存在问题,并且 Rabbitmq 不能接受来自发布者的消息,因为 rabbitmq 或服务器或那个rabbitmq在那一刻已经失败了。但我认为不是这样的
    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 2022-11-27
    • 2022-12-10
    • 2011-06-07
    • 2012-08-21
    • 2021-09-16
    • 2013-05-10
    • 2018-04-24
    相关资源
    最近更新 更多