0

現在、私はRails 3.1 rc4で実行しており、ラックスペースサーバーの作成をキューに入れるためにredisとresqueを使用しています。

私が使用しているrackspacegemである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...ループまたは同様の構造でチェックをラップする必要があります。それ以外の場合は、値を1回正確にチェックしてから、performメソッドを終了します。

メソッドをループする場合は、スリープ呼び出しを追加する必要があります。そうしないと、何もせずに多くのCPUサイクルを消費することになります。ループするか別のジョブを呼び出すかは、最終的にはあなた次第であり、ワーカーがほとんどアイドル状態であるかどうかです。別の言い方をすれば、5分かかる場合。サーバーが起動し、ループするだけで、そのワーカーは5分間他のジョブを処理できなくなります。それが許容できるのであれば、それは確かに最も簡単なことです。受け入れられない場合は、サーバーIDを受け入れ、API呼び出しを行って、それが使用可能かどうかを確認する別のジョブが必要になる可能性があります。

ただし、そのプロセス自体は注意が必要です。なんらかの理由でサーバーがオンラインにならない場合は、ステータスが無限に続くのを待っているジョブを作成していることに気付く可能性があります。したがって、おそらく、ある種の実行カウントも渡すか、redisを追跡したいので、X回の試行後に試行を停止します。この場合、ジョブがいつ実行されるかを制御できるように、resque-schedulerもチェックします。

于 2011-07-01T21:16:56.460 に答える