Большинство задач будет адресовано отдельному работнику (например, «отправить задание« get_status »в system51») - это будет проблемой?
Несовсем.Просто создайте очередь для каждого работника, например, скажем, что каждый узел слушает очередь циклического перебора с именем default
, и у каждого узла есть своя собственная очередь, названная по имени его узла:
(a)$ celeryd -n a.example.com -Q default,a.example.com
(b)$ celeryd -n b.example.com -Q default,b.example.com
(c)$ celeryd -n c.example.com -Q default,c.example.com
Маршрутизация задачи непосредственно кУзел прост:
$ get_status.apply_async(args, kwargs, queue="a.example.com")
или по конфигурации с использованием Router
:
# Always route "app.get_status" to "a.example.com"
CELERY_ROUTES = {"app.get_status": {"queue": "a.example.com"}}
Изящно ли он обрабатывает неблагоприятные условия сети (такие как, например, обрыв соединения)?
Рабочий корректно восстанавливается после сбоев соединения с брокером.(по крайней мере из RabbitMQ, я не уверен насчет всех остальных бэкэндов, но это легко проверить и исправить (вам нужно только добавить связанные исключения в список)
Для клиента вы всегда можетеПовторите попытку отправки задачи, если соединение не работает, или вы можете настроить HA с RabbitMQ: http://www.rabbitmq.com/pacemaker.html
Какая функциональность доступна, только если RabbitMQ используется в качестве бэкэнда? (Я бы предпочелне запускать RabbitMQ в полевых системах)
Команды удаленного управления, и поддерживаются только «прямые» обмены (не «тема» или «разветвление»). Но это будет поддерживаться в Kombu(http://github.com/ask/kombu).
Я бы серьезно пересмотрел использование RabbitMQ. Почему вы считаете, что он не очень подходит? ИМХО, я бы не стал искать такую систему в другом месте (кроме, возможно, ZeroMQ, если система временная, и вы нене требует постоянства сообщений).
Есть ли какая-либо другая причина, по которой Celery может усложнить мою жизнь, если я буду использовать ее так, как я описал?
Я не могу думатьчто-нибудь сюдам, что вы описали выше.Так как модель параллелизма является многопроцессорной, ей требуется некоторое количество памяти (я работаю над добавлением поддержки пулов потоков и пулов событий, что может помочь в некоторых случаях).
было бы правильно предположить, чтоСельдерей является излишним, но есть и другие причины, которые облегчили бы мою жизнь, поэтому я хотел бы рассмотреть это)
В этом случае я думаю, что вы употребляете слово «излишний».Это действительно зависит от того, сколько кода и тестов вам нужно написать без него.Я думаю, что лучше улучшить уже существующее общее решение, и теоретически это звучит так, как будто оно должно хорошо работать для вашего приложения.