Хобрук: Ваш путь к мастерству в программировании

Как resque проверяет, когда запускать задание?

Я нашел Resque:

https://github.com/elucid/resque-delayed

И я вижу, что могу запланировать отложенную работу. Мой вопрос: как он проверяет отложенные задания? Если у меня есть 5000 отложенных заданий в течение одного месяца, я надеюсь, что он не будет проверять каждые 10 секунд все отложенные задания.

Так как же это делается?


Ответы:


1

Нет необходимости проверять все отложенные задания. Он поддерживает отсортированный набор в Redis, при этом задания сортируются по запланированному времени. Смотрите код по адресу:

https://github.com/elucid/resque-delayed/blob/master/lib/resque-delayed/resque-delayed.rb

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

Производительность может быть дополнительно улучшена за счет выборки заданий n за n. Его можно реализовать с помощью Lua-скрипта на стороне сервера в качестве опросного запроса:

local res = redis.call('ZRANGEBYSCORE',KEYS[1], "-inf", ARGV[1], 'LIMIT', 0, 10 )
if #res > 0 then
   redis.call( 'ZREMRANGEBYRANK', KEYS[1], 0, #res-1 )
   return res
else
   return false
end

За один круговорот этот скрипт получает 10 заданий (если доступно) и удаляет их из zset. Гораздо лучше, чем 11 ZRANGEBYSCORE и 10 ZREM, которые в настоящее время требуются Resque-delayed.

25.04.2013
  • Спасибо. Я больше ищу решение, управляемое событиями. 25.04.2013
  • Может быть, у вас есть идея, как делать работу, похожую на событие? Например, у меня есть пользователи, которые планируют отправлять электронные письма через один месяц, поэтому нет смысла выполнять zrange на Redis каждые 5 минут (я предполагаю, что все предыдущие задания завершены, и ни один пользователь не поставил никаких заданий на следующий месяц) 26.04.2013
  • Не с Resque/Redis. Вероятно, вы можете сделать это на системном уровне с помощью cron/at. Вы также можете использовать модуль Ruby, такой как rufus-scheduler или аналогичные пакеты. 26.04.2013
  • Да, я думал об этом, но я не думаю, что у ebay есть 5 тысяч заданий cron, чтобы установить элемент с флагом «истекший» 26.04.2013
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..