3

所以我在带有集群rabbitmq后端的多台服务器上运行芹菜。最近,我对 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'}

运行 rabbitmqctl list_bindings 给了我这个:

# rabbitmqctl list_bindings -p celery
Listing bindings ...
        exchange    celery  queue   celery  []
celery  exchange    celery  queue   celery  []
...done.

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

4

3 回答 3

5

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

我有一个队列,其中有 3 个路由键绑定在一个集群中。我必须在其中 1 个节点关闭时删除队列,然后在尝试在新创建的同名队列中再次注册路由键时,总是出现“虚拟主机和队列中的交换之间没有绑定”错误。

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

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

因为我想要一个持久队列,所以我再次删除了队列,创建了一个具有相同名称的新“持久”队列,然后绑定路由键工作得很好。

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

于 2015-11-27T21:51:30.913 回答
4

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

我能够通过删除虚拟主机并重新创建它来纠正这个问题

rabbitmqctl delete_vhost celery
rabbitmqctl add_vhost celery
rabbitmqctl set_permissions -p celery <user> ".*" ".*" ".*"
于 2013-06-28T16:20:26.100 回答
2

我也有这个错误,解决它的唯一方法是立即关闭整个集群并让它关闭几秒钟。

前言:我们之前确实遇到过一些分区,无法推送到一个队列,也无法重新创建绑定并得到与您相同的错误。

一个一个地停止和启动是行不通的。错误仍然存​​在,我假设集群的某个节点确实缓存了一些错误的 ip/config。

检测:确定这是否是您的错误的好方法是rabbitmqctl list_queues在所有节点上运行。如果节点显示不同的队列,则出现问题。

解决方案:如上所述,解决方案是停止所有兔子服务器几秒钟,因此没有“缓存”。当然,这只是您不依赖于永久队列的解决方案。

于 2015-05-07T14:40:48.477 回答