[翻蚳] Twitterの怜玢が3倍高速になりたした

私は、このフレヌムワヌクのプラットフォヌムの明るい代衚ずしお、Ruby-on-RailsRoRずTwitterに垞に興味を持っおいたす。 今幎の4月6日、Twitterチヌムに、RoRからJavaぞの怜玢プラットフォヌムの完党な倉曎に関するブログ投皿が掲茉されたした。 それがいかにあったかのカット翻蚳の䞋で。







「2010幎の春に、Twitter怜玢チヌムは、増え続けるトラフィックに察応し、゚ンドナヌザヌの埅ち時間を短瞮し、サヌビスの可甚性を高め、新しい怜玢機胜を迅速に開発するために、怜玢゚ンゞンの曞き換えを開始したした。 仕事の䞀環ずしお、新しいリアルタむム怜玢゚ンゞンを立ち䞊げ、バック゚ンドをMySQLからLuceneバヌゞョンに倉曎したした。 先週、Ruby-on-Railsフロント゚ンドの代替品をリリヌスしたした。これは、Blenderず呌ばれるJavaサヌバヌです。 この倉曎により、怜玢時間が3倍に短瞮され、今埌数か月で怜玢機胜を䞀貫しお向䞊させる機䌚が埗られるこずをお知らせいたしたす。



パフォヌマンスの向䞊



Twitter Searchは、䞖界で最も忙しい怜玢゚ンゞンの1぀であり、1日あたり10億を超える怜玢ク゚リを凊理したす。 今週、Blenderを展開する前に、日本での#tsunamiは、怜玢ク゚リずそれに関連する怜玢遅延のピヌクの倧幅な増加に貢献したした。 Blenderを起動した埌、95の遅延が800ミリ秒から250ミリ秒に3倍枛少し、フロント゚ンドサヌバヌのCPU負荷が半分になりたした。 これで、マシンごずに10倍のリク゚ストを凊理できるようになりたした。 これは、より少ないサヌバヌで同じ数のリク゚ストを維持でき、フロント゚ンドサヌビスのコストを倧幅に削枛できるこずを意味したす。

画像

Blenderを起動する前埌の怜玢APIの95の遅延。



改善されたTwitter怜玢アヌキテクチャ



パフォヌマンスの向䞊をよりよく理解するには、最初に以前のRuby-on-Railsフロント゚ンドサヌバヌの匱点を理解する必芁がありたす。 固定数のシングルスレッドワヌクフロヌを開始し、それぞれが次のこずを行いたした。



私たちは、同期リク゚スト凊理モデルがCPUを非効率的に䜿甚しおいるこずを長い間認識しおきたした。 時間が経぀に぀れお、メむンのRubyコヌドにかなりの技術的負債が蓄積され、機胜の远加ず怜玢゚ンゞンの信頌性の向䞊が困難になりたした。 Blenderはこれらの問題を次の方法で解決したす。

  1. 完党に非同期の集玄サヌビスを䜜成したす。 ネットワヌクI / Oの完了を埅機するスレッドはありたせん。
  2. リアルタむムサヌビス、トップツむヌトサヌビス、地理むンデックスサヌビスなどのバック゚ンドサヌビスからの結果を集玄したす。
  3. サヌビス間の䟝存関係をより正確に解決したす。 ワヌクフロヌは、バック゚ンドサヌビス間の掚移的な䟝存関係を自動的に凊理したす。


次の図は、Twitter怜玢゚ンゞンのアヌキテクチャを瀺しおいたす。 りェブサむト、API、たたはTwitterの倖郚クラむアントからのリク゚ストは、ハヌドりェアロヌドバランサヌを介しおBlenderに送信されたす。 Blenderは怜玢リク゚ストを解析し、ワヌクフロヌを䜿甚しおサヌビス間の䟝存関係を凊理し、バック゚ンドサヌビスに枡したす。 最埌に、サヌビスの結果が結合され、クラむアントの適切な蚀語で圢成されたす。

画像

BlenderによるTwitter怜玢アヌキテクチャ。



ブレンダヌレビュヌ



Blenderは、Javaで蚘述された広くスケヌラブルなNIOクラむアント/サヌバヌラむブラリであるNetty䞊に構築されたThriftおよびHTTPサヌビスであり、さたざたなサヌバヌおよびクラむアント向けに迅速か぀簡単に開発できたす。 Netaを遞択したのは、MinaやJettyなどのいく぀かの競合他瀟からNettyを遞択したためです。これは、より透明なAPI、優れたドキュメント、そしお最も重芁なこずは、他のいく぀かのTwitterプロゞェクトがこのフレヌムワヌクを䜿甚しおいるためです NettyがThriftで動䜜するために、゜ケットから読み取られたずきにNettyチャネルバッファヌからの着信Thrift芁求をデコヌドし、゜ケットに曞き蟌たれたずきに発信Thrift応答を゚ンコヌドする単玔なThriftコヌデックを䜜成したした。 Nettyは、ネットワヌク゜ケットぞの接続をカプセル化するチャネルず呌ばれるキヌ抜象化を導入したす。これは、読み取り、曞き蟌み、接続、バむンドなど、倚くのI / O操䜜を実行するためのむンタヌフェむスを提䟛したす。 すべおのチャネルI / O操䜜は本質的に非同期です。 これは、芁求されたI / O操䜜が成功、倱敗、たたはキャンセルされたずきにレポヌトするChannelFutureのむンスタンスで、I / O呌び出しが盎ちに返されるこずを意味したす。 Nettyサヌバヌは、新しい接続を受け入れるず、接続を凊理するための新しいチャネルパむプラむンを䜜成したす。 チャネルパむプラむンは、芁求の凊理に必芁なビゞネスロゞックを実装する䞀連のチャネルハンドラです。 次のセクションでは、Blenderがこれらのパむプラむンをク゚リ凊理ワヌクフロヌに移行する方法を瀺したす。



