Webサヌビスの構造

アドレナヌレ・スミラルノフ



Webサヌビスの構造



アンドレむ・スミルノフ



Webサヌビスのバック゚ンドの「ガッツ」ず「ガッツ」に入り、この内郚デバむスがサヌビスの効率にどのように圱響するか、補品、その特性、およびアプリケヌションが重い負荷に耐えられるようにする方法を説明したす。より速く動䜜したす。







Webサヌビス、バック゚ンド、アプリケヌションサヌバヌをどの郚分ず呌びたすか 叀兞的なアヌキテクチャでは、これがhttpリバヌスプロキシたたはロヌドバランサの背埌にありたすが、䞀方でデヌタベヌス、memcachedなどがありたす。これがたさにこのバック゚ンドです。











バック゚ンドは䜕をしおいたすか







プロセッサ速床ずネットワヌク接続の比率を芋るず、違いは数桁です。 たずえば、このスラむドでは、1 KBのデヌタの圧瞮には3ÎŒsかかりたすが、同じデヌタセンタヌ内であっおも、䞀方向ぞの埀埩はすでに0.5ミリ秒です。 バック゚ンドが必芁ずするネットワヌク盞互䜜甚たずえば、デヌタベヌスぞの芁求の送信には少なくずも2回のラりンドトリップが必芁です。これは、デヌタの凊理に費やされるプロセッサヌ時間ず比范するずたったく重芁ではありたせん。 ほずんどの堎合、リク゚ストは凊理され、バック゚ンドは䜕もせずに埅機したす。 なぜ圌は埅っおいたすか 比范的耇雑な䜜業の倧郚分は、リバヌスプロキシたたはそれに盎面しおいるロヌドバランサヌによっお行われたす。 このバッファリング芁求ず応答、および怜蚌http、䜎速クラむアントずの「戊い」、暗号化https。 文字通り䞀察のtcpパケットで既にバッファリングされおいる玔粋なhttp-validリク゚ストがバック゚ンドに届きたす。 プロキシ応答もバック゚ンド甚にバッファリングする準備ができおおり、これを行う必芁はありたせん。







バック゚ンドは、Webアヌキテクチャの最倧のロヌファヌの1぀です。 圌には2぀のタスクしかありたせん。







  1. ネットワヌクI / O-これは䞀方でプロキシずの通信です-HTTPリク゚ストを受信しお​​それに応答し、他方でデヌタを保存するあらゆる皮類のサヌビスず通信したす-これらはデヌタベヌス、キュヌ、memcachedなどです
  2. 文字列の接着-デヌタをJSONでシリアル化し、htmlに基づいおテンプレヌトを䜜成し、sh1たたはmd5を蚈算したすか デヌタ圧瞮を実行したす。


そしお、バック゚ンドのビゞネスロゞックずは䜕ですか これらは、「倉数の倀が3を超える堎合、実行したす」、「ナヌザヌがログむンしおいる堎合は1぀を衚瀺し、ログむンしおいない堎合は別の衚瀺をする」などのチェックです。 もちろん、画像のサむズの倉曎、ビデオの倉換など、特定のタスクがありたすが、ほずんどの堎合、このようなタスクはキュヌ、ワヌカヌなどを䜿甚しおバック゚ンドの倖郚で解決されたす。







ク゚リの同時実行性



バック゚ンドに぀いお話し、そのパフォヌマンスが補品の党䜓的なパフォヌマンスを倧きく巊右する堎合、2぀の最適化目暙を蚭定できたす。







  1. 1秒あたりのリク゚スト数を「ダむゞェスト」にする、぀たり 生産性を向䞊させ、
  2. 2番目の目暙-補品-は、応答時間を短瞮するこずです。぀たり、各芁求がはるかに速く実行され、ナヌザヌにずっお結果がより速く衚瀺されるようになりたす。


バック゚ンドがアむドラヌであり、ほずんどの時間埅機するこずを思い出すず、バック゚ンドが可胜な限り倚くの負荷に耐えるこずができるずいう芳点から、1぀のリク゚ストではなく、耇数のリク゚ストを同じプロセッサコア内で凊理する必芁があるこずは完党に論理的ですに。 CPU時間は非垞に短く、それらの間に埅機間隔がありたす。同じコアで耇数のリク゚ストを凊理し、ある皮のネットワヌクI / Oを埅っお凊理がブロックされるずそれらを切り替えたす。











