Heroku Scheduler または Worker dynoを使ってHerokuで定期実行する方法

Herokuでcron的なことをやりたいと思って調べてみると2種類あることがわかりました。

ひとつは「Heroku Schedule」アドオン、もう一つは 「Worker dyno」を使ったバックグランドジョブです。

「Heroku Scheduler」アドオン

「Heroku Scheduler」というアドオンを使って、cron的にやる方法です。

10分ごと、1時間ごと、1日ごと(30分ごとの時間指定)に起動するスクリプトを指定することができます。これ以外の起動タイミングを選ぶことはできないようです。

このスクリプトでかかった実行時間は、無料dyno時間を消費します。

詳しい手順は以下を参照してください。

Heroku Scheduler でnode.jsを動かす(追記:worker) - Qiita
Heroku Scheduler でnode.jsを動かす目的Heroku schedulerでnode.jsの定時実行を行いたい前提動作確認環境Windows10, VSCodeNode v8.11...

「Worker dyno」を使ったバックグランドジョブ

Worker dynoを使ってバックグランドジョブを作成する方法です。

Worker dynoは24時間常駐となるため、その分だけ無料dyno時間を消費します。
私のようにプロジェクトの中に24時間稼働の「Web dyno」が常駐している場合は、残り1日8時間程度しか余裕がないので、workerを選択することはできません。
逆に、workerだけのプロジェクトであれば、この方法も良いと思います。

タイマー管理を自前でやってもよいのですが、cron的な設定で書けるNodeモジュール「node-cron」が便利なのでインストールします。

%npm i node-cron

%npm list
├── node-cron@3.0.1

サンプル書いて試しに実行してみるとエラーがでました。
uuidモジュールがないとのことなので、uuidモジュールもインストール。

worker.js
const cron = require('node-cron');
cron.schedule('* * * * *', () => console.log('毎分実行'));
% node worker.js  
node:internal/modules/cjs/loader:959
  throw err;
  ^

Error: Cannot find module 'uuid'
% npm i uuid

added 1 package, and audited 131 packages in 513ms

% npm list  
├── node-cron@3.0.1
└── uuid@8.3.2

無事実行できました。

% node worker.js
毎分実行
毎分実行

node-cronの書き方は以下が参考になります。

Node.jsで定期実行メモ - Qiita
毎回忘れるので自分用メモです。Node Cronを使います。準備$ npm init -y$ npm i node-cronCronの書式 # ┌────────────── second (option...

Worker Dynoについてはこちらの公式ページが詳しいです。

Worker dyno、バックグラウンドジョブ、キューイング | Heroku Dev Center
キューイングは、スケーラブルな Web アプリを構築するための鍵です。重い処理を Web プロセスから切り離し、アイテムをバックグラウンドプロセスのキューに入れます。

どっちを使ったか

workerを常駐するには無料dyno時間が足りないので、schedulerを採用しました。

コメント

タイトルとURLをコピーしました