Одна из характеристик, которые мне больше всего нравятся в Очередь задач Google, - ее простота. В частности, мне нравится, что для выполнения задачи требуется URL-адрес и некоторые параметры, а затем сообщения на этот URL-адрес.Имитация очереди задач Google Appengine с Gearman
Эта структура означает, что задачи всегда выполняют самую последнюю версию кода. И наоборот, мои работники-редукторы все запускают код в моем проекте django - поэтому, когда я нажимаю новую версию вживую, я должен убить старого рабочего и запустить новый, чтобы он использовал текущую версию кода.
Моя цель состоит в том, чтобы очередь задач была независимой от базы кода, чтобы я мог нажать новую живую версию без перезапуска любых рабочих. Итак, я подумал: почему бы не сделать задачи исполняемыми по URL-адресу так же, как очередь задач с движком Google?
Этот процесс будет работать следующим образом:
- запрос пользователя приходит и запускает несколько задач, которые не должны быть блокирующие.
- Каждая задача имеет уникальный URL-адрес, поэтому я устанавливаю задачу ретранслятора POST на указанный URL.
- Сервер ретранслятора находит работника, передает URL-адрес и отправляет данные работнику
- Рабочий просто отправляет URL-адрес с данными, тем самым выполняя задачу.
Предположим следующее:
- Каждый запрос от Gearman работника подписывается как-то так, что мы знаем, что приходит с сервера Gearman и не злонамеренный запрос.
- Задачи ограничены работать менее чем за 10 секунд (Там не было бы долго задач, которые могли бы тайм-аут)
Каковы потенциальные недостатки такого подхода? Вот один, что меня беспокоит:
- Сервер потенциально может получить молотком с большим количеством запросов всех сразу, показываемых по предварительному запросу. Таким образом, один пользовательский запрос может повлечь за собой 10 одновременных HTTP-запросов. Полагаю, у меня мог бы быть один рабочий со сном перед каждым запросом на ограничение скорости.
Любые мысли?