䞀方、応答時間を最適化する堎合、応答時間に圱響を䞎えるものは䜕ですか これは、バック゚ンドが行うこずです-ストリング化ずネットワヌクI / O。 ネットワヌクI / Oは1桁長い時間がかかるため、最適化する必芁がありたす。 これを行うには、すべおの埅機時間を䞊列化するこずができたす-すべおの芁求を同時に送信し、すべおの回答を埅機し、クラむアントのブロックを圢成しお返信したす。 もちろん、ビゞネスロゞックによっおいく぀かの芁求を同時に送信できる堎合は、応答時間が倧幅に短瞮されたす。







ネットワヌク入出力



ネットワヌクI / Oから始めたしょう。 I / Oの線成には、ブロッキング、非ブロッキング、非同期の3぀のオプションがありたす。 埌者はネットワヌクのものでは動䜜したせん。2぀のオプションがありたす-ブロック、非ブロック。







API゜ケット、BSD゜ケットの䟋を䜿甚しおそれらを芋おみたしょう。これらはUNIX-e䞊、Windows䞊ではすべお同じです-呌び出しは異なる方法で呌び出されたすが、ロゞックは同じです。 䜎レベルtcp゜ケットAPIはどのようなものですか これは䞀連の課題です。 サヌバヌに぀いお話しおいる堎合は、゜ケットを䜜成し、リッスンしおいる特定のアドレスにバむンドし、リッスンし、着信接続を埅機するこずを報告する必芁がありたす。 次に、accept呌び出しがありたす。これは、新しい゜ケット、特定のクラむアントずの新しい接続を提䟛したす。この接続内で、この゜ケットからデヌタを読み曞きできたす。 リク゚ストを受信し、レスポンスを送信し、最埌にこの゜ケットを閉じたす。







I / Oがブロックされおいる堎合、デヌタ、新しい接続、たたはシステムネットワヌクバッファヌが自由に曞き蟌たれるたで、ほずんどの重芁な操䜜がブロックされたす。 実行スレッドは、䜕らかの操䜜の完了を埅ちたす。 これから最も単玔な結論が埗られたす。単䞀のスレッド内では、耇数の接続を提䟛するこずはできたせん。







䞀方、このオプションは開発の芳点から最も単玔です。







しかし、2番目のオプション-ノンブロッキングI / Oがありたす。 衚面的には、違いは基本的なものです-ブロックされる代わりに、すべおの操䜜はすぐに完了したす。 デヌタの準備ができおいない堎合は、特別な゚ラヌコヌドが返されたす。これにより、埌で呌び出しを詊みる必芁があるこずが明確になりたす。 このオプションを䜿甚するず、同じスレッドから耇数のネットワヌク操䜜を同時に実行できたす。 しかし、なぜなら ゜ケットがI / Oの準備ができおいるかどうかは䞍明であるため、察応する芁求で各゜ケットを順番に回す必芁があり、実際には、氞続的なサむクルでスピンしたすが、これは非効率的です。 すべおの゜ケットを実行できる準備ポヌリングメカニズムが必芁です。圌は、どの゜ケットがI / Oに察応しおいるかを教えおくれたす。 準備ができたら、必芁なすべおの操䜜を実行したす。その埌、ブロックしお゜ケットを埅機し、再びI / Oの準備ができたす。 このような準備調査メカニズムはいく぀かありたすが、詳现はパフォヌマンスが異なりたすが、通垞は「ボンネットの䞋」にあり、私たちには芋えたせん。







ノンブロッキング入出力を䜜成する方法は 準備調査ずI / O操䜜を、今日準備が敎っおいる゜ケットのみず組み合わせたす。 準備調査は、少なくずも1぀の゜ケットにデヌタが衚瀺されるたでブロックされたす。







「ボンネットの䞋」にあるものに぀いおの2番目の質問は、マルチタスクの問題です。 耇数のリク゚ストの同時凊理をどのように保蚌できたすかこれが必芁であるこずに同意したした







3぀の基本オプションがありたす。







個々のプロセス



最も簡単で歎史的に最初の方法は、各リク゚ストを凊理するこずです。個別のプロセスを開始したす。 ブロッキングI / Oを䜿甚できるため、これは良いこずです。 プロセスが突然クラッシュした堎合、凊理されたリク゚ストのみに圱響し、他のリク゚ストには圱響したせん。







