1. ホーム
  2. design-patterns

[解決済み] Hystrixが採用しているBulkhead Patternとは何ですか?

2022-08-08 05:06:45

質問

複雑な分散システムにおけるレイテンシとフォールトトレランスのためのNetflixのAPIであるHystrixは、以下のものを使用しています。 バルクヘッドパターン テクニックを使用しています。どなたか詳しく教えてください。

どのように解決するのですか?

一般的な

一般に、バルクヘッドパターンの目標は、システムの一部分の欠陥がシステム全体を破壊することを避けることです。この用語は、1 つの船体の破損で船全体が浸水するのを避けるために、船を個別の水密区画に分割したことに由来しています (浸水するのは 1 つの隔壁だけです)。

バルクヘッドパターンの実装は、どのような種類の故障からシステムを保護したいかによって、多くの形態をとることができます。この回答では、Hystrixが処理する障害の種類についてのみ説明します。

バルクヘッドパターンが一般化したのは Release It! by Michael T. Nygardによって広まったと思います。

Hystrixが解決すること

Hystrixのバルクヘッド実装 は、コンポーネントへの同時呼び出しの数を制限しています。 . この方法では、コンポーネントからの応答を待っているリソース(通常はスレッド)の数が制限されます。

リクエストベースのマルチスレッドアプリケーション(例えば典型的なウェブアプリケーション)で、3つの異なるコンポーネントを使用すると仮定します。 A , B であり、かつ C . コンポーネントへのリクエストが C へのリクエストがハングアップし始めると、最終的にはすべてのリクエスト処理スレッドが C . これはアプリケーションを完全に無応答にするでしょう。もし C へのリクエストがゆっくり処理される場合、負荷が十分に高ければ同じような問題が発生します。

Hystrix のバルクヘッドパターンの実装は、コンポーネントへの同時呼び出しの数を制限し、このケースでアプリケーションを保存したことでしょう。30 のリクエスト処理スレッドがあり、への同時呼び出しが 10 に制限されていると仮定します。 C . を呼び出すとき、最大で 10 個のリクエストハンドリングスレッドがハングアップする可能性があります。 C を呼び出したときにハングします。 残りの 20 個のスレッドはまだリクエストを処理でき、 コンポーネントの A B .

ヒストリカルのアプローチ

Hystrix'はバルクヘッドに対して、スレッドアイソレーションとセマフォアイソレーションの2つの異なるアプローチを持っています。

スレッド隔離

標準的なアプローチは、すべてのリクエストをコンポーネント C へのすべてのリクエストを、固定数のスレッドとリクエストキューを持たない (あるいは少ない) 独立したスレッドプールに渡すことです。

セマフォの分離

もう一つの方法は、すべての呼び出し元が、(0 タイムアウトで) permit を獲得してから C . セマフォからパーミットを取得できない場合は C の呼び出しは通されません。

相違点

スレッドプールアプローチの利点は、スレッドプールに渡されたリクエストは C に渡されるリクエストをタイムアウトさせることができることです。これはセマフォを使うときには不可能なことです。