Cách dễ dàng để ngăn chặn Heroku chạy không?


285

Trong các ứng dụng miễn phí Heroku, các dynos dường như không hoạt động - ứng dụng của tôi có lưu lượng truy cập rất thấp nhưng trong trường hợp của tôi, người dùng của tôi phải chờ hơn 20 giây để quay một dyno mới.

Thành thật mà nói, với sự chờ đợi đó, nhiều người sẽ rời đi trước khi trang đầu tiên thậm chí hiển thị.

Vì vậy, tôi có một vấn đề: tôi có nên trả 36 đô la mỗi tháng để tiết kiệm cho mỗi người dùng 20 giây dài đáng xấu hổ khi lưu lượng truy cập của tôi ở dạng một chữ số mỗi ngày.

Có cách nào để giái quyết vấn đề này không??


13
Kể từ ngày 1 tháng 7 năm 2015, điều này sẽ không thể thực hiện được nữa, theo thông báo của Heroku: blog.heroku.com/archives/2015/5/7/heroku-free-dynos . Tuy nhiên, họ đã giới thiệu một kế hoạch "sở thích" chỉ có giá $ 7 / tháng.
Cristian

1
Hiện tại có thể các máy chủ ảo có sẵn với giá 5 đô la / tháng (hoặc ít hơn hóa đơn hàng giờ) cung cấp quyền truy cập toàn bộ vỏ, v.v. Tôi đã sử dụng DigitalOcean trong hơn một năm nay nhưng tôi chắc chắn có những người khác trong không gian để cạnh tranh. IMO một giải pháp tốt hơn nếu Heroku không còn miễn phí nữa ..
sricks

1
@sricks Một VPS đầy đủ (mà bạn cần quản lý, cập nhật, định cấu hình máy chủ Git, máy chủ web, máy chủ DB, tường lửa, móc Git, sao lưu, WAL-E, v.v., v.v.) là một điều khác với Heroku ( một PaaS). Trong một số trường hợp, bạn muốn cái trước, trong những trường hợp khác, nhưng đô la thô nên là một số liệu chính. Thời gian và rủi ro nên có.
elithrar

Làm cách nào để cài đặt tác nhân Relic mới trên ứng dụng RoR? newrelic.com/ruby
Manny Quintanilla

1
Kể từ ngày 1 tháng 6 năm 2016, điều này có thể trở lại nếu bạn xác minh bằng thẻ tín dụng. thông báo . Bạn sẽ nhận được 1000 giờ miễn phí mỗi tháng và chỉ có 730 giờ trong một tháng. Giả sử bạn chỉ có một dyno đang chạy, bạn có thể đi 24/7 miễn phí.
Nướng khoai tây

Câu trả lời:


351

Bạn có thể cài đặt tiện ích Relic mới miễn phí . Nó có một tính năng giám sát khả dụng sẽ ping trang web của bạn hai lần mỗi phút, do đó ngăn không cho dyno không hoạt động.

Ít nhiều giải pháp tương tự như Jesse nhưng có thể tích hợp nhiều hơn với Heroku ... Và với một vài đặc quyền (giám sát hiệu suất chỉ là tuyệt vời).

Giám sát sẵn có

Lưu ý: đối với tất cả những người nói rằng nó không hoạt động: phần quan trọng trong câu trả lời của tôi là "màn hình sẵn sàng". Chỉ cần cài đặt addon sẽ không giúp đỡ. Bạn cũng cần thiết lập giám sát tính khả dụng với URL của ứng dụng heroku của bạn.


6
chúng ta có phải cài đặt gem 'newrelic_rpm' không để dyno không hoạt động?
simo

3
Điều này làm tăng bao nhiêu việc sử dụng dyno?
Trevoke

4
Tôi mới phát hiện ra điều này khá gần đây. Nó không còn làm việc xuất sắc. Tuy nhiên, chỉ trong trường hợp, tôi đảm bảo rằng tôi thực hiện một truy vấn DB đơn giản trước khi hiển thị thông báo 'Ứng dụng khả dụng'. Điều này cũng hoạt động tuyệt vời với chùa, và bất kỳ chủ nhà buồn ngủ khác.
Jacob Evan Shreve

