Поэтому я использую RabbitMQ + Celery для создания простой архитектуры RPC. У меня есть один брокер сообщений RabbitMQ и один удаленный рабочий, который управляет дегустацией сельдерея.Сельдерей неожиданно закрывается после более длительного бездействия
Существует третий сервер, который предоставляет тонкий API RESTful. Когда он получает 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:[email protected]:5672//'
# Asynchronous non blocking tasks
BROKER_URL_ASYNC = 'amqp://guest:[email protected]: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.#',
},
}
Любые идеи?
EDIT:
Хорошо, теперь, кажется, случается случайно. Я заметил это в 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
Ожидание ответа на третьем сервере длинное? –
@ OmidRaha Нет, ответ возвращается немедленно. Но иногда это ошибка. –
Есть ли между ними прокси? –