Использование таблицы с помощью EventMachine

У меня есть модель Resend в моем проекте Ruby, она содержит столбцы контента и статуса.

Каков наилучший/быстрый способ использовать все записи со статусом 0 с помощью EventMachine?

Я хочу создать простого работника, который пытается найти записи со статусом == 0 каждый период (например, каждые 5 минут)

Я все еще новичок в EventMachine и не смог найти столько примеров того, как работать с БД.

До сих пор я сделал что-то вроде следующего, но не уверен, что это лучшая реализация:

$ROOT_PATH ||= File.expand_path("#{File.dirname __FILE__}")

require "rubygems"
require 'eventmachine'
require 'em-http'

require "#{$ROOT_PATH}/app/models/resend.rb"


EventMachine.run do
  EM.add_periodic_timer(5) do
    Resend.active.each do |msg|
        http = EventMachine::HttpRequest.new($RECEIVER_URL).post :body => {:message => msg.content }
        http.callback { msg.update_status! }
    end
  end
end

Любая помощь будет высоко ценится


person Eki Eqbal    schedule 10.12.2012    source источник
comment
File.expand_path("#{File.dirname __FILE__}") — это антишаблон, которого следует избегать. То, что вы имеете в виду, это File.expand_path(File.dirname(__FILE__)), поскольку нет причин для строки.   -  person tadman    schedule 10.12.2012


Ответы (2)


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

Что вам действительно нужно, так это своего рода очередь заданий, например beanstalkd или delayed_job.

person tadman    schedule 10.12.2012

Вам нужна событийная версия вашего драгоценного камня БД. Обычно они имеют префикс em- . Если это mongoDB, есть гем em-mongo. Для Mysql лучшим вариантом, который я слышал, является встроенный асинхронный модуль в mysql2 gem.

person Sergii Mostovyi    schedule 11.12.2012
comment
Я использую mysqlplus, и только что обезьяна пропатчила его чем-то вроде: class Mysql; псевдоним: запрос: async_query; конец, это поможет? - person Eki Eqbal; 11.12.2012
comment
Прочтите эту статью: igvita.com/2008/09 /05/асинхронный-доступ-базы-данных-в-ruby . Как правило, если вы не используете Goliath или em-synchrony, вам нужен обратный вызов для передачи результата запроса. - person Sergii Mostovyi; 11.12.2012