ruby-on-rails - resque和redis等待变量被设置

标签 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 语句吗?这似乎也是一种糟糕的任务排队方式。 我是否应该加入一个新任务来检查服务器是否准备就绪?

非常感谢!

最佳答案

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

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

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

关于ruby-on-rails - resque和redis等待变量被设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6552680/

相关文章:

redis - 有没有更灵活地使用 redis.expire 的选项?

javascript - Rails jquery 上多次调用 click 事件

ruby - 通过类层次结构进行链接,无需调用 `super` 或发明新名称

node.js - NodeJS/express/connect-redis : no error on redis being down; session missing

ruby - 使用 soap4r 时 sslv3 警告意外消息

Ruby 元编程 - 通过过程动态定义新类?

php - Redis存储在数组中

mysql - ActiveRecord::InvalidForeignKey

ruby-on-rails - 关联 has_many 计数超过 1 的 Rails 条件

ruby-on-rails - 将用户输入转换为整数