Resque和redis等待设置变量

时间:2011-07-01 19:59:29

标签: ruby-on-rails ruby redis ruby-on-rails-3.1 resque

目前我在rails 3.1 rc4上运行并使用redis和resque来排队创建机架空间服务器。

我正在使用的rackspace gem,cloudservers,告诉您何时使用状态方法设置服务器。

我尝试使用下面的代码只是在服务器处于活动状态并准备好使用之后才执行elsif中的代码。

class ServerGenerator
  @queue = :servers_queue
  def self.perform(current_id)
    current_user = User.find(current_id)
    cs = CloudServers::Connection.new(:username => "***blocked for security***", :api_key => "***blocked for security***")
    image = cs.get_image(49) # Set the linux distro
    flavor = cs.get_flavor(1) # Use the 256 Mb of Ram instance
    newserver = cs.create_server(:name => "#{current_user.name}", :imageId => image.id, :flavorId => flavor.id)


  if newserver.status == "BUILD"
    newserver.refresh
  elsif newserver.status == "ACTIVE"
    # Do stuff here, I generated another server with a different, static name
    # so that I could see if it was working

    cs = CloudServers::Connection.new(:username => "***blocked for security***", :api_key => "***blocked for security***")
    image = cs.get_image(49)
    flavor = cs.get_flavor(1)
    newserver = cs.create_server(:name => "working", :imageId => image.id, :flavorId => flavor.id)
  end
 end
end

当我运行上面的命令时,它只生成了第一个使用“current_user.name”的服务器,因为它的名称。循环会帮助if语句吗?这似乎是一种排队任务的糟糕方式。 我是否应该将只检查服务器是否准备好的新任务排队?

非常感谢!

1 个答案:

答案 0 :(得分:1)

根据你所写的内容,我假设cs.create_server是非阻塞的。在这种情况下,是的,您需要将检查包装在do ...循环或类似的构造中。否则,您只需精确检查一次值,然后退出执行方法。

如果你要在方法中循环,你应该添加睡眠调用,否则你将无助于刻录大量CPU周期。是否循环或调用单独的工作最终取决于您以及您的员工是否大部分闲置。换句话说,如果需要5分钟。为了让你的服​​务器出现,你只需循环,该工作人员将无法处理任何其他工作5分钟。如果这是可以接受的,那肯定是最简单的事情。如果不可接受,您可能需要另一个接受您的服务器ID的作业并进行API调用以查看它是否可用。

这个过程本身可能很棘手。如果您的服务器由于某种原因从未上线,您可能会发现自己无休止地创建等待其状态的作业。所以,你可能想要传递一些执行计数,或者在redis中跟踪,所以你在尝试X次后停止尝试。我还会查看resque-scheduler,这样你就可以控制你的工作在这种情况下的执行时间。