Resque и Redis ждут, пока будет установлена ​​переменная - PullRequest
0 голосов
/ 01 июля 2011

В настоящее время я работаю на rails 3.1 rc4 и использую redis и resque для создания очередей серверов RackSpace.

Используемый мной RackSpace, 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 Ответ

1 голос
/ 02 июля 2011

Исходя из того, что вы написали, я предполагаю, что cs.create_server неблокирует.В этом случае, да, вам нужно будет обернуть ваш чек в цикл do ... или какую-то похожую конструкцию.В противном случае вы проверяете значение точно один раз и затем выходите из метода execute.

Если вы собираетесь выполнить цикл в методе, вам следует добавить вызовы в спящем режиме, в противном случае вы собираетесь сжечь многоЦиклы процессора ничего не делают.В конечном итоге, решать, выполнять ли вам зацикливание или вызывать отдельную работу, а ваши работники в основном бездействуют.Иными словами, если это займет 5 минут.для вашего сервера, и вы просто зациклились, этот работник не сможет обрабатывать другие задания в течение 5 минут.Если это приемлемо, это, безусловно, самая легкая вещь.Если это неприемлемо, вам, вероятно, понадобится другая работа, которая принимает идентификатор вашего сервера и выполняет вызов API, чтобы узнать, доступен ли он.

Хотя сам этот процесс может быть сложным.Если по какой-либо причине ваш сервер никогда не подключается к сети, вы можете создавать рабочие места в ожидании его статуса до бесконечности.Таким образом, вы, вероятно, также хотите передать какой-то счетчик выполнения или отслеживать redis, поэтому вы прекращаете попытки после X попыток.Я также проверил бы resque-scheduler , чтобы вы могли контролировать, когда ваша работа будет выполнена в этом случае.

...