Django Celery Eventlet - 出现 "No address found" 错误

Django Celery Eventlet - Getting "No address found" error

我目前正在使用 celery default prefork 进行并发,我想使用 Eventlet。

我尝试安装 Eventlet 并将其用于并发,但出现以下错误:

[2017-01-01 04:11:14,233: ERROR/MainProcess] consumer: Cannot connect to amqp://application:**@rabbit:5672//: [Errno -2] No address found.

但它与默认的 prefork 配合使用效果很好,我可以异步执行作业。

我目前使用的是 django 1.10 和 Celery 4.0.1

 -------------- celery@worker v4.0.1 (latentcall)
---- **** ----- 
--- * ***  * -- Linux-4.4.0-57-generic-x86_64-with-Ubuntu-16.04-xenial 2017-01-01 03:59:11
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         fivefrets:0x7f97ca281a58
- ** ---------- .> transport:   amqp://fivefrets:**@rabbit:5672//
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 10 (eventlet)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
            .> celery           exchange=celery(direct) key=celery

任何人都可以帮忙,我无法通过谷歌搜索得到答案。

如果有人有任何问题,请告诉我们。

不确定我错过了什么

"No address found" 看起来像是 DNS 解析错误。如果你能解析出你的rabbitmq服务器地址,那问题可能出在Eventlet上。

如果您使用的是 Eventlet 0.20.0,看起来这可能会破坏 DNS 解析。参见:https://github.com/nameko/nameko/issues/392

如果是这样,也许您可​​以使用不同版本的 eventlet,例如 pip install --upgrade eventlet==0.19.0pip install --upgrade eventlet==0.20.1

如果您使用 eventlet==0.20.0 遇到该错误,则表示您的配置格式不正确。 /etc/resolv.confsearch domain 但您发布的是相对主机名 rabbit,正确的 DNS 解析必须仅尝试 rabbit.domain 查询域名服务器。

正确的解决方案选项:

  • .local 域引入您的网络,将 resolv.conf、DNS 记录和应用程序配置更改为 rabbit.local。综合考虑,这是最好的方法。
  • /etc/resolv.conf
  • 中删除 search
  • 在应用程序配置中向单级主机名添加尾随点rabbit. - 这使得完全限定的主机名始终能够正确解析

对于不太完美的方式,升级 eventlet>=0.20.1 它包含尝试顶级查询的补丁,就好像它们是完全合格的(在这种情况下 rabbit.