0

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

我正在使用的 rackspace gem,cloudservers,会告诉您何时使用 status 方法完成了服务器设置。

我试图用下面的代码做的是只有在服务器处于活动状态并准备好使用之后才执行 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 语句?此外,这似乎是一种对任务进行排队的糟糕方式。我是否应该将一个新任务排入队列,该任务只是检查服务器是否准备好?

非常感谢!

4

1 回答 1

1

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

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

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

于 2011-07-01T21:16:56.460 回答