2015-08-23 2 views
0

Я работаю над системой на основе Python, чтобы ставить в очередь многолетние задачи для рабочих.Устойчивые длительные задачи в сельдерей

Задачи берутся из внешней службы, которая генерирует «токен», но как только они создаются на основе этого токена, они должны работать непрерывно и останавливаться только при явном удалении кода.
Задача запускает WebSocket и включает в себя петли. Если разъем закрыт, он снова открывает его. В принципе, задача не должна заключаться.

Мои цели в проектировании это решения являются:

  1. При грациозно перезапуском работника (например, для загрузки нового кода), задача должна быть повторно добавлена ​​в очередь, и взял какой-то рабочий.
  2. То же самое должно произойти, когда происходит несравнимое завершение работы.
  3. 2 работникам не следует работать с одним и тем же токеном.
  4. Другие процессы могут создавать больше задач, которые должны быть направлены на одного и того же работника, который обрабатывает определенный токен. Это будет разрешено путем отправки этих задач в очередь с именем после токена, которую работник должен начать слушать после запуска задачи маркера. Я перечисляю это требование как объяснение того, почему здесь требуется даже механизм задач.
  5. Независимые серверы, быстрая перезагрузка кода и т. Д. - Минимальное время простоя для каждой задачи.

Вся наша серверная сторона - это Python, и выглядит так: Celery - лучшая платформа для этого. Мы используем правильную технологию здесь? Любые другие архитектурные решения, которые мы должны рассмотреть?

Благодарим за помощь!

ответ

0

Согласно docs

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

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

Вы можете получить что-то вроде того, что вы хотите с помощью retry or acks_late

В целом, я думаю, вы должны реализовать дополнительный контроль за работой приложений на стороне, а также, может быть, сервис блокировки.

Но, да, в целом вы можете сделать это с сельдереем. Есть ли лучшие технологии ... это выходит за рамки этого сайта.

+0

Я использую на 'acks_late = True, track_started = True' в задаче process_token. И у меня будут гарантии на уровне приложений, чтобы убедиться, что на одном и том же токене не будет двух задач. – yulkes

+0

С помощью acks_late и track_started я добираюсь до точки, где задача process_token достигает состояния «сбой», с причиной «WorkerLostError» («Работник вышел преждевременно: сигнал 15 (SIGTERM).»,) \t 'Это не так уж плохо, на самом деле, потому что он все еще находится в очереди. Мне не нужен другой рабочий, чтобы забрать его. – yulkes

Смежные вопросы