2016-05-11 3 views
2

У меня есть задача с сельдерием, которая является интенсивной в памяти, и я хочу, чтобы она работала на дорогостоящем сервере AWS, который почти не работает.Как я могу сделать штамп сельдерея после того, как больше нет задач для запуска?

Успех сельдерея запланировал задачу один раз в день, но ее также можно планировать вручную через веб-приложение (== django).

Планирование задачи - вопрос отправки сообщения в очередь кроликов.

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

Я знаю, как настроить AWS, чтобы включить мой сервер. Проблема в том, что: как я могу сказать сельдерейу о выполнении задач до тех пор, пока очередь не будет пуста , а затем умрет?

Есть ли параметр команды, который я могу ему дать, или мне нужно придумать какой-то взлом для этого?

+1

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

+0

Задача может занять некоторое время. Пока он запускает запрос на запуск другой подобной задачи, может возникнуть необходимость. Она должна быть поставлена ​​в очередь. –

+0

Просто, чтобы быть ясным: намерение здесь отключить сервер после того, как он больше не нужен (чтобы сэкономить деньги в AWS) –

ответ

1

Спасибо @iurisilvio и @ douglas-camata за ответы. Я думаю, что я нашел идеальное решение, используя некоторые идеи от вас, ребят :-)

Я создал простой монитору себя с этой командой Джанго (мое приложение Джанго в конце концов) == wait_celery_idle.py

import time 
from django.core.management.base import NoArgsCommand 
from core.celery_utils import celery_count_status as ccount 
import celery 


class Command(NoArgsCommand): 

    help = "Waits until celery is idle" 

    def handle(self, *args, **options): 
     while _count() > 0: 
      time.sleep(5) 


def _count(): 
    cinspect = celery.current_app.control.inspect() 
    return ccount(cinspect.active()) + ccount(cinspect.scheduled()) + ccount(cinspect.reserved()) 

def ccount(d): 
    k = d.keys()[0] 
    return len(d[k]) 

Я тогда начать процесс сельдерея, как правило: ./manage.py celery worker -c 1 --pidfile /tmp/celery.pid

Затем я начинаю второй процесс (wait_and_die.sh), чтобы следить за сельдереем и умереть, если он слишком долго простаивает.

#!/bin/bash 
# wait_and_die.sh 

./manage.py wait_celery_idle 
kill $(cat /tmp/celery.pid) 
sleep 10 
sudo shutdown -h now 

PS: это работает только, если я использую кролик в качестве infrasctructure очереди - в cinspect.* методы возвращение Нет, если я использую Джанго БД в качестве очереди (с помощью CELERY_BROKER_URL='django://' в settings.py)

+0

Как только рабочий остановился, что начинает его снова? Я не использовал побочные эффекты сельдерея, но, глядя на документ, я не вижу, что он начинает работать. Я что-то пропустил? – Louis

1

Мой совет: создать обратный вызов для запуска после завершения вашей задачи. Этот обратный вызов отправляет запрос в ваше веб-приложение с информацией об экземпляре AWS и использует эту информацию для ее закрытия.

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

EDIT2: также хорошая идея может позволить этой самой дорогостоящей задачей отправить запрос на веб-приложение, чтобы уничтожить экземпляр Amazon, а также убить работника сельдерей (проверить http://www.pythondoc.com/celery-3.1.11/userguide/workers.html#stopping-the-worker)/

2

сельдерей работник просто тупой лошади. Что-то еще должно контролировать работник и инициировать событие, если работник ждет задач.

использования Flower для мониторинга сельдерея кластера и their API потреблять уборщица активности.

цветка имеет красивую приборную панель с рабочими/tasks, информация есть, и у них есть API.

+0

Я не знал цветок. Неплохо! –