8
@aubraus: chỉnh sửa của bạn đã bị từ chối ... Dù sao: đối với tất cả những người nói rằng nó không hoạt động: phần quan trọng trong câu trả lời của tôi là "màn hình sẵn sàng". Chỉ cần cài đặt addon sẽ không giúp đỡ. Bạn cũng cần thiết lập giám sát tính khả dụng với URL của ứng dụng heroku của bạn.
Pierre

13
Trong trường hợp bất cứ ai vẫn đang tìm kiếm điều này, liên kết trực tiếp cho ping sẽ có ở đây: synthetic.newrelic.com/accounts/[your_account_id[/monitor/new Chỉ cần đăng nhập vào ID tài khoản của bạn.
Eric Yang

91

Để thay thế cho Pingdom, tôi khuyên bạn nên thử Uptimerobot . Nó là miễn phí và cung cấp kiểm tra trang web khoảng 5 phút. Nó hoạt động rất tốt cho tôi.

CẬP NHẬT ngày 7 tháng 5 năm 2015: Điều này sẽ không thể thực hiện được nữa, vì Heroku sẽ thay đổi dyno miễn phí của họ để ngăn không cho nó tồn tại trong 24 giờ:

Một thay đổi quan trọng khác liên quan đến việc ngủ dyno hoặc 'không hoạt động'. Mặc dù các ứng dụng không phải trả tiền luôn ngủ sau khi hết thời gian hoạt động, một số ứng dụng đã sử dụng dịch vụ ping tự động để ngăn chặn hành vi đó. dynos miễn phí được phép thức 18 giờ mỗi 24 giờ và trong vài tuần tới, chúng tôi sẽ bắt đầu thông báo cho người dùng về các ứng dụng vượt quá giới hạn đó. Với việc giới thiệu sở thích dyno ($ 7 mỗi tháng), chúng tôi đang yêu cầu để ứng dụng của bạn ngủ sau khi hết thời gian hoặc nâng cấp lên tùy chọn mới này.

Khi nào nó sẽ được sống? Theo bài đăng trên blog của họ:

Các ứng dụng chạy một dyno 1X không tích lũy bất kỳ khoản phí dyno nào khác sẽ được chuyển dần sang các dynos miễn phí mới bắt đầu vào ngày 1 tháng 7 .


1
Uptimerobot dường như (trớ trêu thay). Bạn có thể đăng ký và đăng nhập, nhưng nếu bạn cố gắng thêm một màn hình mới, nó chỉ báo "màn hình đã có
Jeff Axelrod

Có vẻ như hoạt động khá tốt, ... Tôi hiểu rằng heroku ngủ mọi thứ trên các dịch vụ miễn phí, nhưng thật tệ khi tổ chức một điều phối viên trung tâm (điều mà natur không thể thu nhỏ được).
jonasfj

Tôi không thể làm điều này vì Uptimerobot yêu cầu địa chỉ IP ?? Tôi không thể thấy làm thế nào để nó hoạt động với một url, như url herokuapp. EDIT: xấu của tôi, tôi đã đưa vào http://và nhận được một lỗi.
Ruben Martinez,

1
Sự khác biệt lớn là khoảng thời gian 5 phút có nghĩa là sẽ mất 5 phút trước khi bạn được thông báo nếu nó xuống. Chúng tôi sử dụng Pingometer ( pingometer.com ) có khoảng thời gian 1 phút và thật tuyệt vời với Heroku.
okoboko

9
Kể từ tháng 4 năm 2017, giới hạn 18 giờ không còn nữa, bạn có thể nhận được miễn phí 24/7, miễn là tài khoản của bạn được xác minh. devcenter-staging.heroku.com/articles/free-dyno-hour-faq .
bagonyi

76

Theo tôi, việc sử dụng cấp 'miễn phí' của dịch vụ không nên cung cấp năng lượng cho ứng dụng sản xuất hoặc khách hàng phải đối mặt. Trong khi các giải pháp trên hoạt động chống lại Dyno không hoạt động, hãy suy nghĩ kỹ về những gì bạn đang làm.

Nếu không có gì khác, hãy sử dụng công việc định kỳ để ping trang web của bạn và vô hiệu hóa kiểm tra các khoảng thời gian sử dụng thấp đã biết (nghĩa là qua đêm) để đảm bảo Heroku không làm mất đi cấp miễn phí cho mọi người khác.


Cảm ơn câu trả lời của bạn. Ý bạn là gì cụ thể bằng cách 'suy nghĩ thấu đáo về những gì bạn đang làm'?
sscirrus

36
Phần lớn cho những người đọc câu trả lời trên cho giải pháp này. Mục tiêu của tầng miễn phí trên Heroku không phải là để lưu trữ một ứng dụng sản xuất cần có sẵn cho khách hàng. Việc chạy không tải miễn phí cho phép Heroku cung cấp cấp độ này để phát triển / thử nghiệm mà không phải trả chi phí lớn cho các máy chủ đang chạy liên tục.
drowe

29
Cũng tốt cho một trang web "sản xuất" có lưu lượng truy cập thấp và không có khách hàng trả tiền, mà bạn không muốn đợi ba mươi giây để tải trang đầu tiên.
alxndr

2
Bạn đã đúng, nhưng có nhiều lý do hợp lệ cho việc chỉ chạy một dyno ... Chẳng hạn như có một điều phối viên duy nhất với một số trạng thái trong bộ nhớ ...
jonasfj

17
Bạn không biết nhiều về ứng dụng của anh ấy nên tôi nghĩ nhận xét của bạn khá cân nhắc.
wobbily_col

60

Bạn cũng có thể dùng thử http://kaffeine.herokuapp.com (do tôi tạo), nó được tạo ra để ngăn ứng dụng Heroku đi ngủ. Nó sẽ ping ứng dụng của bạn sau mỗi 10 phút để ứng dụng của bạn không đi ngủ. Nó hoàn toàn miễn phí.


1
Có thể loại bỏ herokuapp của bạn khỏi dịch vụ của bạn?
sao băng

2
Nó không chấp nhận các ứng dụng mới nữa. Trang GitHub của nó chứa một số vấn đề về điều đó. Câu trả lời này có thể được coi là lỗi thời.
nickolay.laptev

45

Bạn có thể sử dụng http://pingdom.com/ để kiểm tra ứng dụng của mình; nếu được thực hiện mỗi phút hoặc lâu hơn, heroku sẽ không nhàn rỗi ứng dụng của bạn và sẽ không cần phải quay vòng.


2
Thật khó để quyết định giữa hai câu trả lời! Cuối cùng tôi đã đi với Newrelic vì tôi đã có một tài khoản ở đó. Cảm ơn rất nhiều vì lời đề nghị tuyệt vời này - nó thực sự đã giải quyết vấn đề của tôi. :) +1.
sscirrus

2
Tại sao làm điều đó mỗi phút? Như bạn có thể thấy trong câu trả lời của @ newe1344, Heroku quay xuống dyno sau một giờ không hoạt động. Vì vậy, chắc chắn pining cứ sau 59 phút là hiệu quả hơn?
Darwin Tech

2
Nó báo cáo khi nó xuống, vì vậy tần số phút hoạt động tốt cho cả việc ngăn chặn giấc ngủ và báo cáo thời gian chết
Jesse Wolgamott

Tôi không nghĩ rằng nó (vẫn?) Miễn phí.
rahulserver

@rahulserver - Bạn đã đúng, Pingdom không còn có tài khoản miễn phí.
John Lehmann

40

Câu trả lời dễ dàng - nếu bạn coi trọng dịch vụ thì hãy trả tiền cho nó.

Tất cả những 'thủ thuật' này để có được lợi ích của dịch vụ trả phí ... về cơ bản, nó giống như ăn cắp cáp. Nghi vấn để thậm chí liệt kê chúng ở đây. Điều gì tiếp theo, thủ thuật làm thế nào để cướp biển trò chơi?

Giống như một poster khác ở đây, tôi đánh giá cao dịch vụ miễn phí để phát triển và thử nghiệm và tôi sẽ rất khó chịu với tất cả các loại người khiếm khuyết về đạo đức nếu Heroku không dùng nó vì có quá nhiều người bán hàng tự do. Tôi chỉ không nghĩ rằng anh ta đủ trực tiếp trong những lời chỉ trích.


14
Đó là một dịch vụ trả phí, với các điều khoản nhất định. Tại sao không tối ưu hóa việc sử dụng dịch vụ của bạn trong các điều khoản đó để tận dụng tối đa dịch vụ này?
pkinsky

8
Vâng tôi tin rằng tôi đã chỉ ra lý do, nhưng để đánh vần nó xa hơn một chút - mục đích sử dụng của lưu trữ miễn phí là rõ ràng. Và lợi thế của 'luôn luôn bật' là một lợi ích của việc trả tiền thậm chí chỉ là số tiền nhỏ cho một công nhân thứ hai. Tất cả các khai thác ở đây liên quan đến việc tiêu tốn tài nguyên vô ích để thoát khỏi việc trả tiền cho một dịch vụ. Đó là hành vi đáng xấu hổ. Tại sao tôi phải quan tâm? Bởi vì nếu họ chán ngấy, việc họ sẽ bỏ đi với dịch vụ miễn phí, được sử dụng như dự định, có giá trị lớn đối với tôi.
elc

2
Được rồi chỉ để làm rõ cho bạn downvoters lái xe, anh ta không chỉ hỏi "Có cách nào xung quanh nó?" ông cũng hỏi "Tôi có nên trả tiền không ..." Đây là những gì tôi đang trả lời. Đó là câu hỏi cơ bản hơn. Chắc chắn có rất nhiều cách dễ dàng để bỏ qua. Họ đã sai về mặt đạo đức, vì vậy, tốt nhất là lãng phí thời gian để nêu chi tiết về họ ở đây, và được cho là tồi tệ hơn đáng kể vì nó cấu thành cho phép và khuyến khích hành vi kém.
elc

4
Đó là một chút phản ứng thái quá. Chúng tôi triển khai để heroku trong khi thử nghiệm. Khi khách hàng của chúng tôi truy cập trang web khi nó không hoạt động, họ cho rằng có gì đó không đúng với ứng dụng chúng tôi đã phát triển để kết nối với dịch vụ. Giữ cho trang web tồn tại vì mục đích đáp ứng để giới thiệu một ứng dụng có thể không bao giờ thấy ánh sáng trong ngày là điều phi đạo đức. Âm thanh như một niềm tin cá nhân, không phải đạo đức. Nếu nó không vi phạm các quy tắc hoặc luật pháp, giả định đạo đức của bạn là điều duy nhất sai . Freemium là một mô hình kinh doanh hợp pháp. Bạn có thể "tận dụng" phần miễn phí đó. Đó là mong đợi.
Matt Long

1
Vì vậy, lời biện minh của bạn là "mọi người khác đang làm điều đó" Đó không thực sự là một cuộc tranh luận mới. Hoặc một trong những thuyết phục. chỉnh sửa Xin lỗi, bạn đã đưa ra một điểm hợp lệ đối với một số người. Rằng những gì đang được thực hiện không bị cấm rõ ràng vì vậy nó không sai. Tôi biết có những người tin rằng 'những gì không bị cấm rõ ràng đều được phép' và đưa nó đi xa hơn để nói rằng nó không chỉ được phép mà còn 'không sai'. Toàn bộ thái độ đó là những gì tôi sẽ dán nhãn phản ứng thái quá theo cách rất tự phục vụ. Nhưng nó đi xuống một sự khác biệt triết học cơ bản.
elc

30

Đã thử nghiệm và làm việc trên ứng dụng Heroku của riêng tôi bằng Node.js 0.10.x vào ngày 28/6/2013

var http = require('http'); //importing http

function startKeepAlive() {
    setInterval(function() {
        var options = {
            host: 'your_app_name.herokuapp.com',
            port: 80,
            path: '/'
        };
        http.get(options, function(res) {
            res.on('data', function(chunk) {
                try {
                    // optional logging... disable after it's working
                    console.log("HEROKU RESPONSE: " + chunk);
                } catch (err) {
                    console.log(err.message);
                }
            });
        }).on('error', function(err) {
            console.log("Error: " + err.message);
        });
    }, 20 * 60 * 1000); // load every 20 minutes
}

startKeepAlive();

2
Theo quan điểm của tôi, giải pháp tốt nhất, vì nó không phụ thuộc vào bất kỳ dịch vụ bên thứ ba nào. Cảm ơn :)
electronix384128

