2025/07/28 18:23 Replacing cron jobs with a centralized task scheduler

やあ、ロボ子。今日のITニュースは、Heartbeat社がタスクスケジューリングシステムを刷新した話じゃ。

Heartbeat社ですか。どのようなシステムを構築したのでしょう?

以前はcronスクリプトをたくさん使ってタスクを管理していたらしいのじゃ。でも、管理が大変になって、一元管理システムを作ったそうじゃ。

cronジョブをたくさん管理するのは大変ですよね。新しい機能を追加するたびにジョブが増えていく、と。

そうそう。それに、タスクが実行されなかったときに、原因を突き止めるのが大変だったみたいじゃ。顧客から「タスクが実行されてない!」って報告が来たら、ログとコードを隅々まで調べる必要があったらしいぞ。

それは大変ですね。それで、新しいシステムではどう変わったんですか?

`ScheduledTasks`というデータベーステーブルを作って、タスクの種類を`payload`で区別するようにしたらしいのじゃ。タスクをスケジュールするときは、新しい`ScheduledTask`をデータベースに挿入するだけ。

データベースで管理するんですね。そして、cronジョブは1分ごとに実行されるようにして、スケジュールされたタスクを実行する、と。

その通り!cronジョブは、ステータスが`Completed`でなく、タイムスタンプが現在時刻+30秒未満のタスクを取得して、優先度でソートして、ステータスを`Executing`に更新するのじゃ。

`Executing`にするんですね。そして?

各タスクに対してAWS SQSメッセージを作成するのじゃ!SQSコンシューマーがメッセージをリッスンして、`payload`を読み取り、対応する関数を呼び出してタスクを実行する。タスクが終わったら、データベースで完了としてマークする。

SQSを使うことで、非同期にタスクを実行できるんですね。再試行ロジックも組み込まれているとのことですが?

そうじゃ!それに、タスクによっては、新しいスケジュールされたタスクを返すものもあるらしいぞ。例えば、定期的なイベントのリマインダーを送信した後、次のリマインダーをスケジュールするとか。

なるほど。変更があった場合はどうするんですか?

変更がエンティティに加えられた場合は、対応するスケジュールされたタスクも更新する必要があるのじゃ。編集可能なタスクには一貫したIDを使って、新しいタスクを作成する代わりにupsertを実行する。

upsertですか。ユーザーが直接編集できないタスクにはuuidを使うんですね。

その通り!このシステムのおかげで、作業を一箇所に集中できるし、再試行が自然に処理されるし、実行されるすべてのタスクの記録が残るし、新機能の実装が簡単になるらしいぞ。

`expirationInMinutes`と`expectedExecutionTimeInMinutes`フィールドもあるんですね。

`expirationInMinutes`は期限切れのタスクを制御するために、`expectedExecutionTimeInMinutes`は`Executing`状態のままになっているタスクの再試行を処理するために使うのじゃ。

とてもよく考えられたシステムですね!

じゃろ?ところでロボ子、タスクスケジューリングといえば、私の部屋の掃除タスク、そろそろスケジュールしないと…。

博士、それは最優先タスクですね!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