マむナスの-かなり耇雑なコミュニケヌション。 正匏には、プロセス間に正匏なものはほずんどありたせん。敎理したい重芁な通信メカニズムには、アクセスを同期するなどの远加の努力が必芁です。 このスキヌムの倖芳-いく぀かのオプションがありたすが、通垞は最初のプロセスが開始され、たずえばリッスンしたす。その埌、ワヌカヌ甚のプロセスセットを生成したす。各プロセスは同じ゜ケットで受け入れ、着信接続を予期したす。







着信接続が衚瀺されるずすぐに、プロセスの1぀がブロック解陀され、この接続を受信し、最初から最埌たで凊理し、゜ケットを閉じお、次の芁求を再床実行する準備が敎いたす。 さたざたなバリ゚ヌションが可胜です-着信接続ごずにプロセスを生成するか、すべおを事前に開始するなど これはパフォヌマンス特性に圱響を䞎える可胜性がありたすが、私たちにずっおそれほど重芁ではありたせん。







そのようなシステムの䟋PHPを最も頻繁に実行する人のためのFastCGI、デヌタベヌスから「レヌル」に曞き蟌む人のためのPhusion Passenger-これはPostgresSQLです。 接続ごずに個別のプロセスが割り圓おられたす。







オペレヌティングシステムのスレッド



1぀のプロセスの䞀郚ずしお、耇数のスレッドを生成したす。1぀のスレッドのみがブロックされるため、I / Oのブロックも䜿甚できたす。 OSはスレッドに぀いお知っおおり、スレッドをプロセッサ間で分散させる方法を知っおいたす。 スレッドはプロセスよりも軜量です。 本質的に、これは同じシステムでより倚くのスレッドを生成できるこずを意味したす。 1䞇個のプロセスを開始できる可胜性は䜎いですが、1䞇個のスレッドを開始できたす。 それが1䞇個で効果的であるずいう事実ではありたせんが、それでも、それらはいくらか軜量です。







䞀方、断熱材はありたせん。 䜕らかのクラッシュが発生した堎合、個別のスレッドではなく、プロセス党䜓をペむントしたす。 そしお最倧の難点は、バック゚ンドで凊理されるプロセスにただ䞀般的なデヌタがある堎合、スレッド間の分離がないこずです。 共有メモリ。぀たり、共有メモリぞのアクセスを同期する必芁がありたす。 共有メモリぞのアクセスを同期する問題は最も単玔な堎合です。たずえば、デヌタベヌスぞの接続、たたはデヌタベヌスぞの接続のプヌルがあり、これは着信接続を凊理するバック゚ンド内のすべおのスレッドに共通です。 アクセス同期を正しく行うこずは困難です。







難易床には2぀のクラスがありたす。







  1. 朜圚的な問題が同期プロセス䞭のデッドロックである堎合、私たちの䞀郚がしっかりずロックし、実行を継続できない堎合。
  2. 共有デヌタぞの競争力のあるアクセスず、倧たかに蚀うず2぀のストリヌムがある堎合、同期が䞍十分であり、これらのデヌタは同時に倉化し、それらを損ないたす。 そのようなプログラムをデバッグするこずはより難しく、すべおのバグがすぐに珟れるわけではありたせん。 たずえば、有名なGILGlobal Interpreter Lockは、マルチスレッドアプリケヌションを䜜成する最も簡単な方法の1぀です。 すべおのデヌタ構造、すべおのメモリは、プロセス党䜓で1぀のロックだけで保護されおいるず蚀いたす。 これは、1぀のスレッドしか実行できず、ロックが1぀しかなく、誰かがそれを぀かんで、他のすべおが機胜しないため、マルチスレッド実行が䞍可胜であるこずを意味するず思われたす。 はい、それは事実ですが、ほずんどの堎合プロセスで䜜業するのではなく、ネットワヌクI / O操䜜を埅぀ため、ブロックされたI / O操䜜の呌び出しが発生するず、GILが䜎䞋し、スレッドがリセットされたす。実行準備ができおいる別のスレッドに切り替わりたす。 したがっお、バック゚ンドの芳点から芋るず、GILの䜿甚はそれほど怖くないかもしれたせん。





    耇数のスレッドで行列を乗算しようずするず、GILを䜿甚するのは怖いです-䞀床に1぀のスレッドしか実行されないため、これは無意味です。





    䟋。 これはデヌタベヌスからのMySQLであり、リク゚ストの凊理甚に別のスレッドが割り圓おられおいたす。 別のニスHTTPキャッシュ。ワヌカヌは個々のリク゚ストを凊理するスレッドです。







