Подходит ли Celery для использования со многими небольшими распределенными системами? - PullRequest
6 голосов
/ 03 октября 2010

Я пишу некоторое программное обеспечение, которое будет управлять несколькими сотнями небольших систем в «поле» через прерывистое 3G (или подобное) соединение.

Домашняя база должна будет отправлять задания системам на местах (например, «сообщить о своем статусе», «обновлять программное обеспечение» и т. Д.), А системам на местах потребуется отправлять задания обратно на сервер (например,«Обнаружен сбой», «Вот некоторые данные» и т. Д.)

Я потратил некоторое время на изучение Сельдерей , и оно кажется идеально подходит: celeryd, работающий на домашней базе, может собирать задания для систем в полевых условиях, celeryd, работающий в полевых системах, может собирать задания для сервера, и эти задания можно обменивать, когда клиенты становятся доступными.

Итак, Celery хорошо подходит для этой проблемы?В частности:

  • Большинство задач будут направлены на отдельного работника (например, «отправить задание« get_status »на системный номер 51») - это будет проблемой?
  • Изящно ли он справляется с неблагоприятными сетевыми условиями (такими как, например, обрыв соединения)?
  • Какая функциональность доступна, только если RabbitMQ используется в качестве бэкэнда?(Я бы предпочел не запускать RabbitMQ на полевых системах)
  • Есть ли какая-либо другая причина, по которой Celery может осложнить мою жизнь, если я буду использовать ее так, как я описал?

Спасибо!

(было бы правильно предположить, что сельдерей переборщил, но есть и другие причины, которые облегчили бы мою жизнь, поэтому я хотел бы рассмотреть это)

Ответы [ 2 ]

12 голосов
/ 03 октября 2010

Большинство задач будет адресовано отдельному работнику (например, «отправить задание« 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 может усложнить мою жизнь, если я буду использовать ее так, как я описал?

Я не могу думатьчто-нибудь сюдам, что вы описали выше.Так как модель параллелизма является многопроцессорной, ей требуется некоторое количество памяти (я работаю над добавлением поддержки пулов потоков и пулов событий, что может помочь в некоторых случаях).

было бы правильно предположить, чтоСельдерей является излишним, но есть и другие причины, которые облегчили бы мою жизнь, поэтому я хотел бы рассмотреть это)

В этом случае я думаю, что вы употребляете слово «излишний».Это действительно зависит от того, сколько кода и тестов вам нужно написать без него.Я думаю, что лучше улучшить уже существующее общее решение, и теоретически это звучит так, как будто оно должно хорошо работать для вашего приложения.

1 голос
/ 03 октября 2010

Я бы, вероятно, настроил (django) веб-сервис для приема запросов. Веб-сервис может выполнять работу по проверке запросов и отклонению неверных запросов. Тогда сельдерей может просто сделать работу.

Это потребует от удаленных устройств опроса веб-службы, чтобы узнать, были ли выполнены их задания. Это может или не может быть целесообразным, в зависимости от того, что именно вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...