比較的新しいJVMジョブスケジューリングツールであるJobRunrは、遅延や反復などのジョブスケジュール管理を、わずか1行のJavaラムダで可能にする。
JobRunrは、ジョブの詳細な情報をStorageProvider
インターフェース経由で保存することにより、主要なSQLデータベースやNoSQLデータベースをすべてサポートしている。この方法により、例外が発生した場合には、指数バックオフポリシを使用してバックグラウンドジョブを再スケジュールするという、フォールトトレラントをデフォルトで実現する。他のジョブを一切ロックしないので、ジョブを他のマシンに分散して処理することが可能である。
JobRunrは先週、バージョン4.0をリリースした。Spring Boot Starterサポートが最新になり、QuarkusとMicronautとのインテグレーションが加えられた他、ジョブをキャッシュすることで以降の呼び出しを高速化可能かどうかをチェックするジョブ分析パフォーマンスモードが新たに用意されている。
さらに、ジョブ監視が可能なダッシュボードも組み込まれている。
中心的な開発者であるRonald Dehuysser氏が、最新リリースについて説明してくれた。
InfoQ: JobRunrを開発しようと思ったきっかけは何でしたか?
Dehuysser: プロとして開発を続けている中で、数ギガバイトのデータを対象として、実行に時間を要する、非常に難しい計算処理を扱うことが何度かあったのですが、この種の計算処理を行う上で、クリーンなコードで確実にジョブを実行してくれるような、適当なJavaフレームワークが存在しなかったからです。
もうひとつのユースケースは、プッシュ通知をサポートしていないレガシシステムからのデータのインポートです。ロードバランスされた環境では、これはかなり難しい作業になります。ひとつのノードで行うべきであるのに、すべてのノードが新たなデータをチェックするからです。
Spring BatchやQuartzといったものはありますが、これらのフレームワークはどれも、単に長時間実行するタスクを実行するという目的に対して、独自のインターフェースを実装する必要があったり、非常に大きなオーバーヘッドを発生させたりします。
JobRunrは、任意のJava 8ラムダを受け入れて解析し、ジョブ情報をSQLあるいはNoSQLデータベースに格納することで、この問題をすべて解決します。定義されたジョブは、即時実行、指定時間に実行、あるいはCronの記述方法を使って反復的に実行、というようなスケジュールが可能です。
ジョブはデータベースに格納されるとすぐに、他のサーバ上でも並行的に処理できるようになります。これによって、ジョブの実行に必要な総時間を少なくすることができるのです。内部的に楽観ロック(optimistic locking)を使用しているので、各ジョブが実行されるのは1回のみです。
また、どのようなソフトウェアアーキテクチャであっても問題の発生する可能性はありますし、実際に問題は発生するのですが、このような場合にもJobRunrは、スマートなバックオフポリシ(backoff policy)に従って失敗したジョブのリトライを実行するという形で支援します。
そして最後に、ジョブの実行状況を監視したいと思っていたので、ダッシュボードを加えることにしました。ジョブの進捗状況が視覚的に分かるため、ジョブがフェールした場合の根本原因を簡単に突き止めることができます。
InfoQ: JobRunrの今後の予定を教えてください。
Dehuysser: リリースされたばかりのJobRunr 4.0.0では、SpringやQuarkus、Micronautとのインテグレーションが強化されています。ジョブ分析用のキャッシュも新設されて、動作がさらに早くなりました。
JobRunrはオープンソースプロジェクトなので、コミュニティからの改善のためのアイデアを広く受け入れています。現在のアイデアとしては、アルゴリズムを改善(多変数マシンラーニングがベースになると思います)して、ジョブ全体をさらに高速化することなどがあります。
InfoQ: JobRunrについて他に、読者に伝えておきたいことはありますか?
Dehuysser: 3つのことを強調しておきたいと思います。
- JobRunrはジョブラムダを解析するために、ASM(SpringやHibernate、その他多くのフレームワークでも使用されています)を使っていくつかのマジックをします。ASMを使うことで私自身、JVMバイトコードに関して多くのことを学びました。バイトコードは想像していたほど難しくはありません。
- JobRunrはバイトコード解析を行うので、Oracle Quality Outreachプログラムにも参加しています。これは、JobRunrがJVMの今後のリリースに対してテストされる、ということです。このおかげで、JobRunrが今後のJavaリリースでも動作し続けることができますし、JVM自体のバグについてコミュニティが早期に情報を得る上でも役に立つと思います。
- サポートや追加機能が必要なユーザには、JobRunr Proも用意しています。JobRunrをベースに、さまざまな優先度のキュー(高い優先度のジョブを低い優先度のジョブより先に実行する)やジョブチェーン、アトミックバッチ、検索機能を加えた高機能なダッシュボードといった機能を加えたものです。
販売されたライセンスについては、収益の5パーセントをteamtrees(訳注:植樹を行う募金活動)に寄付する計画です。
JobRunrの比較対象となる他のツールとしては、QuartzやSpring(スケジューリングサポート)などが考えられる。JobRunrはオープンソースで、LGPLv3ライセンス下で商用目的での利用が可能である。プライオリティキューやジョブチェーンなどの機能を加えたPROバージョンも提供されている。