Resque и redis ждут установки переменной

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

Используемый мной жемчуг стойки, 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? Также это кажется плохим способом постановки задач в очередь. Должен ли я поставить в очередь новую задачу, которая просто проверяет, готов ли сервер или нет?

Огромное спасибо!


person Flashuni    schedule 01.07.2011    source источник


Ответы (1)


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

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

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

person nirvdrum    schedule 01.07.2011