【问题标题】:AMQP connection reset by peer, but celery connected对等方重置 AMQP 连接,但 celery 已连接
【发布时间】:2017-03-20 02:13:18
【问题描述】:

我有一个使用 Celery 和 RabbitMQ 作为代理的烧瓶应用程序。

我已按照answer 中的说明开始操作。

我有两台机器。

运行 RabbitMQ 的机器 A 发送任务以供机器 B 上的 celery 使用。

My Broker Url 和 Backend Result Url 相同:amqp://remote:***@12.345.678.999:5672/remote_host

两台机器上都有烧瓶应用程序的副本。 RabbitMQ 已配置为使用户远程具有授予“.* .* .*”的所有权限。当 RabbitMQ 和 Celery 都在机器 A 的 localhost 上运行时,它们之间的所有通信都可以正常工作。

我在机器 B 上使用 celery worker -l info -A app.celery 启动 celery,一切看起来都很好:

 -------------- celery@ip-XXX-XX-XX-XXX v4.0.0 (latentcall)
---- **** ----- 
--- * ***  * -- Linux-4.4.0-45-generic-x86_64-with-Ubuntu-16.04-    xenial 2016-11-06 18:18:01
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         app:0x7f5b9dd73d90
- ** ---------- .> transport:   amqp://remote:**@12.345.578.999:5672/remote_host
- ** ---------- .> results:     amqp://
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
            .> celery           exchange=celery(direct) key=celery


[tasks]
  . app.views.task1
  . app.views.task2
  . app.views.task3


[2016-11-06 18:18:01,614: INFO/MainProcess] Connected to amqp://remote:**@12.345.678.999:5672/remote_host
[2016-11-06 18:18:01,627: INFO/MainProcess] mingle: searching for neighbors
[2016-11-06 18:18:02,658: INFO/MainProcess] mingle: all alone
[2016-11-06 18:18:02,672: INFO/MainProcess] celery@ip-XXX-XX-XX-XXX ready.

当我在机器 A 上运行应用程序并尝试通过 RabbitMQ 向 Celery 发送任务时,我得到 [Errno 104] Connection reset by peer 并带有以下(部分)堆栈跟踪:

  File "/home/ubuntu/app/env/local/lib/python2.7/site-packages/amqp/abstract_channel.py", line 67, in wait
self.channel_id, allowed_methods, timeout)
  File "/home/ubuntu/app/env/local/lib/python2.7/site-packages/amqp/connection.py", line 241, in _wait_method
channel, method_sig, args, content = read_timeout(timeout)
  File "/home/ubuntu/app/env/local/lib/python2.7/site-packages/amqp/connection.py", line 330, in read_timeout
return self.method_reader.read_method()
  File "/home/ubuntu/app/env/local/lib/python2.7/site-packages/amqp/method_framing.py", line 189, in read_method
raise m
error: [Errno 104] Connection reset by peer

我还得到了一个 AMQP 调试状态,如下所示:

amqp: DEBUG: Start from server, version: 0.9, properties:    {u'information': u'Licensed under the MPL.  See   http://www.rabbitmq.com/', u'product': u'RabbitMQ', u'copyright':    u'Copyright (C) 2007-2015 Pivotal Software, Inc.', u'capabilities':   

{u'exchange_exchange_bindings': True, u'connection.blocked': True,   u'authentication_failure_close': True, u'basic.nack': True, u'per_consumer_qos': True, u'consumer_priorities': True, u'consumer_cancel_notify': True, u'publisher_confirms': True},

 u'cluster_name': u'rabbit@ip-XXX-XX-XX-XXX.ec2.internal', u'platform': u'Erlang/OTP', u'version': u'3.5.7'}, mechanisms: [u'PLAIN', u'AMQPLAIN'], locales: [u'en_US']

我尝试查看 rabbitmqctl list_exchanges、list_consumers、list_bindings,但我无法从它们中获得太多意义。

我如何调试它以找出为什么 RabbitMQ 不能向 Celery 发送任务?

【问题讨论】:

  • 我认为 rabbitmq 没有收到来自远程的消息。可以尝试远程手动向rabbitmq发送消息github.com/ChillarAnand/01/blob/master/python/exercise/…吗?
  • 谢谢@ChillarAnand,明天会尝试更新您。
  • @ABM,看看我的回答。我试图帮助你。我不知道我的解决方案是否适合你,但我遵循了这些步骤并且它工作正常。

标签: python flask rabbitmq celery amqp


【解决方案1】:

我也有同样的要求,我也跟着这个tutorial 工作正常。

您的代理 url 中似乎有问题,请尝试按以下方式进行配置:

from celery import Celery

app = Celery('tasks', backend='amqp',
broker='amqp://username:password@yourIp:5672//')

#Test Celery configuration
@app.task
def test(x, y):
    return x + y

然后启动工人:

celery worker -l info -A app.celery

测试一下:

Python
>>> from app.celery import test
>>> test.delay(3,4)
<AsyncResult: 68480bd4-ebda-4238-87b1-ad896a75a12c>

并检查您的终端,您将获得预期的输出。

注意:我不知道它是否适合您。 我这样做了,对我来说效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多