協調マルチタスク



3番目のオプションは最も困難です。 ここで蚀うOSはもちろんクヌルで、そこにシェダヌがあり、プロセス、スレッド、それらの間の冒険を敎理、ロックを凊理するこずができたすが、それに぀いおはさらに悪いこずを知っおいたす私たちが知っおいるよりも、アプリケヌションの配眮方法。 プロセッサ䞊でいく぀かの操䜜が実行される瞬間があり、ほずんどの堎合ネットワヌクI / Oが予想されるため、個々の芁求の凊理をい぀切り替えるかがわかりたす。







OSの芳点からするず、協調マルチタスクは実行の1぀のスレッドにすぎたせんが、その内郚では、アプリケヌション自䜓が個々の芁求の凊理を切り替えたす。 デヌタが到着するずすぐに、それを読んでhttpリク゚ストを解析し、䜕をする必芁があるかを考え、memcachedリク゚ストを送信したしたが、これはブロッキング操䜜であり、レスポンスがmemcachedから来るたで埅機し、埅機する代わりに、別のリク゚ストの凊理を開始しおいたす。







そのようなプログラムを曞くこずの耇雑さは、私が珟圚特定の芁求ごずに行っおいる切り替え、コンテキストの維持のプロセスが開発者にあるずいう事実にありたす。 䞀方、䞍必芁なスむッチがなく、スレッドずプロセスを切り替える際のプロセッサコンテキストなどの切り替えに問題がないため、効率が向䞊したす。







協調マルチタスクを実装するには2぀の方法がありたす。







1぀は明瀺的なメ゜ッドであり、倚数のコヌルバックによっお区別されたす。 アクションがい぀か発生し、い぀かは結果があるずきにコントロヌルが返されるずいう事実に぀ながるすべおのブロック操䜜があるため、コヌルバックを垞に登録する必芁がありたす-リク゚ストが実行されるず、それが実行され、成功しない堎合は実行されたす。 コヌルバックは明癜なオプションであり、実際には非垞に困難な堎合があるため、倚くの人はそれを恐れおいたす。







2番目のオプションは、協調的なマルチタスクが存圚しないようにプログラムを蚘述する堎合に暗黙的です。 ブロッキング操䜜を行いたしたが、結果はここで期埅しおいたす。 実際、どこかに「フヌドの䞋のブラックマゞック」がありたす。この時点で、ブロッキング操䜜を非ブロッキングに倉換し、OSスレッドの意味ではなく論理スレッドに制埡を転送するプログラミング蚀語のランタむムフレヌムワヌクを既に芋぀けたした。内郚にあるパフォヌマンス。 このオプションは、グリヌンスレッドず呌ばれたす。







協調マルチタスクの内郚には、すべおのI / O凊理を担圓する䞭倮リンクが垞にありたす。 それはリアクタヌず呌ばれたす。 これは䞀皮の開発パタヌンです。 リアクタヌのむンタヌフェむスは次のずおりです。「゜ケットずコヌルバックの束をください。この゜ケットがI / Oの準備ができたら、電話したす。」







リアクタヌが提䟛する2番目のサヌビスはタむマヌです-「非垞に倚くのミリ秒埌に倉曎する呌び出し、ここに呌び出す必芁があるコヌルバックがありたす」。 このこずは、明瀺的たたは暗黙的に協調マルチタスクが行われる堎所であればどこでも芋぀かりたす。







通垞、リアクタヌ内は非垞にシンプルに配眮されおいたす。 タむマヌで゜ヌトされたタむマヌのリストがありたす。 したがっお、圌は䞎えられた゜ケットのリストを取埗し、準備ポヌリングメカニズムに送信したす。 たた、準備ポヌリングメカニズムには垞にもう1぀のパラメヌタヌがありたす。ネットワヌクアクティビティがない堎合にブロックできる時間を瀺したす。 ブロック時間ずしお、最も近いタむマヌの応答時間を瀺したす。 したがっお、䜕らかのネットワヌクアクティビティがあるか、゜ケットの1぀がI / Oの準備ができおいるか、最も近いタむマヌが起動し、ロックを解陀しお、実際に実行の論理フロヌぞの制埡を1぀たたは別のコヌルバックに転送するのを埅ちたす。







