如何修复这个rabbitmq/celery 错误?

Kev*_*yer 3 rabbitmq celery

所以我在具有集群rabbitmq后端的多台服务器上运行celery。最近,我对 celery 所做的任何事情都开始无限期地挂起,检查rabbitmq 的日志为我提供了这个模糊的错误消息:

=ERROR REPORT==== 20-Mar-2013::23:52:25 ===
connection <0.15823.3>, channel 1 - soft error:
{amqp_error,not_found,
        "no binding i-69995906 between exchange 'i-69995906' in vhost 'celery' and queue 'i-69995906' in vhost 'celery'",
        'queue.bind'}
Run Code Online (Sandbox Code Playgroud)

运行 rabbitmqctl list_bindings 给了我这个:

# rabbitmqctl list_bindings -p celery
Listing bindings ...
        exchange    celery  queue   celery  []
celery  exchange    celery  queue   celery  []
...done.
Run Code Online (Sandbox Code Playgroud)

我需要做什么才能摆脱错误?我已经重新启动了Rabbitmq,重新安装了Rabbitmq,并删除并恢复了集群。我猜我需要恢复先前存在的绑定,但我不知道如何从 rabbitmqctl 或 celery 恢复。如果这不起作用,我的芹菜任务根本不起作用。

gre*_*con 5

谢谢你的提问。我最终到达了完全相同的地方。

我可以通过删除虚拟主机并重新创建它来纠正此问题

rabbitmqctl delete_vhost celery
rabbitmqctl add_vhost celery
rabbitmqctl set_permissions -p celery <user> ".*" ".*" ".*"
Run Code Online (Sandbox Code Playgroud)


小智 5

我遇到了同样的问题,无需关闭集群或重置虚拟主机就可以修复它。

我有一个队列,其中绑定了 3 个路由键。我不得不在 1 个节点关闭时删除队列,此后,当我尝试在新创建的同名队列中再次注册路由密钥时,总是出现“vhost 中的交换与队列之间没有绑定”错误。

原始队列被创建为“持久”,解决方案是:

  • 删除队列
  • 创建一个具有相同名称但“瞬态”(非持久)的新队列
  • 在队列中注册原始的 3 个路由键。它停止引发错误。

由于我想要一个持久的队列,然后我再次删除了该队列,创建了一个具有相同名称的新“持久”队列,然后绑定路由键工作正常。

也许通过创建一个具有不同“持久性”类型的新队列,确实重置了仍然保留在某处的旧绑定。