Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜在长时间不活动后意外关闭_Python_Django_Ubuntu_Rabbitmq_Celery - Fatal编程技术网

Python 芹菜在长时间不活动后意外关闭

Python 芹菜在长时间不活动后意外关闭,python,django,ubuntu,rabbitmq,celery,Python,Django,Ubuntu,Rabbitmq,Celery,因此,我使用RabbitMQ+芹菜来创建一个简单的RPC体系结构。我有一个RabbitMQ消息代理和一个运行芹菜deamon的远程工作者 第三个服务器公开了精简的RESTful API。当它收到HTTP请求时,它向远程工作者发送任务,等待响应并返回响应 这在大多数情况下都很有效。然而,我注意到,在长时间的不活动(比如5分钟没有收到请求)之后,芹菜工人的行为异常。长时间不活动后收到的前3个任务返回此错误: exchange.declare: connection closed unexpected

因此,我使用RabbitMQ+芹菜来创建一个简单的RPC体系结构。我有一个RabbitMQ消息代理和一个运行芹菜deamon的远程工作者

第三个服务器公开了精简的RESTful API。当它收到HTTP请求时,它向远程工作者发送任务,等待响应并返回响应

这在大多数情况下都很有效。然而,我注意到,在长时间的不活动(比如5分钟没有收到请求)之后,芹菜工人的行为异常。长时间不活动后收到的前3个任务返回此错误:

exchange.declare: connection closed unexpectedly
经过三次错误的任务后,它再次工作。如果长时间没有任务,同样的事情也会发生。有什么想法吗

芹菜工人的我的初始化脚本:

# description "Celery worker using sync broker"

console log

start on runlevel [2345]
stop on runlevel [!2345]

setuid richard
setgid richard

script
chdir /usr/local/myproject/myproject
exec /usr/local/myproject/venv/bin/celery worker -n celery_worker_deamon.%h -A proj.sync_celery -Q sync_queue -l info --autoscale=10,3 --autoreload --purge
end script

respawn
我的芹菜配置:

# Synchronous blocking tasks
BROKER_URL_SYNC = 'amqp://guest:guest@localhost:5672//'
# Asynchronous non blocking tasks
BROKER_URL_ASYNC = 'amqp://guest:guest@localhost:5672//'

#: Only add pickle to this list if your broker is secured
#: from unwanted access (see userguide/security.html)
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'UTC'
CELERY_ENABLE_UTC = True
CELERY_BACKEND = 'amqp'

# http://docs.celeryproject.org/en/latest/userguide/tasks.html#disable-rate-limits-if-they-re-not-used
CELERY_DISABLE_RATE_LIMITS = True

# http://docs.celeryproject.org/en/latest/userguide/routing.html
CELERY_DEFAULT_QUEUE = 'sync_queue'
CELERY_DEFAULT_EXCHANGE = "tasks"
CELERY_DEFAULT_EXCHANGE_TYPE = "topic"
CELERY_DEFAULT_ROUTING_KEY = "sync_task.default"
CELERY_QUEUES = {
    'sync_queue': {
        'binding_key':'sync_task.#',
    },
    'async_queue': {
        'binding_key':'async_task.#',
    },
}
有什么想法吗

编辑:

好的,现在它似乎是随机发生的。我在RabbitMQ日志中注意到这一点:

=WARNING REPORT==== 6-Jan-2014::17:31:54 ===
closing AMQP connection <0.295.0> (some_ip_address:36842 -> some_ip_address:5672):
connection_closed_abruptly
=警告报告===2014年1月6日::17:31:54===
正在关闭AMQP连接(部分ip地址:36842->部分ip地址:5672):
连接突然关闭

当客户端在没有正确的AMQP关闭协议的情况下断开连接时,会导致连接突然关闭:

(……)

请求频道关闭

此方法表示发送方希望关闭通道。 这可能是由于内部条件(如强制停机)或 处理特定方法的错误,即异常。 由于异常导致关闭时,发送方提供的类和方法id 导致异常的方法

发送此方法后,必须放弃除
Close
Close OK
之外的任何接收方法。发送
Close
后接收
Close
的响应必须是发送
Close Ok

():

确认通道关闭

此方法确认一个
频道。关闭
方法并通知收件人
为频道释放资源是安全的

一种对等机,在未收到请求的情况下检测套接字关闭 频道。
关闭Ok
握手方法
应记录错误

这是一个问题

您能否为
BROKER\u HEARTBEAT
BROKER\u HEARTBEAT\u CHECKRATE
设置自定义配置并再次检查,例如:

BROKER_HEARTBEAT = 10 
BROKER_HEARTBEAT_CHECKRATE = 2.0

您的RabbitMQ服务器或芹菜工人是否可能支持负载平衡器?如果是,则负载平衡器将在一段时间不活动后关闭TCP连接。在这种情况下,您必须从客户端(工作者)启用heartbeat。如果您这样做,我不建议为此使用纯Python amqp库。相反,将其替换为。

在第三台服务器中等待响应的时间很长?@OmidRaha否,响应会立即返回。但有时这是一个错误。它们之间有代理吗?@OmidRaha有一个负载平衡器。我使用的是AWS,RabbitMQ前面有ELB(弹性负载平衡器)。我一直在尝试不同的设置。我现在大约有10%的时间“插座关闭”。9个任务成功完成,然后一个任务失败。。。我有三个服务器,一个是RESTfulAPI服务器,它接收HTTP请求并将任务发送到RabbitMQ,任务在工作服务器上远程执行,结果返回到API服务器。这三个都是EC2实例,在RabbitMQ中有一个负载平衡器,因为我稍后会创建一个集群。它仍然在发生。即使有心跳。@RichardKnop我认为在这种情况下,一个解决方案是将
代理
RabbitMQ
更改为
Redis
。如果您决定切换到
Redis
作为
芹菜
代理
,这是很有用的。我实际上找到了一个解决办法。设置BROKER\u POOL\u LIMIT=0可以解决此问题。对于每项任务,我现在都会打开一个新的连接,它正在工作。不理想,但效果很好。我不想从RabbitMQ切换。这并不罕见,可能是网络不可靠。所有使用套接字的应用程序必须考虑到连接可以在任何点被破坏。您应该看到芹菜任务发布重试设置。突然关闭意味着客户没有通过额外的舞蹈来关闭连接,这不应该是一个问题。Redis也使用套接字,所以那里的情况没有什么不同。。。