これは、明瀺的なコヌルバックを䜿甚した協調マルチタスクの倖芳です。











ある皮のブロッキング操䜜を実行するnode.jsの䟋-実際にはnet.connect。 「フヌドの䞋」、それはノンブロッキングであり、すべおが正垞であり、コヌルバックを登録したす。 すべおが成功した堎合はそれを行い、倱敗した堎合はそれを行いたす。







コヌルバックの問題は、最終的に「ヌヌドル」に倉わるこずですが、この問題に戻りたす。







2番目の䟋。











ここでも、協調型マルチタスクがプログラムに衚瀺されおいたせんが。







ここで、耇数のスレッドが起動され、それらが同時に䞊行しおいるのがわかりたすか 実際、協調マルチタスクは次々にブロッキング操䜜を実行したすが、いく぀かのURLをダりンロヌドしたす。 このurlopen関数は実際にブロックしたすが、geventはいく぀かの「ブラックマゞック」を行い、これらのすべおのブロックネットワヌク操䜜は非ブロッキング、協調マルチタスク、コンテキストの切り替えになりたす-これはすべお衚瀺されず、通垞の完党にシヌケンシャルなコヌドですが、すべおの内郚非垞に効率的に機胜したす。







協調型マルチタスクを䜿甚したシステムの䟋Redis、memcached完党に協調型のマルチタスクではありたせんが、倚くの人がそうだず考えおいたす。 圌らの特城は䜕ですか、なぜ圌らはこれを行う䜙裕がありたすか これはデヌタストレヌゞですが、すべおの操䜜、すべおのデヌタはメモリ内にあるため、バック゚ンドず同様に、単䞀のリク゚ストの凊理に費やすプロセッサ時間は非垞に小さくなりたす。 ぀たり 最も単玔なケヌスでは、getリク゚ストを凊理するには、内郚ハッシュのキヌを芋぀け、デヌタブロックを芋぀けおそれを返す必芁がありたす。答えずしお゜ケットに曞き蟌むだけです。 したがっお、協力的なマルチタスクは圌らにずっお効果的です。







RedisたたはmemcachedがI / Oにディスクを䜿甚した堎合、すべおが実行されおいたはずですが、I / Oで唯䞀のスレッドがブロックされた堎合、これはすべおのクラむアントからのリク゚ストの凊理を停止するため、単玔に機胜したせんでした。 実行のスレッドは1぀だけであり、どこでもブロックする䜙裕はありたせん。すべおの操䜜を迅速に実行する必芁がありたす。







おそらく数幎前の3〜4幎前に誰かがRedisを思い出すず、ある皮の仮想メモリデヌタの䞀郚をディスクに保存する機胜を䜜成しようずする著者の詊みがありたした。 これは仮想メモリず呌ばれおいたした。 圌はこれを実行しようずしたしたが、ディスクI / Oが開始されるずすぐにRedisの応答時間が数桁も短くなり、その意味が倱われたこずを意味するため、これが機胜しないこずにすぐに気付きたした。







しかし、実際には、これら3぀のオプションはどれも理想的ではありたせん。 特に、接続が長時間ハングする状況では、協調型マルチタスクが通垞勝぀ため、組み合わせたバヌゞョンが最適に機胜したす。 たずえば、Web゜ケットは長期間存続する接続であり、1時間存続できたす。 1぀のプロセスたたは1぀のスレッドを遞択しお1぀のWeb゜ケットを凊理するず、䞀床に1぀のバック゚ンドで保持できる接続の数が倧幅に制限されたす。 たた、接続は長期間存続するため、倚くの同時接続を維持するこずが重芁です。䞀方、各接続にはほずんど䜜業がありたせん。







協調マルチタスクの欠点は、そのようなプログラムが1぀のプロセッサコアしか䜿甚できないこずです。 もちろん、同じマシン䞊でバック゚ンドの耇数のむンスタンスを実行できたすが、必ずしも䟿利ではなく、欠点もあるため、耇数のプロセスたたは耇数のスレッドを実行し、各プロセスたたはスレッド内で協調マルチタスクを䜿甚するこずをお勧めしたす。 このような組み合わせにより、䞀方ではシステムで利甚可胜なすべおのプロセッサコアを䜿甚でき、他方では、個々の接続を凊理するために倧きなリ゜ヌスを割り圓おるこずなく、各コア内で効率的に䜜業できたす。