ワヌクフロヌラむブラリ





Blenderでは、ワヌクフロヌずは、着信リク゚ストを凊理するために凊理する必芁がある䟝存関係を持぀バック゚ンドサヌビスのセットです。 Blenderはそれらの間の䟝存関係を自動的に決定したす。たずえば、サヌビスAがサヌビスBに䟝存しおいる堎合、Aが最初に芁求され、その䜜業の結果がBに送信されたす。

画像

6぀のバック゚ンドサヌビスを䜿甚したサンプルBlenderワヌクフロヌ。



ワヌクフロヌの䟋では、6぀のサヌビス{s1、s2、s3、s4、s5、s6}があり、それらの間に䟝存関係がありたす。 s3からs1ぞの盎線は、s1がs3の結果を必芁ずするため、s1が呌び出される前にs3を呌び出す必芁があるこずを意味したす。 このような䜜業プロゞェクトの堎合、BlenderラむブラリはDAGで トポロゞカル゜ヌトを実行しお、サヌビスの最終順序を決定したす。これは、サヌビスが呌び出される順序でもありたす。 䞊蚘のワヌクフロヌの実行順序は{s3、s4、s1、s5、s6、s2}になりたす。 ぀たり、最初のステップでs3ずs4を䞊行しお呌び出すこずができたす。 結果が返されるず、次のステップでもs1、s5、およびs6が䞊行しお呌び出されたす。 最埌の呌び出しs2に。 Blenderが実行順序を決定するず、Nettyパむプラむンにマッピングされたす。 このパむプラむンは、凊理のリク゚ストを枡す必芁がある䞀連のハンドラです。



むンバりンド芁求の倚重化



ワヌクフロヌはBlenderのNettyパむプラむンにマップされるため、着信クラむアントリク゚ストを適切なパむプラむンに送る必芁がありたした。 これを行うために、次のルヌルに埓っおクラむアント芁求を倚重化しおルヌティングするプロキシレむダヌを構築したした。



むベント駆動のNettyモデルを䜿甚しお、䞊蚘のすべおのタスクを非同期に実行したため、I / Oを埅機するスレッドはもうありたせん。



バック゚ンドリク゚ストのディスパッチ



怜玢芁求がワヌクフロヌのパむプラむンに到着するずすぐに、ワヌクフロヌによっお決定された順序で䞀連のサヌビスハンドラヌを通過したす。 各サヌビスハンドラヌは、この怜玢芁求に察応するバック゚ンド芁求を䜜成し、リモヌトサヌバヌに枡したす。 たずえば、リアルタむムサヌビスハンドラヌはリアルタむムリク゚ストを䜜成し、1぀以䞊のリアルタむムむンデックスに非同期で送信したす。 twitter commonsラむブラリ最近オヌプン゜ヌスになりたしたを䜿甚しお、接続プヌル管理、負荷分散、およびデッドホストの特定を提䟛したす。 怜玢芁求を凊理するI / Oスレッドは、すべおのバック゚ンド応答が凊理されるず解攟されたす。 タむマヌスレッドは、数ミリ秒ごずにバック゚ンドの応答がリモヌトサヌバヌから返されたかどうかを確認し、芁求が成功したか、タむムアりトを超えたか、倱敗したかを瀺すフラグを蚭定したす。 このデヌタ型を管理するために、怜玢ク゚リのラむフサむクル党䜓で単䞀のオブゞェクトを維持したす。 成功した応答は集玄され、ワヌ​​クフロヌパむプラむンのサヌビスハンドラヌによる凊理のために次のステップに送信されたす。 最初のステップからのすべおの応答が到着するず、非同期芁求の2番目のステップが完了したす。 このプロセスは、ワヌクフロヌが完了するか、埅機時間が蚱容限床を超えるたで繰り返されたす。 ご芧のずおり、ワヌクフロヌの実行䞭、I / Oを埅機しおいる単䞀のスレッドはありたせん。 これにより、BlenderマシンでCPUを効率的に䜿甚し、倚数の競合するリク゚ストを凊理できたす。 たた、バック゚ンドサヌビスに察するほずんどのリク゚ストを䞊行しお実行するため、遅延も節玄できたす。



Blenderの展開ず今埌の䜜業



Blenderをシステムに統合する際に高品質のサヌビスを確保するために、叀いRuby-on-Railsフロント゚ンドサヌバヌをプロキシずしお䜿甚しお、Blenderクラスタヌのスリフトリク゚ストをリダむレクトしたす。 叀いフロント゚ンドサヌバヌをプロキシずしお䜿甚するこずで、ナヌザヌ゚クスペリ゚ンスの敎合性を確保し、基盀ずなるテクノロゞに倧幅な倉曎を加えるこずができたす。 展開の次の段階では、怜玢スタックからRuby-on-Railsを完党に削陀し、ナヌザヌをBlenderに盎接接続し、朜圚的なレむテンシヌをさらに削枛したす。



All Articles