【问题标题】:Resque and redis wait for variable to be setResque 和 redis 等待变量被设置
【发布时间】:2011-07-01 19:59:29
【问题描述】:

目前我在 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 语句?此外,这似乎是一种对任务进行排队的糟糕方式。 我是否应该加入一个新任务来检查服务器是否准备好?

非常感谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-17
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      相关资源
      最近更新 更多