2016-12-27 2 views
1

Как мое приложение структурировано node.js-сервер отправляет данные работнику-питону, который затем запускает незанятый скрипт. Каким будет подход, который заставит сервер node.js в дальнейшем остановить сценарий и снова сделать рабочий доступ из очереди?Как мне остановить средний скрипт для rabbitmq?

ответ

1

Секрет, чтобы остановить потребителей от производителей, как правило, иметь сообщение яд.

Некоторые делают это через несколько очередей, а некоторые через выделенное сообщение понимают вниз, чтобы прекратить потребление (последний работает только с одним рабочим).

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

В начале сценария, возможно, лучше всего оставить рабочих и заставить их ждать сообщения перезагрузки.

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

Я считаю, что сельдерей делает это много, если вы ищете что-то преднамеренное.

EDIT - ядовитое сообщение, возможно, уже означает что-то еще в AMQP. Я имею в виду ваше собственное ядовитое сообщение.

Поскольку вы хотите что-то убить во время его работы, вам придется делать это вещательным способом.

Для каждого потребителя у вас на самом деле есть два потребителя на сценарий python.

Один, чтобы принять фактические данные и один для приема команд для запуска и остановки потребителя данных.

Если вы хотите начать, вы могли бы широковещательное послание (JSON, но вы можете использовать любой формат, который вы любите или вы можете также использовать AMQP свойство заголовка, а)):

{ 
     "command" : "start" 
    } 

Если вы хотите остановить ваш производитель может отправить сообщение как:

{ 
     "command": "stop" 
    } 

Ваш потребитель обратный вызов будет видеть, если message.command == 'stop'.

Как только вы видите это сообщение, вы вызываете channel.basicCancel(consumerTag)на потребителя, который фактически принимает данные, а также фактически убивает то, что в настоящее время работает. Убийство, которое в настоящее время работает, сильно зависит от вашей установки, поэтому я не могу вникать в это, потому что это может быть отдельный процесс, или это может быть отдельный поток или событие, если вы используете какой-либо механизм событий. Убивать длительные процессы по своей сути сложно.

Каждый скрипт python должен иметь эксклюзивную очередь для пользователя команды, если используется обмен темами, или вы можете использовать обмен разветвителем (aka broadcast).

Потребитель данных будет делиться очередью со всеми другими скриптами.

+0

Из всего, что я поднял, кажется, что ядовитое сообщение - это когда потребитель не может обработать сообщение. Как это поможет потребителю остановиться? Потребитель даже не получит это сообщение, потому что он уже обрабатывает текущий скрипт, нет? – joe

+0

Прошу прощения, что я сказал ядовитое сообщение, поскольку, возможно, есть официальное ядовитое сообщение AMQP. Термин перегружен. То, что я подразумеваю под ядовитым сообщением, - это настраиваемое сообщение, которое вы создаете на своем конце, которое сигнализирует о завершении. –

0

Вы можете рассмотреть возможность использования пакета, такого как сельдерей, для управления этим с помощью RabbitMQ в качестве вашего брокера. Сельдерей имеет функцию revoke(), которая может использоваться для завершения задачи.

>> from celery.task.control import revoke 
>> revoke(task_id, terminate=True) 

Поскольку это звучит, как вы хотите, чтобы остановить задачу уже в процессе - запрос фальшренонса с возможностью прекратить установлен в True, будет прекращен уже выполняющаяся задача. По умолчанию это значение неверно.

Для справки: http://docs.celeryproject.org/en/latest/userguide/workers.html#commands

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