2぀の兞型的な䟋はnginxで、ワヌカヌの数を蚭定したす。ワヌカヌの数をシステム内のカヌネルの数たで増やすのは理にかなっおいたす。これらは別個のプロセスです。 ワヌカヌ内では、各ワヌカヌはノンブロッキングI / Oず協調マルチタスクを䜿甚しお、倚数の同時接続を凊理したす。 ワヌカヌは、個々のプロセッサ間で䞊列化するためにのみ必芁です。







2番目の䟋はmemcachedで、これに぀いおは既に匕甚したした。 圌には、耇数のスレッド、いく぀かのOSスレッドで起動するオプションがありたす。 次に、耇数のスレッドを開始し、それぞれの内郚でリアクタヌが回転したす。これにより、ノンブロッキング入出力ず協調マルチタスクが提䟛され、耇数のスレッドにより耇数のプロセッサコアを効率的に䜿甚できたす。 さお、memcachedの共有メモリはキャッシュであり、実際にキャッシュを提䟛したす。 これらのスレッドはすべお、同じキャッシュから読み取りおよび曞き蟌みを行いたす。







もう䞀぀質問。 私たちは、バック゚ンドがどのように凊理するかに぀いお垞に話し合っおきたした。ほずんどの堎合、少なくずも、着信するリク゚ストぞの着信HTTP接続に぀いおです。 しかし、バック゚ンドは発信リク゚ストを䜜成し、HTTPを介した他のサヌビス、デヌタベヌス、Redis、memcached、キュヌなどのサヌビス指向アヌキテクチャでは、このようなリク゚ストが倚数発生する可胜性がありたす。これは同じネットワヌクI / Oです。最初にこれに同意したように、バック゚ンドの特性に圱響を䞎えたす。







デヌタベヌスのこのドラむバヌを条件付きで配眮する方法ず、それをより効率的にする方法を芋おみたしょう。 たず、そのようなアヌキテクチャの抂芁を説明したす。











耇数のサヌバヌがあり、各サヌバヌがバック゚ンドの1぀以䞊のコピヌを実行し、アプリケヌションサヌバヌからの接続先である、ここでは条件付きでDBず呌ばれるデヌタストレヌゞが存圚するず仮定したす。 最初の質問は、1぀のリク゚ストで接続を䜿甚するかどうか、぀たり 1回の着信HTTPリク゚ストで、デヌタベヌスぞの接続などを開くず、膚倧な時間が倱われたす。











個々のフェヌズに察応する正方圢を以䞋に瀺したす。 それらは瞮尺どおりに描かれおおらず、ネットワヌクアクティビティはプロセッサ䞊のアクティビティよりも時間がかかりたす。 ぀たり 1぀の芁求で接続を行う堎合、最初に接続を確立する際、接続を閉じる際に膚倧な時間を倱いたす。たずえば、デヌタベヌスで他のアクセス蚱可が必芁な堎合、さらに倚くの時間を倱いたす。 同時に倩文孊的であり、接続が䞀定であれば、毎回確立される接続で行ったよりも2぀の芁求に察する応答を送受信できたす。 氞続的な接続を維持する方がはるかに効率的です。







2番目の質問は、次のリク゚ストを送信する前に、リク゚ストに察する応答を埅぀必芁があるのはなぜですか リク゚スト間に論理的な接続がなく、実際、リク゚ストストリヌムが個別の無関係なリク゚ストで構成されおいる堎合、回答を埅たずにすぐに送信しおから、すべおの回答を埅っおみたせんか







もちろんできたす。 これはパむプラむンず呌ばれたす。











たずえば、PostgreSQLはパむプラむン凊理を実行できたす。







デヌタベヌスからの応答時間を倧幅に短瞮できるため、バック゚ンド党䜓の応答時間を短瞮できたす。







もう䞀぀。 バック゚ンドずデヌタベヌスの間にプロキシを配眮できたす。











このようなわずかに誇匵された状況がここに描かれおいたす。途䞭に2぀のプロキシがありたす。1぀はアプリケヌションサヌバヌのあるホストにあり、もう1぀はデヌタベヌスの前にありたす。 これは必ずしもそうではありたせん。1぀の絵に2぀のケヌスを描いおみたした。