Dường như nó không tránh khỏi việc đi ngủ. Nhưng nó hoạt động để tự động đi lên một lần nữa. Tôi không biết hành vi này có phải do thay đổi hay không, thực ra giải pháp của bạn đến từ gần hai năm trước.
jgato

20

Tôi sử dụng addon Heroku lên lịch do Heroku cung cấp miễn phí. Sau khi thêm, đơn giản là tạo một công việc với 'curl http://yourapp.herokuapp.com ' và khoảng thời gian 10 phút.


11

Nó nói trong tài liệu Heroku rằng có nhiều hơn 1 web dyno sẽ không bao giờ nhàn rỗi. Có thể là một giải pháp rẻ hơn 0,09 đô la / giờ như Pierre gợi ý.

nhập mô tả hình ảnh ở đây

Tài liệu


6
Bổ trợ Heroku có phiên bản tiêu chuẩn miễn phí.
sscirrus

9

Tôi đã viết ra các bước:

➜ Thêm gem 'newrelic_rpm' vào Gemfile của bạn trong quá trình dàn dựng & sản xuất
cài đặt gói
➜ Đăng nhập vào bảng điều khiển heroku và thêm addon mới
Sau khi thêm, hãy thiết lập tự động ping vào trang web của bạn để nó không bị nhàn rỗi
➜ Duyệt đến Menu> Giám sát tính khả dụng trong Cài đặt) → Nhấp vào Bật Bật tính năng giám sát sẵn có ”
Nhập url để ping (ví dụ: http://spokenvote.org )
Chọn 1 phút cho khoảng thời gian


3
Cảm ơn quý vị. FYI nếu bạn ping ứng dụng của mình mỗi phút, bạn sẽ sử dụng hết băng thông mà không có bất kỳ lợi ích nào khi không sử dụng. Trừ khi bạn có một lý do khác, nó an toàn để thu nhỏ lại.
sscirrus

Cảm ơn lời đề nghị @sscirrus
Pratik Khadloya

3
Heroku sẽ chỉ đặt dyno của bạn ngủ sau 1 giờ không hoạt động, vì vậy bạn có thể thu nhỏ khoảng thời gian trở lại 1 giờ (hoặc có thể 50 phút để ở bên an toàn).
David Underwood

Câu hỏi: Bạn có biết phải thay đổi khoảng thời gian ping đó ở đâu không? Nó dường như không phải là một tùy chọn có sẵn trong cài đặt bảng điều khiển.
mishap_n

4

Tôi tìm thấy một trang web miễn phí khác sẽ liên tục ping trang web của bạn được gọi là Unidler

http://unidler.herokuapp.com /

Tương tự như pingdom, nhưng không cần phải đăng nhập.


Làm thế nào để loại bỏ sau khi thêm?
Lekr0

3

Lưu ý rằng các loại dyno mới ( hiện đang trong giai đoạn thử nghiệm , đến vào tháng 6 năm 2015) sẽ cấm giữ cho một dyno miễn phí thức dậy 24/7, vì nó sẽ phải ngủ ít nhất 6 giờ mỗi ngày.

Vì vậy, hãy cố gắng loại bỏ bất kỳ giải pháp nào bạn tìm thấy trong chuỗi này trước khi nó xuất hiện (hoặc trả tiền cho dịch vụ bạn thực sự sử dụng).


3

Nếu bạn có quyền truy cập vào máy chủ unix luôn hoạt động, bạn có thể đặt công việc định kỳ GETcho trang web của mình. Theo các điều khoản mới của gói miễn phí, có thể bạn sẽ muốn vô hiệu hóa GETs vào ban đêm, sử dụng một dòng trong crontab của bạn như thế này:

*/20 8-22 * * * /usr/bin/curl domain.com &> /dev/null

Điều này hướng dẫn curlcho GETdomain.com cứ sau 20 phút trong khoảng thời gian từ 8 đến 22.

Hãy nhận ra rằng

  1. Không phải ai muốn xem trang web của bạn cũng sống trong múi giờ của bạn và
  2. Trang web của bạn có thể nhận được các yêu cầu khác vào giữa đêm, đánh thức dyno của bạn và gây ra một giờ sử dụng khác cho mỗi yêu cầu. Ngay cả khi không có ai biết tên miền của bạn, vẫn có bot và trình thu thập thông tin hoạt động mọi lúc. Do đó, bạn nên đặt quy trình được xác định trong crontab của mình chỉ hoạt động trong 14 đến 16 giờ để cung cấp bộ đệm chống lại những sự thức tỉnh này

Ngoài ra, đảm bảo thời gian hệ thống của bạn được thiết lập đúng để cửa sổ thời gian xuống xảy ra khi bạn mong đợi.


3

Hầu hết các câu trả lời ở đây đã lỗi thời hoặc hiện không hoạt động. Cấp miễn phí hiện tại cho các tài khoản cá nhân được cung cấp cơ sở 550 giờ dyno miễn phí mỗi tháng.

Và một tài khoản miễn phí được xác minh cung cấp cho bạn 1000 giờ dyno miễn phí. Tôi đã viết một bài viết về cách tôi làm cho ứng dụng miễn phí của mình tỉnh táo.

https://link.medium.com/uDHrk5HAD0

Hy vọng nó sẽ giúp bất cứ ai đang cần một giải pháp trong năm 2019


2

công việc này đối với tôi trong một ứng dụng mùa xuân thực hiện một yêu cầu http cứ sau 2 phút đến đường dẫn url gốc `

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.client.RestTemplate;

public class HerokuNotIdle {

private static final Logger LOG = LoggerFactory.getLogger(HerokuNotIdle.class);

@Scheduled(fixedDelay=120000)
public void herokuNotIdle(){
    LOG.debug("Heroku not idle execution");
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getForObject("http://yourapp.herokuapp.com/", Object.class);
}
}

Nhớ cấu hình bối cảnh của bạn để kích hoạt trình lập lịch biểu và tạo bean cho trình lập lịch biểu của bạn

@EnableScheduling
public class AppConfig {

@Bean
public HerokuNotIdle herokuNotIdle(){
    return new HerokuNotIdle();
}
}


1

Tôi có một ứng dụng chỉ cần chạy từ thứ hai đến thứ sáu vào giờ ăn trưa. Tôi vừa thêm đoạn script sau vào crontab tại nơi làm việc:

#!/bin/sh
# script to unidle heroku installation for the use with cronjob
# usage in crontab:
# */5 11-15 * * 1-5 /usr/local/bin/uptimer.sh http://www.example.com
# The command /usr/local/bin/uptimer.sh http://www.example.com will execute every 5th minute of 11am through 3pm Mondays through Fridays in every month.
# resources: http://www.cronchecker.net
echo url to unidle: $1
echo [UPTIMER]: waking up at:
date
curl $1
echo [UPTIMER]: awake at:
date

Vì vậy, đối với bất kỳ ứng dụng nào, chỉ cần thả một dòng khác trong crontab của bạn như:

*/5 11-15 * * 1-5 /usr/local/bin/uptimer.sh http://www.example.com

1

Tôi nghĩ cách khắc phục dễ dàng nhất là tự ping máy chủ của mình sau mỗi 30 phút. Đây là mã tôi sử dụng trong dự án node.js của mình để tránh ngủ.

const request = require('request');
const ping = () => request('https://<my-app-name>.herokuapp.com/', (error, response, body) => {
    console.log('error:', error); // Print the error if one occurred
    console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
    console.log('body:', body); // Print body of response received
});
setInterval(ping, 20*60*1000); // I have set to 20 mins interval

1

Thêm một giải pháp làm việc nữa: wokeDyno Đây là một bài đăng trên blog về cách thức hoạt động của nó: Nó được tích hợp trong ứng dụng rất dễ dàng:

/* Example: as used with an Express app */

const express = require("express")
const wakeDyno = require("woke-dyno");

// create an Express app
const app = express();

// start the server, then call wokeDyno(url).start()
app.listen(PORT, () => {
    wakeDyno(DYNO_URL).start(); // DYNO_URL should be the url of your Heroku app
});

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.