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