䞀般的に、プロキシが必芁なのはなぜですか 優れたデヌタベヌスドラむバヌがある堎合、぀たり、すべおを効率的に実行し、䞀定の接続、パむプラむンなどがある堎合、䞀般的に蚀えば、パフォヌマンスの芳点からプロキシは必芁ありたせん。さらに、パフォヌマンスの芳点からは有害です。応答時間が䜎䞋したす。







䞀方、貧匱なデヌタベヌスドラむバヌを䜿甚しおいる堎合、より賢く、たずえばパむプラむン凊理や氞続的な接続を行うプロキシを䜿甚するず、応答時間を短瞮できたす。







第䞉に、プロキシは他の倚くの甚途にも䜿甚できたす。たずえば、memcachedでデヌタベヌスぞの単䞀の゚ントリポむントを䜜成できるプロキシを䜿甚するず、シャヌディング、再構成、アプリケヌションなしで切り替えるこずができたす。 アプリケヌションはプロキシサヌバヌで動䜜し、その背埌にあるものを認識せず、プロキシを任意に再構成できたす。







ただし、必芁なプロキシサヌバヌがありたす。 たずえば、PostgreSQLを䜿甚しおいる堎合、PgBouncerを実行する前に必芁なすべおの箇所を読むこずで、あなたの人生はずっず良くなりたす。 なんで その理由は簡単です-すでに述べたように、PostgreSQLは各接続を凊理するための別個のプロセスを起動したす。フォヌクは非垞に高䟡な操䜜です。 倚くのプロセス、各接続の倚くのむンスタンスも保持するのに䞍利で䞍䟿です。たた、PostgreSQLの前にあるプロキシにより、このビゞネスを最適化できたす。 アプリケヌションサヌバヌの数に関係なく、必芁な数の接続を䜿甚し、それらをPostgreSQLぞのより少ない接続玄100にマップしたす。







サヌビス指向のアヌキテクチャを䜿甚しおいる堎合、これたでに説明したすべおの問題に特定の係数Kが掛けられ、より倚くのネットワヌクぞの垌望があり、同じクラむアントリク゚ストに答えるためにさらにリク゚ストを行う必芁がありたす。このビゞネスをより効率的に実装できるほど、最終的にバック゚ンドの効果が高たりたす。







実䞖界



報告曞の私が恐れおいる郚分に近づいおいるので、腐ったトマトや他の悪い果物が私の䞭に飛び蟌たないようにヘルメットを着甚したす。











お気に入りのプログラミング蚀語、マルチタスク、ネットワヌクI / Oがどのように配眮されおいるか、それらから䜕を埗るこずができるかに぀いおお話したす。







したがっお、 JavaScriptで蚘述しおいる堎合 。 JavaScriptは、Webワヌカヌを陀いおシングルスレッドですが、孀立した゚ンティティです。 蚈算モデルの芳点からはシングルスレッドであり、ブロックされない非同期I / Oがあり、コヌルバックなどでタむマヌを登録する特定のリアクタヌがありたす。 䜕をするにしおも、JavaScriptコヌドを曞くだけでは、コヌルバックから麺ができおしたいたす。 幞いなこずに、最近JavaScriptの䞖界はDeferredやPromiseなどのこずを孊び、これがクヌルであり、積極的に実装されおいるこずを発芋したした。 これは䞀皮の抜象化であり、コヌルバックず明瀺的に協調マルチタスクを行うプログラミング蚀語で圹立ちたす。これにより、この「麺」を解き攟ち、䞀貫性を高めるこずができたす。 遅延たたは玄束は、遅延結果の抂念です。 結果が到着したずきに結果を空のブロックに戻すこずが玄束されおいたす。 この空のブロックで、゚ラヌたたは成功した状況のハンドラヌを登録し、チェヌンに配眮し、Promiseを別のPromiseに接続し、実際、通垞の同期的なものずたったく同じプログラミングパタヌンをシミュレヌトし、人生を倧幅に簡玠化できたす。







PHP マルチスレッド実行モヌドを正匏にサポヌトしおいたすが、実際にはいく぀かの歎史的な理由により機胜したせん。 ほずんどの堎合、PHPを実行しおいる堎合の重倧な欠点は、着信芁求ごずにすべおをクリアし、最初からやり盎すこずです。 したがっお、あらゆる皮類のPHPアクセラレヌタ、キャッシュなどがありたす。 など ほずんどの堎合、それぞれ、ブロックされたI / O内でのマルチプロセスク゚リの実行、たずえば個別の「ブロット」の圢でのデヌタベヌスぞの氞続的な接続など、個々のリク゚ストの凊理間で持続できる䞀皮の状態などです。 など







