Grails не основанная на времени очередь - PullRequest
3 голосов
/ 02 марта 2012

Мне нужно обработать загруженные файлы, это может занять всего 1 секунду или целых 10 минут.В настоящее время мое решение состоит в том, чтобы сделать кварцевое задание с таймером 30 секунд, а затем обрабатывать и произвольное задание всякий раз, когда оно срабатывает.С этим связано несколько проблем.

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

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

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

То, что вы ищете, это базовая очередь сообщений. Есть много вариантов, но мой любимый для Grails - RabbitMQ. Плагин Grails достаточно хорош, и, по моему опыту, он хорошо работает.

В общем, очереди сообщений позволяют иметь N производителей (вещи, создающие рабочие места), добавляющих рабочие сообщения в очередь, а затем M потребителей вытягивают рабочие места из очереди и обрабатывают их. Когда работник завершает свою работу, он просто спрашивает очередь для обработки следующего задания, и если ее нет, она просто ждет очереди, чтобы дать ей что-то сделать. Очередь также отслеживает успех / неудачу обработки сообщений (вы можете контролировать это), так что вы не ' передать одно и то же сообщение нескольким работникам.

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

0 голосов
/ 02 марта 2012

Для решения проблемы достаточно выполнить проверку задания для новых загруженных файлов каждые 5 секунд (или 3 секунды, или 1 секунду).Если проверка загруженных файлов выполняется быстро, то нет причин, по которым вы не можете часто его запускать.

Для второй задачи вам нужно просто записать, когда вы начинаете обрабатывать файл, чтобы убедиться, что он не выбрандо двух раз.Вы можете создать таблицу в базе данных или где-то хранить информацию в памяти.

...