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

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

предполагать

the_list = Messages.find(someconditions) 
the_list.each do |msg|
   msg.send_me
end

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

Если наш практический предел состоит в том, чтобы отправлять, скажем, 200 в минуту, как рельсы могут «найти» их меньшими партиями (b) ограничить вызовы .send_me, чтобы соответствовать нашей целевой скорости отправки

FWIW, мы работаем на Heroku, и теперь delayed_job работает для других целей.


person jpw    schedule 09.03.2011    source источник


Ответы (2)


Чтобы ограничить количество отправляемых сообщений, вы можете использовать это:

Messages.find(someconditions, :limit => 100)

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

Если вы хотите немного изменить свое приложение, вы можете добавить время send_at в свою таблицу сообщений, и когда вы создаете свои сообщения, сделайте что-то вроде:

current_send_at = Message.for_user(current_user).latest.send_at || Time.now
new_message.send_at = current_send_at + 1.minute
new_message.save!

Затем в отложенном задании вы должны выбрать сообщения, в которых send_at < now(). Имеет ли это смысл?

person jonnii    schedule 09.03.2011
comment
спасибо! как вы затем перебираете следующие 100, следующие 100 и т. д.? без повторного поиска одних и тех же 100 снова и снова? - person jpw; 10.03.2011
comment
Проверьте мое обновление, я думаю, вам лучше немного изменить свою модель. - person jonnii; 10.03.2011
comment
отложенная работа делает все это за нас... мы просто вызываем msg.delay(xxx).send_me, и она ставит сообщение в очередь до тех пор, пока мы ему не сообщим. чего я не вижу в вашем примере, так это того, как перебирать 100 сообщений за раз, а не каждый раз повторно находить одно и то же 100 сообщений. - person jpw; 10.03.2011
comment
Проблема в том, что выполнение этого в отложенном задании означает, что ваши задания потенциально будут выполняться довольно долго. Если вы хотите выполнять поиск в пакетном режиме, вы можете использовать пакетные средства поиска рельсов (ryandaigle.com/articles/2009/2/23/). - person jonnii; 10.03.2011

Если вы не можете выгрузить это из процесса rails, это невозможно сделать, иначе вы заблокируете все приложение. Запустите микроэкземпляр на ec2 и опросите очередь с сообщениями для отправки. Снять с рельсов.

person eggie5    schedule 10.03.2011