BT

Ready for InfoQ 3.0? Try the new design and let us know what you think!

Netflix Hystrix - 複雑な分散システムへのレイテンシとフォールトトレランス

| 作者: Bienvenido David III フォローする 0 人のフォロワー , 翻訳者 尾崎 義尚 フォローする 0 人のフォロワー 投稿日 2012年12月30日. 推定読書時間: 4 分 |

原文(投稿日:2012/12/21)へのリンク

 

Netflixは、待ち時間や障害を許容して、リモートシステム、サービス、サードパーティライブラリへのアクセスポイントを制御するために設計されたライブラリであるHystrixをリリースした。 Hystrixは、スレッドやセマフォを分離して、フォールバックとサーキットブレーカー、リクエストキャッシュとリクエスト収縮、モニタリングと構成と言った機能を提供する。Hystrixは、2011年にNetflix APIチームの復元エンジニアリング作業の中でから発展し、現在ではNetflixで毎日、数百億のプロセス分離と数千億のセマフォ分離呼び出しを処理している。Hystrixは、Apache License 2.0下でGitHubにホストされているオープンソースライブラリである。

複雑な分離アーキテクチャは多くの依存関係を持っている。アプリケーションが依存性の障害から分離されていない場合、アプリケーション自体がダウンするリスクを持っている。高いボリュームのWebサイトでは、単一のバックエンド依存はすべてのアプリケーションリソースは、数秒で飽和状態になる可能性がある。

Hystrixは、ネットワーク越しのアクセスによる依存性からのレイテンシと障害時の保護とコントロールを提供する。これは、カスケード障害と障害からの急速な復旧と、フォールバックと緩やかな退行を可能にする。

これがどのように動作しているのか。依存関係の呼び出しをHystrixCommandオブジェクトでラップする必要がある。HystrixCommandはコマンドパターンに従っており、通常は分離スレッドで実行される。呼び出しタスクは定義されたしきい値を超えた時にタイムアウトが発生する。Hystrixは、依存性ごとにスレッドプール(やセマフォ)の維持し、スレッドプールが枯渇したときに要求を拒否(代わりに要求をキューイングする)する。これは、依存関係へのすべての要求を停止できるサーキットブレーカー機能を提供する。リクエストが失敗、拒否、タイムアウト、ショートサーキットされたときのフォールバックロジックを実装することもできる。Hystrixはまた、キャッシュとリクエストの収縮もサポートする。

以下は、HystrixCommandで実装したシンプルなHello Worldである。

public class HelloWorldCommand extends HystrixCommand { 	public HelloWorldCommand() { 		super(HystrixCommandGroupKey.Factory.asKey("MyGroup")); 	}  	@Override 	protected String run() { 		return "Hello World"; 	}  	@Override 	protected String getFallback() { 		return "Hello Fallback"; 	} } 

グループキーは、レポートとアラート目的のコマンドをグルーピングする。例外、タイムアウト、スレッドプール(またはセマフォ)拒否、サーキットブレーカーによるショートサーキットなどすべてのタイプの障害に対して、getFallback()実装の追加によって緩やかに退行することができる。Hystrixコマンドは、execute()メソッドで同期することができる。

String s = new HelloWorldCommand().execute();

Hystrixコマンドはまた、queue()メソッドで非同期実行することもできる。

java.util.concurrent.Future future = new HelloWorldCommand().queue(); String s = future.get(); 

Hystrixは、依存性の分離と同時アクセスを制限するためにバルクヘッドパターンを使用している。依存関係ごとに使用されるスレッドプールが分離されているため、同時リクエストは制限されている。実行中の待ち時間は、プール内の使用可能なスレッドを飽和させる。スレッドプールの代わりにセマフォを使うこともできるが、負荷制限はできるがタイムアウトは変わらない。依存関係にスレッドプールを使う際のメリットとデメリットに関する詳細な議論は、Hystrixの分離がどのように動作するかを読んで欲しい。

Hystrixは、Netflixで使用されているのと同じモニタリングダッシュボードを採用している。Hystrix Dashboardは、ほぼリアルタイムのモニタリング、運用制御のアラートを提供している。ここには、成功、失敗(クライアントからスローされた例外)、タイムアウト、スレッドの拒否を表示される。ユーザーは、その場で依存関係のショートサーキットなどの設定変更が可能である。

まずは、Getting StartedHow To Useを含むhttp://github.com/Netflix/Hystrix/wikiにあるHystrixドキュメントからはじめるとよい。Java 6移行が必要になる。Mavenユーザーは、Mavenから作られたcom.netflix.hystrix hystrix-coreを見るべきだろう。さらに詳細は、Netflix APIパフォーマンスとフォールトトレランスのプレゼンテーションと公式のHystrix FAQを読んで欲しい。依存性の非同期サポートは、この記事を執筆時点では実装されていないことに注意して欲しい。

 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション
BT