2012-02-08 25 views
12

Tôi muốn Rails của tôi 3.1 ứng dụng để mở rộng quy mô lên đến 1 web Dyno lúc 8 giờ sáng, sau đó xuống 0 dynos web lúc 5 giờ chiều.Heroku Cedar: Làm thế nào để mở rộng quy mô dynos WEB dựa trên thời gian trong ngày

NHƯNG, tôi không muốn đăng ký một dịch vụ thanh toán, và tôi không thể tin cậy vào máy tính ở nhà của tôi được kết nối với internet.

Dường như Bộ lập lịch Heroku nên làm điều này tầm thường. Bất kỳ giải pháp hoặc liên kết nhanh nào?

+0

Để làm rõ/đơn giản hóa: từ ruby, bạn thêm 1 dyno web mới vào ứng dụng hiện tại của bạn như thế nào? – dnszero

Trả lời

11

Câu trả lời là 'có' bạn có thể làm điều này từ lịch trình và nó tầm thường một khi bạn biết câu trả lời:

  1. Thêm một Heroku cấu hình var với tên ứng dụng của bạn: config Heroku: thêm APP_NAME: blah
  2. Thêm đá quý 'Heroku' để Gemfile bạn
  3. để xác minh, tay mở rộng lên/xuống ứng dụng của bạn: ps Heroku: quy mô web = 2
  4. Thêm một nhiệm vụ cào để lib/nhiệm vụ/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 
    
  5. Thêm addon Scheduler: addons Heroku: thêm lên lịch: tiêu chuẩn

  6. Sử dụng giao diện Scheduler web để thêm "cào spin_up" ở bất cứ lúc nào bạn muốn
  7. Thêm một nhiệm vụ cào spin_down và lập lịch cho bất cứ khi nào.

Ghi chú: Bước 1 là cần thiết bởi vì tôi không thể tìm thấy bất kỳ cách nào khác để chắc chắn của tên ứng dụng (và tôi sử dụng 'dàn' và môi trường 'sản xuất' cho các ứng dụng của tôi

.

Bước 3 là bắt buộc vì nếu không thì lệnh ruby ​​sẽ bị lỗi vì nó yêu cầu bạn đồng ý đầu tiên (thông qua Có/Không có phản hồi) rằng bạn sẽ bị tính tiền do hành động này. t tìm thấy bất kỳ tài liệu về cách làm điều này với một khóa API thông qua đá quý heroku, do đó, nó trông giống như người dùng/vượt qua được yêu cầu.

Hy vọng điều này sẽ giúp người khác!

+0

điều này trả về lỗi "RestClient :: UnprocessableEntity: 422 Unprocessable Entity" – istan

+0

Bạn đã bỏ qua bước 3 chưa? Nếu không, tôi không có ý tưởng gì sẽ gây ra điều đó (giả sử cùng một ngăn xếp và tất cả). Nhưng bạn có thể cố gắng giải cứu lỗi và xem nó nói gì. – dnszero

+0

Nếu bạn đang nhận được 422 nó có nghĩa là bạn đã không nói với heroku những gì quá trình công nhân của bạn là có nghĩa là để làm. Hãy xem tài liệu về heroku tại đây https://devcenter.heroku.com/articles/delayed-job Nó sẽ cho bạn biết để tạo ra một Procfile có chứa định nghĩa công nhân của bạn. – joshuacronemeyer

0

Nếu bạn đang chạy trên tuyết tùng chồng, bạn sẽ không có khả năng mở rộng lên tới zero dynos web mà không thay đổi procfile và triển khai.

Ngoài ra, tại sao bận tâm nếu bạn nhận được một Dyno miễn phí một tháng (750 giờ Dyno, một ít hơn một tháng trên thực tế)?

3

Bạn có thể mở rộng quá trình web của bạn để zero bởi

heroku ps:scale web=0

hoặc quay trở lại 1 qua

heroku ps:scale web=1

sau đó bạn sẽ phải có một nhiệm vụ thiết lập để chạy lúc 8 điều chỉnh nó lên và cái chạy ở độ 17 sẽ làm giảm nó xuống. Heroku có thể yêu cầu bạn xác minh tài khoản của bạn (ví dụ nhập chi tiết thẻ tín dụng) để sử dụng Trình lập lịch Heroku cộng với sau đó bạn phải có đá quý Heroku bên trong ứng dụng và thông tin Heroku của bạn để có thể bật hoặc tắt ứng dụng của bạn.

Nhưng giống như Neil nói - bạn sẽ có được 750hrs một tháng miễn phí mà không thể cuộn qua vào tháng tới vậy tại sao không chỉ để lại cho nó chạy tất cả các thời gian?

+1

Cái xấu của tôi, tôi muốn chia tỷ lệ từ 1 dyno thành 2. Mục tiêu của tôi là tránh thời gian tăng 20 giây gây phiền nhiễu trong ngày làm việc (và hỗ trợ Heroku bằng cách trả tiền cho nó, thay vì hack với Pingdom, vv). – dnszero

11

Chỉ cần triển khai phương pháp này (câu trả lời hay ở trên @dnszero), tôi nghĩ rằng tôi sẽ cập nhật câu trả lời với API mới của Heroku.

Thêm tên ứng dụng của bạn như là một biến Heroku cấu hình

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 

Đây là với Heroku (2.31.2), Heroku-api (0.3.5)

0

Hoặc, nếu bạn muốn sử dụng một dịch vụ thay vì thực hiện của riêng bạn, hãy thử http://scaledynos.herokuapp.com/ - nó quy mô dựa trên thời gian trong ngày

1

Vì vậy, tôi quyết định thực hiện điều này vào năm 2017 và thấy rằng đá quý Heroku được sử dụng bởi câu trả lời được chấp nhận đã không còn được dùng để ủng hộ đá quý 'nền tảng-api'. Tôi chỉ nghĩ rằng tôi sẽ đăng những gì làm việc cho tôi, vì tôi đã không nhìn thấy bất kỳ bài viết khác với một câu trả lời up-to-date.

Đây là tệp cào của tôi có tỷ lệ dynos web của tôi với tổng số là 2. Tôi đã sử dụng đá quý 'httparty' để thực hiện yêu cầu PATCH với tiêu đề thích hợp cho API nền tảng, theo số docs, trong phần "Hình thành" .

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 
0

Cập nhật câu trả lời của @ Ren, số Platform API gem của Heroku khiến việc này thực sự dễ dàng.

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>}] 
}) 
Các vấn đề liên quan