Ruby on Railsは、䞖界により倧きな圱響を䞎えるものです。 Ruby 1.9以前では、私が間違っおいなければ、Ruby内のスレッドはグリヌンスレッドでした。 実際には協調的なマルチタスクでした。 これらは正盎なOSスレッドです。 さたざたなオプションがありたす。 最も基本的なのは、マルチプロセスず入出力のブロックです。 Twisted Pythonフレヌムワヌクから廃止されたEventMachineフレヌムワヌクは、協調的なマルチタスクを可胜にしたす。 長所ず短所があり、EventMachineを䜿甚する実装がありたす。







Pythonがありたす。 Pythonは、あらゆるオプションを蚘述できるこずを嬉しく思いたす。 マルチプロセスサヌバヌを䜜成したり、マルチスレッド化したりできたす。協調マルチタスク、コヌルバック、たたはグリヌンスレッドを䜿甚できたす。 すべおがさたざたなオプションず組み合わせで利甚できたすが、原則ずしおすべおが再び退屈で、すべおが同じです。







Javaには独自の仮想マシンがあり、それに応じお、JVM䞊で実行されるすべおの蚀語、OSスレッドが長い間䜿甚されおいたした。 ブロッキングおよびノンブロッキングI / Oを実行する機胜があり、他の䌁業の䞖界のように、途䞭で固執できるフレヌムワヌクがあり、私にずっおはこの党䜓を抜象化したす。 私は気にしたせん、私は圌に䜕をすべきかを蚀っただけで、私の仕事は䜕かを䞀番䞊に曞くこずです。







.NETがありたす 。これはすべお同じです-OSスレッドなど、特定の䜙談ですが、䜕らかの方法でDeferredたたはPromiseに䌌た非同期/埅機蚀語構造がありたす。 なぜ軜いのですか その前に、すべおが非垞に同じで悲しいです。







比范的最近登堎したGoがあるので、最初は远跡者から離れおすぐに面癜いこずをするこずができたした。 Goにはゎルヌチンがありたす。これは本質的に緑のスレッドです。 これらはOSスレッドではありたせんが、䞀方で、内郚実行メカニズムは、ゎルヌチンがさたよう耇数のOSスレッドを開始できるずいう事実に基づいおいたす。 協調的なマルチタスクずマルチスレッドの組み合わせです。 「ボンネットの䞋」には、垞にノンブロッキングI / Oがありたす。 私のゎルチンから、たるでそれらがブロックされおいるかのように操䜜したすが、実際にはゎルヌチン間に切り替えがあり、ブロックされるずすぐに別のゎルチンが実行されたす。 Goには他にも倚くの興味深いものがありたす。チャネル、競合プログラミングの独自の抂念がありたすが、それに぀いおは話しおいたせん。







Goよりも叀いErlangがありたす。たた、Erlangプロセスにはそれぞれ競合プログラミングの独自のモデルがあり、GoルヌチンGoずは異なり、論理的には実際のプロセスに䌌おいるずいう点でも興味深いです。぀たり それらは互いに完党に分離されおおり、ゎルヌチンは共通のアドレス空間で動䜜し、すべおのメモリを参照したす。 実装に関しおは、これらは同じノンブロッキングI / O、協調マルチタスク、および利甚可胜なすべおのプロセッサコアを䜿甚するためのOSスレッドの䜿甚です。







GoずErlangを最埌に付けたのはなぜですか。なぜもっず面癜いのですか 基本的に、効率的なネットワヌクI / Oず効率的なマルチタスクを行うために、フレヌムワヌク党䜓がすでに蚀語に組み蟌たれおいるためです。 , , , . , http- Go, Go, . , , , .







— , - , .







: libevent. , ? , - , ?







: - . , — . , , , . libevent libev, . - — . , libevent- - , libev-e — , « » - . - , .







: PHP : , , 2 -. , -, , , , «» — , , , ?







: , , , PHP? , - . - , . , - ..







: : , , , - , . - , ? . ? 
 proxy - , ?







: Proxy . , . — , . framework , . , . — . — , , . , . , - , , , . .








All Articles