Надежная синхронизация с периодическими таймерами EventMachine

Моя цель — иметь систему, которая транслирует рекламу каждые 10 минут в 37 500 городов. Выполнение запросов к БД, расчетов и AMQP IO для всех городов занимает около 5 минут.

Код примерно структурирован так:

EventMachine.add_periodic_timer(10 minutes) do
  the_task_that_takes_five_minutes
end

Я обнаружил, что, хотя таймер установлен на 10-минутные интервалы и хотя задача занимает менее десяти минут, команда срабатывает с 15-минутными интервалами (время, необходимое для выполнения задачи + период EM).

Если мы сделаем предположение, что задача никогда не будет занимать более 10 минут, как мне обеспечить, чтобы период таймера всегда составлял ровно 10 минут от предыдущего запуска, независимо от времени обработки задачи?

EM в основном, кажется, устанавливает следующий таймер после запуска задачи, а не до.

Я пробовал простой EM.defer вокруг самого пакета задач. Я предполагал, что это откроет поток для установки следующего таймера, но это не решает проблему.

Могу ли я отказаться от следующего?

def do_stuff
  EventMachine.add_timer(10 minutes) do
    do_stuff
  end

  the_task_that_takes_five_minutes
end

do_stuff

Я знаю, что могу делать такие вещи в Javascript, потому что таймер не будет выполняться внутри стека вызовов do_stuff. Верно ли это для EventMachine?


person onyxrev    schedule 20.02.2013    source источник


Ответы (1)


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

EventMachine.add_periodic_timer(10 minutes) do
  ad_broadcasting calculations
  EM.defer
    calculations = Calc.new
  end
end

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

person Sebastian Neira    schedule 20.02.2013
comment
На самом деле это не решает проблему, потому что мне все еще нужно каждые 10 минут делать новые вычисления для трансляции, и я бы предпочел запланировать это с Ruby, а не с чем-то вроде задания cron. - person onyxrev; 20.02.2013
comment
Насколько я понимаю, если расчеты займут менее 10 минут, будут транслироваться новые расчеты. - person Sebastian Neira; 20.02.2013