2011-07-01 4 views
0

現在、私はrails 3.1 rc4で動作しており、ラックスペースサーバの作成をキューに入れるためにredisとresqueを使用しています。変数を設定するためにResqueとredisを待ちます

私が使用しているラックスペースの宝石である、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

あなたが書いたことに基づいて、私はcs.create_serverが非ブロックであると仮定しています。この場合、はい、あなたのチェックをdo ...ループまたはいくつかの同様の構文でラップする必要があります。それ以外の場合は、値を正確に1回確認してから、performメソッドを終了します。

このメソッドをループする場合は、スリープコールを追加する必要があります。そうしないと、何もしないで多くのCPUサイクルが焼き付けられます。ループを張るか別の仕事を呼び出すかは、最終的にはあなた次第です。別の言い方をすると、5分かかったら。あなたのサーバーが立ち上がるために、ループするだけで、そのワーカーは他のジョブを5分間処理できなくなります。それが受け入れられるなら、それは確かに最も簡単なことです。受け入れられない場合は、サーバーIDを受け入れ、使用可能かどうかを確認するAPI呼び出しを行う別のジョブが必要になることがあります。

そのプロセス自体は難しいかもしれません。あなたのサーバーが何らかの理由でオンラインになることがない場合、状態広告を無限に待っているジョブを作成することができます。だから、ある種の実行回数を渡すか、レディスを追跡したいので、X回試行した後で試行をやめてください。また、resque-schedulerをチェックして、この場合にジョブが実行されるタイミングを制御できます。

関連する問題