얼마전에 CORS-Anywhere를 자체적으로 띄우기 위해서 헤로쿠를 이용했었는데요. 이게 자꾸 지 혼자 잠이 들어서 해당 서비스를 처음 호출할때 처음에 2~30초간에 서비스를 깨우는 시간인 일명 웨이크업 타임이 필요하게 되는데요. 이는 30분간 아무 트래픽이 없으면 헤로쿠가 이 앱을 재워버리기 때문입니다.
이것저것 방법을 생각해봤는데요. 별도의 서버에서 이 헤로쿠 서버에 주기적으로 웹 리퀘스트를 날려줄 수 있는 방법으로 집에 있는 PC에서 해야하나 aws 서버에서 해줘야 하나, 주기적으로 날려줄수 있는 function 서비스 같은걸 알아봐? 하면서 이것저것 고민을 하다가...
1. 24시간 헤로쿠 깨어있게 만드는 방법
자기 자신의 도메인을 호출하면 된다는 걸 깨닫고 소스에 세줄 정도 추가했습니다;;;
setInterval을 이용한 10분마다 호출하기
▼▼▼
var http = require("http");
setInterval(function() {
console.log("every 10 minutes (600000)");
http.get("http://[your-heroku domain].herokuapp.com");
}, 600000); // every 10 minutes (600000)
이렇게 하면 자신의 서버를 10분마다 부르게 되니까 아마 지속적으로 깨어있게 되겠죠.
2. 그런데 헤로쿠의 Free dyno 가용시간은?
하지만 이렇게 되면 헤로쿠의 Free dyno에 대해서 궁금해지게 됩니다. 이녀석 한달동안 계속 깨어있을 수 있는 사용시간이 서비스 되는놈이었던가?
헤로쿠 홈페이지에서 찾아봅니다.
Usage
Free dyno hour pool
개인 계정에는 매월 550 개의 무료 dyno 시간이 제공됩니다. 이 기본 시간 외에도 신용 카드로 확인하는 계정 에는 월간 무료 dyno 할당량에 450 시간이 추가로 추가됩니다 . 즉, 신용 카드로 계정을 확인하면 한 달에 총 1000 개의 무료 dyno 시간을받을 수 있습니다.
특정 달에 모든 무료 dyno 시간을 사용하면 계정의 모든 무료 앱이 한 달 동안 휴면 상태가됩니다.
뭐 이렇다는 군요. 일단 앱이 아니라 계정에 시간이 부여되고 신용카드를 등록하는 경우 450시간을 추가로 부여한다고 합니다. 즉, 신용카드를 등록하면 무료로 한달을 풀로 쓸수 있는 계정을 준다는 얘기입니다.
대충 한달이 24 * 30 = 720 시간 정도 될테니까요.
2.1 헤로쿠 Free dyno 남은 시간 확인 방법
남은 시간을 heroku-cli나 대시보드로 확인할 수 있다는데?
1) 남은 시간 heroku-cli 확인 방법
$ heroku ps -a <app name>
650 free dyno hours (65%) used
350 hours remaining
=== web (Free): bundle exec puma -C config/puma.rb (1) web.1: idle 2016/05/16 15:51:45 -0700 (~ 22h ago)
2) 남은 시간 대시보드 확인 방법
3. 헤로쿠 주간에만 깨우는 방법
신용카드 등록 없이 주간에만 일어나게 싶은데?
난 신용카드 등록없이 주어진 550시간에서 쓰고 싶다면 트래픽이 주로 발생하는 주간 시간대인 아침 8시부터 밤인 23시까지 살아있게 하면 500시간이 좀 안되는 시간만 사용할 수 있습니다. 새벽에도 가끔 들어오는 트래픽은 깨우는 시간을 기다려서 사용하게끔 그냥 놔두는 걸로 해야겠습니다. 그러면 550시간 언더로 충분히 한달동안 가용 가능할거란 생각이 듭니다.
제 헤로쿠에는 node로 돌아가고 있으니까 node-cron을 사용하면 될 것 같습니다. 다른 언어에도 비슷한 스케줄러들이 많이 있으니까 비슷한 방법을 사용하면 됩니다.
일단 node-cron을 이용할거니까 설치해주시고...
node-cron 설치
▼▼▼
$ npm install node-cron --save
그리고 node-cron을 이용하는 가장 기본적인 샘플을 돌려봅니다. 동작을 확인해봐야죠.
node-cron 샘플
▼▼▼
const cron = require('node-cron');
// second minute hour day-of-month month day-of-week
cron.schedule('* * * * *', function(){ console.log('node-cron'); });
실행을 하게 되면 node-cron이라는 메세지가 분 단위로 나오게 될거거든요.
cron의 시간 설정은 앞에서부터 '초(생략), 분, 시, 일, 월, 요일'입니다. 저는 30분간 요청이 없으면 죽는 헤로쿠를 위해서 20분마다, 그리고 아침 8시부터 23시까지 요청을 날려줄 생각입니다.
*/20 8-23 * * *
3.1 헤로쿠는 US 시간 기준이다.
이렇게 설정해주면 되는데요. 주의할 점이 하나 있죠. 바로 헤로쿠는 US 리전이고 시간도 US 기준으로 돈다는 겁니다. 지금도 헤로쿠에 접속해서 서버 로그 상으로 시간을 확인해보세요.
한국시간보다 대략적으로 9시간 정도 이전으로 돕니다. 그렇다면 23시부터 오후 14시 정도까지 깨어나있게 변경해야되는것이죠.
그래서 코드는 아래와 같이 최종적으로 반영했습니다.
미국시간으로 23시부터 오후 14시까지 우리 시간으로는 대략적으로 아침 8시부터 23시까지 매 20분 마다 헤로쿠 서버를 깨어있게 해주는 스크립트입니다.
const http = require("http");
const cron = require('node-cron');
// second minute hour day-of-month month day-of-week
cron.schedule('*/20 23,0-14 * * *', function(){
console.log('node-cron');
http.get("http://cors-nhj12311.herokuapp.com");
});
4.다른 서비스를 사용해서 살려놓는 방법
아래 서비스에서 내 주소를 등록해놓으면 30분 마다 해당 주소를 호출해준다고 합니다.
이 서비스 자체가 헤로쿠에 있다 보니까 왠만해서는 죽을 일은 없겠지요?
우선은 이렇게 해서 헤로쿠를 항상 깨어있게 하는 방법에 대해서 정리해봤습니다. 일단 저는 신용카드를 등록하지 않고 24시간이 아니라 하루에 15시간 정도 주간 시간에만 깨워져있는 방법으로 주 트래픽이 발생하는 주간 시간만을 깨우는 방법을 찾아서 등록했습니다. node-cron을 이용해서요. 헤로쿠의 프리 Dyno가 US 리전이기 때문에 US 시간에 맞춰서요.
이 글을 찾아보시는 분들도 자기자신한테 맞는 그런 방법을 찾으셔서 헤로쿠를 잘 깨어있게 해보시길 바랍니다. 감사합니다.
'dev > node.js' 카테고리의 다른 글
형태소 분석(node.js, mecab) (0) | 2021.07.10 |
---|---|
These dependencies were not found - tls, net in ./node_modules/.../...js (0) | 2021.05.10 |
nuxt.js + vuetify 개발 환경 설정하는 방법 (0) | 2021.03.31 |
node 스케줄러 - cron vs node-cron vs node-schedule 비교 (0) | 2021.03.06 |
헤로쿠(heroku) 가입부터 node.js 배포까지 (5) | 2021.01.13 |
vscode node.js 실행(launch.json 및 env 설정) (0) | 2020.04.25 |
Nodejs 8+ Cannot debug JavaScript via Nodeclipse (Failed to connect to Standalone V8 VM) (2) | 2020.01.03 |
node.js 버전 업데이트(리눅스, 우분투, 윈도우) (0) | 2020.01.03 |