我如何修复rabbitmq / celery错误?

时间:2013-03-21 00:05:15

标签: rabbitmq celery

所以我在带有集群rabbitmq后端的多台服务器上运行芹菜。最近,我用芹菜做的任何东西都开始无限期挂起,检查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或芹菜。如果这不起作用,我的芹菜任务都不起作用。

3 个答案:

答案 0 :(得分:3)

感谢您的提问。我最终都在同一个地方。

我能够通过删除vhost并重新创建

来解决此问题
rabbitmqctl delete_vhost celery
rabbitmqctl add_vhost celery
rabbitmqctl set_permissions -p celery <user> ".*" ".*" ".*"

答案 1 :(得分:3)

我遇到了同样的问题,并且能够在不必关闭群集或重置虚拟主机的情况下修复它。

我有一个队列,其中3个路由键绑定在一个集群中。当1个节点关闭时我不得不删除队列,之后我总是得到&#34;在vhost和队列中的交换之间没有绑定&#39;尝试在新创建的具有相同名称的队列中再次注册路由密钥时出错。

原始队列创建为“耐用”和“#39;解决方案是:

  • 删除队列
  • 创建一个名称相同的新队列,但是&#39; Transient&#39; (非持久)
  • 在队列中注册原始的3个路由密钥。它停止了提高错误。

由于我想拥有一个持久的队列,然后我再次删除了队列,创建了一个新的“Durable”#39;队列具有相同的名称,然后绑定路由键完美地工作。

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

答案 2 :(得分:2)

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

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

逐个停止和启动不起作用。错误仍然存​​在,我假设集群的某个节点确实缓存了错误的ip / config。

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

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