Подтвердить что ты не робот

Heroku Cedar: как масштабировать WEB-динамики на основе времени суток

Я хочу, чтобы мое приложение Rails 3.1 масштабировалось до 1 веб-дино в 8 утра, а затем до 0 веб-динамиков в 5 вечера.

НО, я не хочу подписываться на платный сервис, и я не могу рассчитывать, что мой домашний компьютер подключен к Интернету.

Кажется, что планировщик Heroku должен сделать это тривиальным. Любые быстрые решения или ссылки?

4b9b3361

Ответ 1

Ответ "да" вы можете сделать это из планировщика, и это тривиально, как только вы узнаете ответ:

  • Добавьте конфигурацию heroku var с именем вашего приложения: heroku config: добавьте APP_NAME: blah
  • Добавить gem 'heroku' в ваш Gemfile
  • Чтобы проверить, вручную масштабируйте вверх/вниз ваше приложение: heroku ps: scale web = 2
  • Добавьте задачу rake в lib/tasks/scheduler.rake:

    desc "Scale up dynos"
    task :spin_up => :environment do
      heroku = Heroku::Client.new('USERNAME', 'PASSWORD')
      heroku.ps_scale(ENV['APP_NAME'], :type=>'web', :qty=>2)
    end
    # Add a similar task to Spin down
    
  • Добавить аддон Планировщика: аддоны героя: добавить планировщик: стандартный

  • Используйте веб-интерфейс Scheduler для добавления "rake spin_up" в любое удобное для вас время.
  • Добавьте задачу rake spin_down и планируйте ее когда-либо.

Примечания: Шаг 1 необходим, потому что я не мог найти другого способа быть уверенным в имени приложения (и я использую среду "промежуточного" и "производственного" для своих приложений.

Шаг 3 требуется, поскольку в противном случае команда ruby ​​выдает ошибку, так как требуется, чтобы вы сначала согласились (с помощью ответа "Да/Нет" ), что вы будете платить деньги в результате этого действия.

На шаге 4 я не мог найти никаких документов о том, как это сделать с помощью ключа API с помощью героя gem, поэтому он выглядит как пользователь/пароль.

Надеюсь, это поможет кому-то еще!

Ответ 2

Просто реализованный этот подход (хороший ответ выше @dnszero), подумал, что я бы обновил ответ с новым API Heroku.

Добавьте имя своего приложения в конфигурационную переменную heroku

 require 'heroku-api'
  desc "Scale UP dynos"
   task :spin_up => :environment do
     heroku = Heroku::API.new(:api_key => 'YOUR_ACCOUNT_API_KEY')
     heroku.post_ps_scale(ENV['APP_NAME'], 'web', 2)
   end

Это с героикой (2.31.2), heroku-api (0.3.5)

Ответ 3

Вы можете масштабировать свой веб-процесс до нуля на

heroku ps:scale web=0

или обратно до 1 через

heroku ps:scale web=1

тогда вам нужно будет настроить задачу на 8, которая масштабирует ее, и ту, которая работает на 17, которая масштабирует ее. Heroku может потребовать, чтобы вы подтвердили свою учетную запись (то есть введите данные кредитной карты), чтобы использовать планировщик Heroku Plus, и тогда вам нужно будет иметь жемчуг Heroku внутри вашего приложения и ваши учетные данные Heroku, чтобы он мог включить или отключить ваше приложение.

Но, как говорит Нил, вы получаете 750 часов в месяц бесплатно, которые не могут перевернуться в следующий месяц, так почему бы не просто оставить его работать все время?

Ответ 4

См. также полный текст, который также касается правильной команды для использования от планировщика Heroku: https://gist.github.com/maggix/8676595

Ответ 5

Поэтому я решил реализовать это в 2017 году и увидел, что драгоценный камень Heroku, используемый принятым ответом, устарел в пользу "платформы-api". Я просто подумал, что буду писать то, что сработало для меня, так как я не видел никаких других сообщений с более современным ответом.

Вот мой файл рейка, который масштабирует мои веб-диноды до количества 2. Я использовал "httparty" gem, чтобы сделать запрос PATCH с соответствующими заголовками API платформы, согласно их docs в разделе "Формирование".

require 'platform-api'
require 'httparty'

desc "Scale UP dynos"
task :scale_up => :environment do
  headers = {
    "Authorization" => "Bearer #{ENV['HEROKU_API_KEY']}",
    "Content-Type" => "application/json",
    "Accept" => "application/vnd.heroku+json; version=3"
  }

  params = {
    :quantity => 2,
    :size => "standard-1X"
  }

  response = HTTParty.patch("https://api.heroku.com/apps/#{ENV['APP_NAME']}/formation/web", body: params.to_json, headers: headers)

  puts response
end

Ответ 6

Если вы используете кедр кедра, вы не сможете масштабировать до нулевого веб-диноза, не меняя procfile и развертывая.

Кроме того, зачем беспокоиться, если вы получите один бесплатный динод в месяц (750 динозанов, чуть больше месяца)? ​​

Ответ 7

Или, если вы хотите использовать службу вместо своей собственной, попробуйте http://scaledynos.herokuapp.com/ - она ​​масштабируется в зависимости от времени дня

Ответ 8

Как обновление для ответа @Ren, Heroku API API платформы делает это очень просто.

heroku = PlatformAPI.connect_oauth(<HEROKU PLATFORM API KEY>)
heroku.formation.batch_update(<HEROKU APP NAME>, {"updates" => 
  [{"process" => <PROCESS NAME>, 
  "quantity" => <QUANTITY AS INTEGER>, 
  "size" => <DYNO SIZE>}]
})