0

我的 Ruby 项目中有一个模型Resend,它包含内容和状态列。

使用 EventMachine 使用状态为 0 的所有记录的最佳/最快方法是什么?

我想创建一个简单的工作人员,尝试在每个时期(比如每 5 分钟)查找 status==0 的记录

我还是 EventMachine 的新手,找不到太多如何处理 DB 的例子。

到目前为止,我做了如下的事情,但不确定它是否是最好的实现:

$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

任何帮助将不胜感激

4

2 回答 2

0

You need evented version of your DB gem. They usually have prefix em- . If it's a mongoDB there is 'em-mongo' gem. For Mysql the best option I heard is built-in async module in mysql2 gem

于 2012-12-11T04:09:00.410 回答
0

这种方法的问题是您将触发对该范围内的每个Resend 的调用,并且您将每五秒执行一次。至少您需要将这些记录标记为正在处理,这样您就不会重复工作。如果处理其中任何一个需要超过 5 秒,您将有重叠的调用。

您真正需要的是某种作业队列,例如beanstalkddelayed_job

于 2012-12-10T19:19:46.967 回答