Имитация очереди задач Google Appengine с Gearman - PullRequest
4 голосов
/ 10 марта 2010

Одной из характеристик, которые мне больше всего нравятся в очереди задач Google, является ее простота. Точнее говоря, мне нравится, что он принимает URL-адрес и некоторые параметры, а затем отправляет сообщения по этому URL-адресу, когда очередь задач готова к ее выполнению.

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

Моя цель состоит в том, чтобы очередь задач была независимой от базы кода, чтобы я мог запустить новую живую версию, не перезапуская рабочих. Итак, я задумался: почему бы не сделать задачи исполняемыми по URL, как очередь задач Google App Engine?

Процесс будет работать так:

  1. Пользовательский запрос приходит и запускает несколько задач, которые не должны блокироваться.
  2. У каждой задачи есть уникальный URL, поэтому я ставлю задачу gearman в POST по указанному URL.
  3. Сервер gearman находит работника, передает URL и отправляет данные работнику
  4. Рабочий просто отправляет на URL данные, выполняя, таким образом, задачу.

Допустим следующее:

  1. Каждый запрос от работника-механиста каким-то образом подписывается, так что мы знаем, что он поступает с сервера, а не вредоносный запрос.
  2. Задачи могут быть запущены менее чем за 10 секунд (не будет длинных задач, которые могут прерваться по таймауту)

Каковы потенциальные ловушки такого подхода? Вот тот, который меня беспокоит:

  • Сервер потенциально может быть забит множеством запросов, инициированных предыдущим запросом. Таким образом, один запрос пользователя может повлечь 10 одновременных запросов http. Я полагаю, что у меня может быть один рабочий с сном перед каждым запросом на ограничение скорости.

Есть мысли?

1 Ответ

4 голосов
/ 31 марта 2010

Как пользователь Django и Google AppEngine, я, безусловно, могу оценить, к чему вы стремитесь. На работе я сейчас работаю над точно таким же сценарием, используя несколько довольно крутых инструментов с открытым исходным кодом.

  1. Взгляните на Сельдерей . Это распределенная очередь задач, построенная на Python, которая раскрывает три концепции: очередь, набор работников и хранилище результатов. Он подключается с различными инструментами для каждой части.

  2. Очередь должна быть закаленной в бою и быстрой. Посмотрите RabbitMQ для отличной реализации очереди в Erlang с использованием протокола AMQP.

  3. Рабочие в конечном итоге могут быть функциями Python. Вы можете инициировать работников, используя либо сообщения очереди, либо, возможно, более соответствующие тому, что вы описываете, - webhooks

Ознакомьтесь с документацией Celery webhook . Используя все эти инструменты, вы можете создать готовую к работе распределенную очередь задач, которая отвечает вашим требованиям.

Я должен также упомянуть, что в отношении вашей первой ловушки, сельдерей реализует ограничение скорости выполнения задач с использованием алгоритма Token Bucket .

...