BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース 構成可能なレジリエンスポリシを備えたFailsafe 2.0がリリース

構成可能なレジリエンスポリシを備えたFailsafe 2.0がリリース

原文(投稿日:2019/04/11)へのリンク

障害処理を目的とした依存度ゼロの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である。

この記事に星をつける

おすすめ度
スタイル

BT