目次
2.1、Hystrixコマンド(HystrixCommand)
2.2、Hystrix スレッド プール (HystrixThreadPool)
2.3、Hystrix ヒューズ (Hystrix サーキットブレーカー)
3.3.1. Hystrix Dashboard 依存関係パッケージをアプリケーションに追加する
3.3.2. コード内での @HystrixCommand の使用
3.3.3. メインクラスで Hystrix ダッシュボードを起動します。
1. ハイストリックスとは何ですか?
公式ウェブサイトのアドレス: https://github.com/Netflix/Hystrix.git
私のダッシュボードのアドレス: https://github.com/woyouyitouchenfeijv/Hystrix.git
1.1 Hystrixの背景と目的
現在のマイクロサービス アーキテクチャにおける重要な問題は、サービス間の呼び出しによって大量の遅延やエラーが発生し、アプリケーション全体のパフォーマンスと信頼性に影響を与えることです。この問題を解決するために、Netflix は Hystrix と呼ばれるライブラリを開発しました。これは、分散システムで避けられない遅延や障害に対処するのに役立つ耐障害性を実現するメカニズムを提供します。Hystrix は、分離テクノロジー、サーキット ブレーカー モード、リソース プールなどのテクノロジーを使用して、分散システムに高可用性と高性能のソリューションを提供します。
1.2. Hystrix の機能と利点
Hystrix はオープンソースのフォールトトレラント フレームワークであり、主に分散システムにおけるサービスの融合、サービスの低下、スレッド プールの分離などの側面で使用されます。Hystrix の機能と利点は次のとおりです。
サービスの融合: Hystrix は、サービス雪崩を防ぐために、リクエストの失敗率とリクエストの総数に基づいて、利用できないサービスを自動的に融合できます。
サービスの低下: Hystrix は、サービスが利用できない場合にシステムの可用性を確保するために、フォールバック メソッドを通じて代替結果を返すことができます。
スレッド プールの分離: Hystrix は、サービスごとに独立したスレッド プールを使用してリクエストを処理し、アプリケーション全体の安定性がサービスのタイムアウトやエラーによって影響を受けるのを防ぎます。
リアルタイム監視: Hystrix は、サービス コールや障害を簡単に監視できるリアルタイム監視およびレポート機能を提供します。
適応制御: Hystrix は、システムの過負荷を防ぐために、サービスのトラフィックと同時実行性を適応的に制御できます。
プラグ可能性: Hystrix は、Spring Cloud、Netflix Eureka などの他のオープンソース フレームワークやテクノロジーと統合して、より豊富な機能とより高いパフォーマンスを提供できます。
2. Hystrixの基本コンセプト
2.1、Hystrixコマンド(HystrixCommand)
豊富なサービスコールの制御・管理機能を提供し、サービスコールの信頼性と安定性を実現しやすくするもので、サービスコールのロジックをカプセル化するためにHystrixが提供するクラスです。その主な機能は、サービス呼び出しリクエストを HystrixCommand オブジェクトにラップし、次の機能を提供することです。
タイムアウト制御: HystrixCommand によりタイムアウト時間を設定でき、サービスコール時間が指定時間を超えると、Hystrix はサービスコールを中断し、フォールバック応答を返します。
ヒューズ制御: HystrixCommand はサービス コールのヒューズ制御を実行できます。サービス コールの失敗率が指定されたしきい値を超えると、Hystrix はヒューズ保護をオンにし、サービス コール リクエストをフォールバック ロジックに転送し、サービス コール リクエストを一時的に停止します。
劣化制御: HystrixCommand はフォールバック ロジックを提供します。サービス コールが失敗するかタイムアウトになると、Hystrix は自動的にフォールバック ロジックを呼び出して応答を返し、失敗またはタイムアウトしたサービス コール リクエストをダウンストリーム サービスに転送して雪崩現象を引き起こすことを回避します。
統計: HystrixCommand は、サービス呼び出しリクエストの成功率、応答時間、エラー率などの情報をカウントできるため、開発者がサービス呼び出しリクエストのパフォーマンスと安定性を分析するのに便利です。
リクエストのキャッシュ: HystrixCommand はサービス コール リクエストをキャッシュして、サービス コール リクエストの繰り返しを回避し、システム パフォーマンスと応答速度を向上させることができます。
2.2、Hystrix スレッド プール (HystrixThreadPool)
コマンドを実行するために、各 Hystrix コマンド インスタンスに独立したスレッド プールを提供します。Hystrix では、コマンド実行のスレッドとコマンド呼び出しのスレッドが分離されているため、Hystrix スレッド プールの機能は、コマンド実行用に分離されたスレッド プールを提供することです。
Hystrix スレッド プールの構成は、スレッド プール サイズ、キュー サイズ、スレッド生存時間などのパラメーターを含め、HystrixThreadPoolProperties を通じて構成できます。スレッド プール サイズによって、同時に実行できるコマンドの最大数が決まり、最大数に達すると、それ以降のコマンドは拒否されます。キュー サイズは、スレッド プール内のすべてのスレッドがコマンドを実行しているときに、新しいコマンドが実行のためにキューに入れられることを意味します。キューがいっぱいの場合、後続のコマンドは拒否されます。スレッド生存時間は、アイドル状態のスレッドの最長生存時間を決定します。
Hystrix スレッド プールを使用する利点は、コマンドをより細かい粒度で分離および制御できるため、スレッド プールの枯渇やリソースの競合の問題を回避できることです。同時に、スレッド プール サイズとキュー サイズを調整することで、サービスの品質を確保しながらシステムのスループットとパフォーマンスを向上させることができます。
2.3、Hystrix ヒューズ (Hystrix サーキットブレーカー)
サービスの呼び出し元と呼び出し先の間の通信を保護するためのサーキット ブレーカー パターンを実装するために使用されます。ヒューズは、アプリケーションの連鎖的な障害を防ぐためのメカニズムです。エラーまたは異常が一定期間内に一定のしきい値に達すると、ヒューズは自動的に作動し、後続の要求を直接拒否し、一定期間内にプリセットに直接戻ります。サービスに対する多数の無効なリクエストの影響を回避するためのエラー応答。
HystrixCircuitBreaker は、Hystrix コマンドの実行を監視し、特定の戦略に従ってヒューズを開くかどうかを判断できます。ヒューズが開くと、Hystrix はリクエストを短絡し、呼び出しを行わなくなり、事前に設定されたエラー応答を直接返します。ヒューズが閉じると、Hystrix は通常のコール フローを再開します。
HystrixCircuitBreaker の実装は、HystrixCommand と HystrixThreadPool に依存しており、これら 2 つのコンポーネントの実行に従ってヒューズの状態を動的に調整します。HystrixCommand の実行失敗数がしきい値を超えるとヒューズが開き、HystrixCommand 実行の成功数がしきい値を超えるとヒューズが閉じます。
HystrixCircuitBreaker は、サーキット ブレーカーの動作をカスタマイズするために使用できるさまざまな構成パラメーターを提供します。たとえば、ヒューズが開いたときのスリープ時間、エラー率のしきい値、ウィンドウ期間などを設定できます。これらのパラメーターは、HystrixCommand および HystrixThreadPool のアノテーション、または構成ファイルを通じて構成できます。
3. ハイストリックスの使用
3.1、Hystrix 構成
3.1.1、コード構成
Hystrix の構成は非常に柔軟であり、特定のビジネス シナリオに応じて調整および最適化できます。
-
HystrixCommandProperties や HystrixThreadPoolProperties などのクラスを使用してコード内で構成します。
-
実行する必要があるメソッドで @HystrixCommand アノテーションを使用したり、アノテーションで fallbackMethod や commandProperties などの属性を設定したりするなど、アノテーションを使用して構成します。
-
application.properties または application.yml で関連プロパティを設定するなど、構成ファイルで構成します。
3.1.2 Hystrix 構成プロパティの概要
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: コマンド実行タイムアウト、デフォルトは 1000 ミリ秒です。
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: コマンド実行タイムアウト、デフォルトは 1000 ミリ秒です。
hystrix.command.default.execution.timeout.enabled: コマンド実行タイムアウトを有効にするかどうか。デフォルトは true です。
hystrix.command.default.execution.timeout.enabled: コマンド実行タイムアウトを有効にするかどうか。デフォルトは true です。
hystrix.command.default.circuitBreaker.requestVolumeThreshold: サーキット ブレーカーを開くためのリクエスト量。デフォルトは 20 です。
hystrix.command.default.circuitBreaker.errorThresholdPercentage: エラー率のしきい値。この値に達するとサーキット ブレーカーが開きます。デフォルトは 50 です。
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds: サーキット ブレーカーが開いた後のスリープ時間。デフォルトは 5000 ミリ秒です。
hystrix.command.default.metrics.rollingStats.timeInMilliseconds: 統計時間ウィンドウのサイズ。デフォルトは 10000 ミリ秒です。
hystrix.threadpool.default.coreSize: スレッド プール内のコア スレッドの数。デフォルトは 10 です。
hystrix.threadpool.default.maxQueueSize: スレッド プール キューの最大長。デフォルトは -1 で、これは SynchronousQueue を使用することを意味します。
hystrix.threadpool.default.queueSizeRejectionThreshold: キュー拒否のしきい値。キューの長さがこの値に達すると、新しいリクエストは拒否されます。デフォルトは 5 です。
3.2. コードで Hystrix コマンドを使用する方法
HystrixCommand.Setter オブジェクトを使用して、Hystrix コマンドのグループ名と実行タイムアウトを設定します。
3.2.1. Hystrix コマンドの定義
Hystrix コマンドは、HystrixCommand クラスを継承し、run() メソッドと getFallback() メソッドを実装することで定義できます。run() メソッドは実際のビジネス ロジックの実行に使用され、getFallback() メソッドはコマンドの実行が失敗またはタイムアウトした場合のフォールバック ロジックを定義するために使用されます。
public class MyHystrixCommand extends HystrixCommand<String> {
private final String name;
public MyHystrixCommand(String name) {
super(HystrixCommandGroupKey.Factory.asKey("MyHystrixCommandGroup"));
this.name = name;
}
@Override
protected String run() throws Exception {
// 实际的业务逻辑
return "Hello " + name + "!";
}
@Override
protected String getFallback() {
// 命令执行失败或超时时的回退逻辑
return "Fallback for " + name;
}
}
3.2.2. Hystrix コマンドの実行
Hystrix コマンドを実行する必要がある場合は、MyHystrixCommand のインスタンスを作成し、execute() メソッドを呼び出して Hystrix コマンドを実行します。例えば:
String result = new MyHystrixCommand("World").execute();
3.2.3、Hystrix 構成
Hystrix コマンドの動作は、構成を通じて調整できます。コマンドの動作は、MyHystrixCommand コンストラクターで HystrixCommand.Setter オブジェクトを設定することで構成できます。例えば:
public MyHystrixCommand(String name) {
super(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("MyHystrixCommandGroup"))
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
.withExecutionTimeoutInMilliseconds(500)));
this.name = name;
}
3.3. Hystrix モニタリングパネルの使用方法
Maven プロジェクトを作成し、次の Hystrix 依存関係を追加します。
-
Hystrix-metrics-event-stream: Hystrix モニタリング メトリックを SSE (Server-Sent Events) の形式でブラウザに出力します。
-
Hystrix-codahale-metrics-publisher: Hystrix モニタリング インジケーターを Dropwizard メトリックの形式で出力します。
-
Hystrix ダッシュボード: Hystrix のダッシュボードでは、Hystrix のヒューズ、絶縁、劣化、その他のインジケーターを簡単に表示できます。
-
Hystrix-turbine: 複数の Hystrix ダッシュボードのデータを集約して表示し、一元管理します。
-
Hystrix の例: Hystrix のサンプル コード。Hystrix の基本的な使用法、Hystrix ダッシュボードの使用法、Turbine の使用法などが含まれます。
3.3.1. Hystrix Dashboard 依存関係パッケージをアプリケーションに追加する
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-core</artifactId>
<version>1.5.18</version>
</dependency>
3.3.2. コード内での使用@HystrixCommand
コード内でアノテーションを使用して@HystrixCommand
フォールト トレランスと遅延トレランスを必要とするメソッドをマークし、アノテーションでフォールバック メソッドを指定します。
@HystrixCommand(fallbackMethod = "defaultHello")
public String hello(String name) {
// 正常业务逻辑
// ...
}
public String defaultHello(String name) {
// fallback 逻辑
// ...
}
3.3.3. メインクラスで Hystrix ダッシュボードを起動します。
@SpringBootApplication
@EnableHystrixDashboard
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3.3.4. ブラウザでのアクセス
にアクセスしhttp://localhost:port/hystrix
、インターフェイス上で Hystrix Stream の URL アドレスを入力します。例: http://localhost:port/hystrix.stream
。[Monitor Stream] ボタンをクリックすると、モニタリング パネルが表示されます。監視パネルでは、各 Hystrix コマンドの実行ステータス、ヒューズのステータス、要求されたトラフィックなどの情報を表示できます。
注: Hystrix Dashboard モニタリング パネルは、Hystrix Stream と組み合わせて使用する必要があります。これはmanagement
、アプリケーションの監視エンドポイントを開始するために使用される Spring Boot Actuator モジュールに関連しています。この設定項目はapplication.properties
またはファイルに追加する必要があります。application.yml
Hystrix Stream は、次の構成項目を追加することで有効にできます。
management.endpoints.web.exposure.include=hystrix.stream
第四に、Hystrix の動作原理
4.1、スレッドプールの分離
Hystrix では、スレッド プールの分離とセマフォの分離という 2 つのリソース分離戦略が提供されています。
スレッド プールの分離: スレッド プールの分離では、依存関係ごとにスレッド プールが作成され、その依存関係からのリクエストが処理されます。異なる依存関係のスレッド プールは相互に分離されます。依存関係 A が失敗してスレッド プールのリソースが使い果たされても、他の依存関係には影響しません。依存するスレッド プール リソース。
隔離方法 | タイムアウトをサポートするかどうか | 融合をサポートするかどうか | 絶縁原理 | 非同期で呼び出すかどうか | LF |
---|---|---|---|---|---|
スレッドプールの分離 | サポート、直接返品可能 | サポート。スレッド プールが maxSize に達すると、リクエストによってフォールバック インターフェイスがトリガーされて融合されます。 | 各サービスは個別のスレッド プールを使用し、要求スレッドと転送処理スレッドは同じではありません | 非同期でも同期でも構いません。電話のかけ方を見てみる | 多数のスレッドの大規模なコンテキスト切り替えにより、マシン負荷が高くなる可能性があります |
セマフォの分離 | サポートされていません。ブロックされている場合は、プロトコルを呼び出すことによってのみ返されます (ソケット タイムアウトなど)。 | セマフォが maxConcurrentRequests に達するとサポートされます。再リクエストによりフォールバックがトリガーされます | セマフォのカウンタを介して、リクエストスレッドと転送処理スレッドは同一です | 同期呼び出し、非同期はサポートされません | 小さい、カウンターだけ |
2.ヒューズモード
Hystrix は、分散システム用のレイテンシーとフォールトトレラントなライブラリであり、高負荷または依存コンポーネントの障害下でサービスやシステムが動作し続けるのを保護できます。Hystrix は Netflix によって開発され、現在 Spring Cloud の一部となっています。
Hystrix の核となる原理はサーキット ブレーカー パターンです。サーキット ブレーカーは、障害発生時の追加の損傷からアプリケーションを保護する強力なフォールト トレランス メカニズムです。分散システムでは、1 つのサービスに障害が発生すると、他のサービスが影響を受け、システム全体に障害が発生する可能性があります。この場合、Hystrix のヒューズ モードで保護できます。
Hystrix のヒューズ モードはサーキット ブレーカーによって実装されており、サービス リクエストに問題がある場合、Hystrix はリクエストの結果をサーキット ブレーカー内にキャッシュします。リクエストが連続して失敗した場合、サーキット ブレーカーはオープン状態に切り替わり、新しいリクエストはサービスに直接送信されなくなり、事前に設定されたフォールバック結果が返されます。サーキット ブレーカーは定期的に一定期間サービスの再チェックを試行し、チェックが成功するとサーキット ブレーカーは閉じた状態に切り替わり、そうでない場合は開いたままになります。
Hystrix のサーキット ブレーカー モードには、サーキット ブレーカーと呼ばれるカウンターも含まれており、一定期間内に失敗したリクエストの数を記録するために使用されます。事前に設定されたしきい値に達すると、回路ブレーカーが開きます。サーキット ブレーカーがオンになると、サービスへのリクエストはサービスに直接送信されなくなりますが、サービスへの負担が大きくなるのを避けるために、フォールバック結果が直接返されます。一定期間内に、Hystrix は定期的にサーキット ブレーカーを閉じようとします。サービスが通常の状態に戻ったことを検出すると、サーキット ブレーカーは閉じられます。そうでない場合は、サーキット ブレーカーは開いたままになります。
つまり、Hystrix のヒューズ モードは、分散システム内のサービスを効果的に保護し、特定のサービスの障害によるシステム全体の障害を防ぐことができます。
3. バックアップモード
Hystrix のフォールバック モード (フォールバック モード) は、Hystrix コマンドの実行が失敗するかタイムアウトになった場合のバックアップ ロジックの実行を指します。フォールバック ロジックは信頼性が高く、さまざまなアプリケーション状態にわたってデータまたは情報を返せる必要があります。
Hystrix では、フォールバック ロジックは Fallback メソッドによって提供されます。フォールバック方式は、メイン ロジックが何らかの理由で失敗した場合にバックアップ データまたはロジックを提供するフォールバック戦略です。フォールバック メソッドは、障害と障害の回復を処理することが目的であり、複雑な操作を長時間実行することではないため、迅速に復帰できる必要があります。
Hystrix のフォールバック モードは次の方法で実装できます。
アノテーション メソッド: フォールバック メソッドは、@HystrixCommand アノテーションの fallbackMethod 属性を通じて指定できます。
プログラミング方法: Fallback メソッドは、HystrixCommand.Setter.withFallback() メソッドを通じて指定できます。
Hystrix を使用する場合、HystrixCommand ごとに Fallback メソッドを指定する必要があることに注意してください。Fallback メソッドが指定されていない場合、コマンドの実行が失敗するかタイムアウトになると例外がスローされます。
全体として、フォールバック モードはシステムの信頼性と安定性を向上させることができます。フォールバック方式を使用すると、メイン ロジックに障害が発生した場合にバックアップ ロジックを提供し、システムの正常な動作を保証できます。
4. 応答のキャッシュ
Hystrix は、バックエンド システムへの呼び出しの数を減らし、パフォーマンスを向上させるために、同じリクエストに対する応答をキャッシュする応答キャッシュを提供します。Hystrix コマンドの実行中、応答キャッシュが有効になっている場合、対応する応答がキャッシュ内にあるかどうかが最初にチェックされ、存在する場合はバックエンド システムにリクエストを行わずにキャッシュ内の応答が直接返されます。 。
応答キャッシュを使用するには、Hystrix コマンドでアノテーションを設定し@CacheResult
、HystrixCommand
その中でキャッシュされたキーを指定する必要があります。具体的な実装については、次のコードを参照してください。
public class MyCommand extends HystrixCommand<String> {
private final String cacheKey;
public MyCommand(String cacheKey) {
super(HystrixCommandGroupKey.Factory.asKey("MyCommandGroup"));
this.cacheKey = cacheKey;
}
@Override
protected String run() throws Exception {
// 执行具体的业务逻辑
return "Hello World";
}
@Override
protected String getCacheKey() {
return cacheKey;
}
@Override
protected String getFallback() {
return "Fallback";
}
@Override
protected Setter getCommandProperties() {
return Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("MyCommandGroup"))
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)
.withCircuitBreakerEnabled(true)
.withRequestCacheEnabled(true)); // 开启响应缓存
}
@CacheResult // 设置缓存
@Override
public String execute() {
return super.execute();
}
}
ではMyCommand
、アノテーションを使用して@CacheResult
応答キャッシュを有効にし、getCacheKey()
メソッドでキャッシュ キーを指定します。このメソッドではgetCommandProperties()
、リクエスト キャッシュを有効にして、Hystrix コマンドを実行するときに、最初にキャッシュからレスポンスを取得できるようにします。メソッドの実行時execute()
、キャッシュ内に対応するレスポンスがあれば、キャッシュ内の結果が直接返されます。それ以外の場合、run()
メソッド内のビジネス ロジックが実行され、結果がキャッシュされます。
応答キャッシュはメモリ領域を占有するため、キャッシュに格納されるデータ量が多すぎるとメモリ オーバーフローが発生する可能性があることに注意してください。したがって、システムのパフォーマンスへの悪影響を避けるために、キャッシュの有効期間とキャッシュのサイズを合理的に設定する必要があります。
5、Hystrix アプリケーションのシナリオ
Hystrix は主に、分散システムにおけるフォールト トレラントな問題を解決するために使用され、フロントエンド、サーバー、データベース レベルなど、システム内のさまざまなレベルで使用できます。Hystrix アプリケーションのシナリオをいくつか示します。
-
サービス呼び出し: Hystrix は、サービス呼び出し中の証明書利用者のエラーやタイムアウトによって引き起こされるサービス雪崩の問題を防ぐことができます。
-
データベース アクセス: Hystrix は、アプリケーションがデータベースにアクセスするときに、データベース接続が多すぎることやデータベース アクセス エラーによって引き起こされるアプリケーションのクラッシュを防ぐことができます。
-
ネットワーク リソース アクセス: Hystrix は、アプリケーションが外部リソースにアクセスするときにリソースが利用できないことやタイムアウトによって引き起こされるアプリケーションのクラッシュを防ぐことができます。
-
マイクロサービス アーキテクチャ: マイクロサービス アーキテクチャでは、サービス間の依存関係が複雑ですが、Hystrix はこの環境でフォールト トレランス メカニズムを提供し、システム全体の安定性を確保できます。
-
高トラフィックのアプリケーション: 同時実行性が高い場合、Hystrix はシステムが過負荷になってサービスが利用できなくなることを防ぐために同時リクエストの量を制限できます。
つまり、Hystrix は分散システムにおけるさまざまなフォールト トレラント シナリオに適しており、アプリケーションでの雪崩現象を防止し、システムの信頼性と安定性を確保するための保護メカニズムを提供できます。