障害処理を目的とした依存度ゼロのJavaライブラリであるFailsafeが、バージョン2.0をリリースした。レジリエンスポリシ構造に加えて、独自のポリシサービスプロバイダが可能なプラグインアーキテクチャをサポートする。Failsafe 2.0の実行に必要なJavaの最小バージョンは、Java 8である。
このライブラリは、Javaアプリケーションの障害を処理するための、フルーエントでフレキシブルなAPIを提供する。これは、構成可能なレジリエンスポリシ内に、実行可能コードブロックをラップすることで実現されている。リリースノートによると、バージョン2.0では、改善、動作の変更、APIの変更、APIの追加が行われている。
Failsafeは、リトライポリシ、サーキットブレーカポリシ、フォールバックポリシという、おもに3つのレジリエンスポリシを提供する。
リトライポリシは、実行可能コードブロックの再試行が必要な障害シナリオを定義する。APIには、許容される最大再試行回数、試行間の待機期間、指数バックオフなど、多数の構成オプションがあり、開発者による微調整を可能にしている。
次のコードは、3回再試行するように設定されたリトライポリシを示している。
RetryPolicy<Object> retryPolicy = new RetryPolicy<>() .handle(SocketException.class) .withDelay(Duration.ofSeconds(2)) .withMaxRetries(3); Failsafe.with(retryPolicy).run(() -> connect());
サーキットブレーカポリシは、超過時にコードブロックの実行を停止させる、しきい値のセットを定義可能にするもので、システムのフェイルファースト(Fail Fast)を支援すると同時に、障害の連鎖やシステムの過負荷の防止に役立つ。サーキットブレーカでは、閉、開、半開という、3つの状態を切り替える。
起動時の状態は、コードブロックが通常どおり実行される"閉"である。実行障害数が事前に設定されたしきい値に達すると、サーキットブレーカは"開"状態に移行する。コードの実行は中止され、それ以降の試行は"CircuitBreakerOpenException"例外で失敗するようになる。"開"状態で指定された時間が経過すると、サーキットは"半開"になり、再び閉じるか開くかを決定するために、数回の実行が許可される。
サーキットブレーカはまた、現在の状態で記録された、成功と失敗の数をメトリックとして提供する。
次のコードは、実行が5回連続で失敗したとき"開"になり、1分間経過した後、2回の連続した実行が成功すると"閉"になるように設定されたサーキットブレーカを示している。
CircuitBreaker<Object> circuitBreaker = new CircuitBreaker<>() .handle(SocketException.class) .withFailureThreshold(5) .withSuccessThreshold(2) .withDelay(Duration.ofMinutes(1)); Failsafe.with(circuitBreaker).run(() -> connect());
フォールバックポリシでは、障害が発生したときに実行すべき代替処理を記述する。このポリシは、例外を抑制してデフォルト結果を提供したり、カスタム例外をスローしたりするために使用できる。
次のコードは、障害発生時に別のメソッドを実行するように構成された、フォールバックポリシーを示している。
Fallback<Object> fallback = Fallback.of(this::connectToLocal);
任意のレジリエンスポリシを適切な方法で組み合わせて、新たなポリシを作成することができる。一般的な構成では、最も外側のポリシとしてフォールバックポリシを、最も内側のポリシとしてサーキットブレーカポリシーを使用し、その2つの間にリトライポリシを挿入する。
Failsafe.with(fallbackPolicy, retryPolicy, circuitBreaker);
これら組み込みポリシに加えて、Failsafe 2.0では、独自のポリシをプラグインするためのポリシSPIを提供している。さらにライブラリでは、設定可能な実行スケジューラ、イベントリスナ、非同期実行サポート、実行追跡など、いくつかの追加機能も提供している。
現在のバージョンは、先月GitHubでリリースされたFailsafe 2.0.1である。