Ric*_*nop 5 python django ubuntu rabbitmq celery
所以我正在使用RabbitMQ + Celery创建一个简单的RPC体系结构。我有一个RabbitMQ消息代理和一个运行Celery deamon的远程工作者。
第三台服务器公开了瘦的RESTful API。收到HTTP请求后,它将任务发送给远程工作器,等待响应并返回响应。
这在大多数情况下都有效。但是我注意到,长时间不活动(例如5分钟没有收到请求)之后,芹菜工人的行为很奇怪。长时间不活动后收到的前3个任务返回此错误:
exchange.declare: connection closed unexpectedly
Run Code Online (Sandbox Code Playgroud)
经过三个错误的任务后,它又可以工作了。如果长时间没有任务,则会发生相同的情况。任何的想法?
我给芹菜工人的初始化脚本:
# 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
Run Code Online (Sandbox Code Playgroud)
我的芹菜配置:
# 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.#',
},
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑:
好的,现在看来是随机发生的。我在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
Run Code Online (Sandbox Code Playgroud)
这connection_closed_abruptly是由于客户端在没有正确的 AMQP 关闭协议的情况下断开连接而导致的:
通道.关闭(...)
请求关闭通道。
该方法表明发送者想要关闭通道。这可能是由于内部条件(例如强制关闭)或由于处理特定方法的错误(即异常)而导致的。当由于异常而关闭时,发送者提供导致异常的方法的类和方法 ID。
发送此方法后,除
Close和之外的任何收到的方法都Close-OK必须被丢弃。Close发送后收到的响应Close必须是 sendClose-Ok。
通道.close-ok ():
确认通道关闭。
该方法确认
Channel.Close方法并告诉接收者可以安全地释放通道资源。在未接收到 Channel 的情况下检测套接字关闭的对等点。
Close-Ok握手方法SHOULD记录错误。
这是一个与此相关的问题。
BROKER_HEARTBEAT您可以为和设置自定义配置BROKER_HEARTBEAT_CHECKRATE并再次检查,例如:
BROKER_HEARTBEAT = 10
BROKER_HEARTBEAT_CHECKRATE = 2.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1873 次 |
| 最近记录: |