Grails не основанная на времени очередь
Мне нужно обработать загруженные файлы, это может занять всего 1 секунду или 10 минут. В настоящее время мое решение состоит в том, чтобы сделать кварцевое задание с таймером 30 секунд, а затем обрабатывать и произвольное задание, когда оно срабатывает. Есть несколько проблем с этим.
Первый: если работа займет менее нескольких секунд, расточительно заставить вещи ждать 30 секунд для очереди задания.
Второе: если в очереди только одна длинная работа, она может попытаться выполнить ее дважды.
То, что я хочу, это вечная очередь. Когда вещи добавляются, они запускаются немедленно, если есть свободный работник. Есть ли решение для этого? Я смотрел на шутку, но я не мог сказать, может ли это сделать это.
2 ответа
То, что вы ищете, это основная очередь сообщений. Есть много вариантов, но мой любимый для Grails - RabbitMQ. Плагин Grails для него довольно хорош, и он показывает себя хорошо по моему опыту.
В общем, очереди сообщений позволяют иметь N производителей (вещей, создающих рабочие места), добавляющих рабочие сообщения в очередь, а затем M потребителей вытаскивают задания из очереди и обрабатывают их. Когда работник завершает свою работу, он просто запрашивает очередь следующее задание для обработки, и если его нет, оно просто ожидает очереди, чтобы дать ему что-то сделать. Очередь также отслеживает успех / неудачу обработки сообщений (вы можете контролировать это), чтобы вы не дали одно и то же сообщение более чем одному работнику.
Преимущество этого состоит в том, что вы не полагаетесь на опрос (так что вы можете начать обработку, как только что-то придет), и это также значительно расширяет масштаб. Вы можете увеличивать или уменьшать как своих производителей, так и потребителей по мере необходимости, отделяя входные данные от выходных данных, чтобы вы могли принять всплеск трафика, а затем пробиться через него, когда у вас есть ресурсы (работники).
Для решения первой проблемы просто проверяйте наличие новых загруженных файлов каждые 5 секунд (или 3 секунды, или 1 секунду). Если проверка загруженных файлов выполняется быстро, то нет никаких причин, по которым вы не можете запускать ее часто.
Для решения второй проблемы вам просто нужно записать, когда вы начинаете обрабатывать файл, чтобы убедиться, что он не будет поднят дважды. Вы можете создать таблицу в базе данных или где-то хранить информацию в памяти.