2014-10-21 21 views
1

У меня возникла проблема, позволяющая дублировать задания, добавляемые в мои приложения, с задержкой очереди заданий. Я немного поработал, но все были бесплодны. Любые предложения о том, как реализовать решение, будут оценены.Избегайте дублирования заданий в delayed_job queue

Ссылки Я наткнулся, но не предлагаю решений.

  1. https://github.com/collectiveidea/delayed_job/issues/72
  2. https://groups.google.com/forum/#!topic/delayed_job/gZ9bFCdZrsk
+0

Вы можете добавить пример повторяющихся заданий, что вызывает проблемы при их помещён. Это может помочь предложить решение для вашей конкретной проблемы. – spickermann

ответ

4

Я бы не сосредоточиться на предотвращении повторяющихся заданий. По-моему, очередь заданий должна быть дампом и не содержать состояния. Добавление задания в очередь должно быть как можно быстрее. Любая проверка вверх замедлит время отклика.

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

+0

Благодарим вас за ответ. Это направление, в котором я думал, что в конечном итоге пойду. Мне было любопытно узнать, есть ли какой-либо вариант или простое решение, которое я замалчивал, чтобы запретить дубликаты. Еще раз спасибо. – icantbecool

0

После того, что сказал @spickermann, любая повторная проверка должна происходить в фоновом режиме не во время сброса.

Как я решил эту проблему, я создал 2 новых поля в таблице delayed_jobs: подпись и args. Подпись будет либо «Class # method», либо «Object: id # method». Args будет просто args из объекта полезной нагрузки. Добавив эти поля, вы можете запросить таблицу рабочих мест, чтобы увидеть, есть ли дубликат.

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

Вот суть того, как сделать это с помощью задержанной плагин работы: https://gist.github.com/synth/fba7baeffd083a931184

Смежные вопросы