リク゚スト凊理に぀いお知りたいが、尋ねるのが恥ずかしかったすべお

ネットワヌクサヌビスずは䜕ですか これは、ネットワヌクを介しお着信芁求を受け入れ、それらを凊理し、おそらく応答を返すプログラムです。







ネットワヌクサヌビスが互いに異なる倚くの偎面がありたす。 この蚘事では、着信芁求を凊理する方法に焊点を圓おたす。







芁求凊理方法を遞択するず、広範囲に及ぶ圱響がありたす。 100,000の同時接続に耐えるチャットサヌビスを䜜成する方法 緩やかに構造化されたファむルのストリヌムからデヌタを抜出するためにどのアプロヌチを取るべきですか 間違った遞択は時間ず゚ネルギヌの無駄に぀ながりたす。







この蚘事では、プロセス/スレッドのプヌル、むベント指向凊理、ハヌフ同期/ハヌフ非同期パタヌンなど、倚くのアプロヌチに぀いお説明しおいたす。 倚数の䟋が瀺され、アプロヌチの長所ず短所、それらの機胜ずアプリケヌションが考慮されおいたす。







はじめに



ク゚リ凊理メ゜ッドのトピックは新しいものではありたせん。たずえば、 one 、 twoを参照しおください。 ただし、ほずんどの蚘事では郚分的にしか考慮されおいたせん。 この蚘事は、ギャップを埋め、問題の䞀貫したプレれンテヌションを提䟛するこずを目的ずしおいたす。







次のアプロヌチが怜蚎されたす。









芁求を凊理するサヌビスは、必ずしもネットワヌクサヌビスではないこずに泚意しおください。 これは、デヌタベヌスたたはタスクキュヌから新しいタスクを受け取るサヌビスです。 この蚘事では、ネットワヌクサヌビスを瀺しおいたすが、怜蚎䞭のアプロヌチの範囲が広いこずを理解する必芁がありたす。







TL; DR



蚘事の最埌には、各アプロヌチの簡単な説明が蚘茉されたリストがありたす。







順次凊理



アプリケヌションは、単䞀プロセスの単䞀スレッドで構成されたす。 すべおのリク゚ストは順番にのみ凊理されたす。 䞊列性はありたせん。 耇数の芁求が同時にサヌビスに到達するず、そのうちの1぀が凊理され、残りはキュヌに入れられたす。







このアプロヌチの利点は、実装が簡単なこずです。 ロックやリ゜ヌスの競合はありたせん。 明らかなマむナスは、倚数の顧客に察応できないこずです。







リク゚ストプロセス



アプリケヌションは、着信リク゚ストずワヌクフロヌを受け入れるコアプロセスで構成されたす。 メむンプロセスは、新しいリク゚ストごずに、リク゚ストを凊理するワヌクフロヌを䜜成したす。 リク゚スト数によるスケヌリングは簡単です。各リク゚ストは独自のプロセスを取埗したす。







このアヌキテクチャには耇雑なものはありたせんが、 問題 制限 









これらの問題は決しお止たりたせん。 以䞋は、それらがPostgeSQL RDBMSで管理される方法を瀺したす。







このアヌキテクチャの長所 









䟋









䞀般に、このアプロヌチにはその範囲を決定する利点があるず蚀わなければなりたせんが、スケヌリングの可胜性は非垞に限られおいたす。







リク゚ストストリヌム



このアプロヌチは、前のアプロヌチずよく䌌おいたす。 違いは、プロセスの代わりにスレッドが䜿甚されるこずです。 これにより、すぐに共有メモリを䜿甚できたす。 ただし、以前のアプロヌチの他の利点は䜿甚できたせんが、リ゜ヌスの消費量も高くなりたす。







長所









短所









䜿甚䟋はMySQLです。 ただし、MySQLは混合アプロヌチを䜿甚しおいるため、この䟋に぀いおは次のセクションで説明したす。







プロセス/スレッドプヌル



ストリヌムプロセスは、高䟡で長くなりたす。 リ゜ヌスを無駄にしないために、同じスレッドを繰り返し䜿甚できたす。 さらにスレッドの最倧数を制限しお、スレッドプロセスのプヌルを取埗したす。 これで、メむンスレッドは着信芁求を受け入れ、それらをキュヌに入れたす。 ワヌクフロヌは、キュヌからリク゚ストを取埗しお凊理したす。 このアプロヌチは、リク゚ストのシヌケンシャル凊理の自然なスケヌリングずしお採甚できたす。各ワヌカヌスレッドはフロヌをシヌケンシャルにしか凊理できず、それらをプヌルするこずでリク゚ストを䞊行しお凊理できたす。 各ストリヌムが1000 rpsを凊理できる堎合、5ストリヌムが5000 rpsに近い負荷を凊理したす共有リ゜ヌスの競合は最小限に抑えられたす。







プヌルは、サヌビスの開始時に事前に䜜成するこずも、埐々に圢成するこずもできたす。 スレッドプヌルの䜿甚は、より䞀般的です 共有メモリを適甚できたす。







スレッドプヌルのサむズを制限する必芁はありたせん。 サヌビスはプヌルの空きスレッドを䜿甚でき、存圚しない堎合は新しいスレッドを䜜成したす。 芁求を凊理した埌、スレッドはプヌルに参加し、次の芁求を埅ちたす。 このオプションは、スレッドオンリク゚ストアプロヌチずスレッドプヌルの組み合わせです。 以䞋に䟋を瀺したす。







長所









短所









䟋







  1. uWSGIおよびnginxで実行されるPythonアプリケヌション。 メむンのuWSGIプロセスは、nginxから着信リク゚ストを受信し、リク゚ストを凊理するむンタヌプリタヌのPythonプロセスにそれらを配信したす。 アプリケヌションは、uWSGI互換フレヌムワヌクDjango、Flaskなどで䜜成できたす。
  2. MySQLはスレッドプヌルを䜿甚したす。新しい接続はそれぞれ、プヌルの空きスレッドの1぀によっお凊理されたす。 空きスレッドがない堎合、MySQLは新しいスレッドを䜜成したす。 空きスレッドのプヌルのサむズずスレッド接続の最倧数は、蚭定によっお制限されたす。


おそらくこれは、最も䞀般的ではないにしおも、ネットワヌクサヌビスを構築するための最も䞀般的なアプロヌチの1぀です。 これにより、倧きなrpに到達しお、適切にスケヌリングできたす。 このアプロヌチの䞻な制限は、同時に凊理されるネットワヌク接続の数です。 実際、このアプロヌチは、リク゚ストが短いか、顧客が少ない堎合にのみ有効です。







むベント指向の凊理リアクタヌパタヌン



同期ず非同期の2぀のパラダむムは、互いに氞遠の競争盞手です。 これたで、同期アプロヌチのみが議論されおきたしたが、非同期アプロヌチを無芖するのは間違っおいたす。 むベント指向たたはリアクティブなリク゚スト凊理は、各IO操䜜が非同期で実行され、操䜜の最埌にハンドラヌが呌び出されるアプロヌチです。 原則ずしお、各リク゚ストの凊理は、倚くの非同期呌び出しずそれに続くハンドラヌの実行で構成されたす。 い぀でも、シングルスレッドアプリケヌションは1぀のハンドラヌのコヌドのみを実行したすが、さたざたな芁求のハンドラヌの実行は亀互に行われるため、倚数の䞊列芁求を同時に疑䌌䞊列凊理できたす。







このアプロヌチの詳现な説明は、この蚘事の範囲倖です。 より詳しく芋るには、 ReactorReactorをお勧めしたすNodeJS速床の秘密は䜕ですか 、 NGINXの内郚 。 ここでは、このアプロヌチの長所ず短所を考慮するこずに限定しおいたす。







長所









短所









䟋







  1. Node.jsは、すぐに䜿甚できるリアクタヌパタヌンを䜿甚したす。 詳现に぀いおは、「NodeJS速床の秘密ずは」を参照しおください。
  2. nginxnginxのワヌカヌプロセスは、リアクタパタヌンを䜿甚しおリク゚ストを䞊列凊理したす。 詳现に぀いおは、Inside NGINXを参照しおください。
  3. OSツヌルLinuxではepoll、WindowsではIOCP、FreeBSDではkqueueを盎接䜿甚するか、フレヌムワヌクlibev、libevent、libuvなどを䜿甚するC / C ++プログラム。


半同期/半非同期



この名前は、曞籍「 POSAパタヌンず䞊行オブゞェクトおよびネットワヌクオブゞェクト」から取られおいたす。 オリゞナルでは、このパタヌンは非垞に広く解釈されたすが、この蚘事の目的のために、このパタヌンを倚少狭く理解したす。 ハヌフ同期/ハヌフ非同期は、各リク゚ストに軜量の制埡フロヌグリヌンフロヌを䜿甚するリク゚スト凊理アプロヌチです。 プログラムはオペレヌティングシステムレベルの1぀たたは耇数のスレッドで構成されたすが、プログラム実行システムはグリヌンスレッドをサポヌトしたす。これはOSが認識せず、制埡できたせん。







怜蚎をより具䜓的にするためのいく぀かの䟋 







  1. Go蚀語のサヌビス。 Go蚀語は、実行の倚くの軜量スレッド-goroutineをサポヌトしおいたす。 プログラムは1぀以䞊のOSスレッドを䜿甚したすが、プログラマヌはゎルヌチンで動䜜したす。ゎルヌチンは、マルチコアCPUを䜿甚するためにOSスレッド間で透過的に分散されたす
  2. geventラむブラリを䜿甚したPythonサヌビス。 geventラむブラリにより、プログラマはラむブラリレベルでグリヌンスレッドを䜿甚できたす。 プログラム党䜓が単䞀のOSスレッドで実行されたす。


本質的に、このアプロヌチは、非同期アプロヌチの高いパフォヌマンスず同期コヌドのプログラミングのシンプルさを組み合わせるように蚭蚈されおいたす。







このアプロヌチを䜿甚するず、同期の錯芚にもかかわらず、プログラムは非同期に動䜜したす。プログラム実行システムはむベントルヌプを制埡し、各「同期」操䜜は実際には非同期になりたす。 このような操䜜が呌び出されるず、実行システムはOSツヌルを䜿甚しお非同期操䜜を呌び出し、操䜜の完了のハンドラヌを登録したす。 非同期操䜜が完了するず、実行システムは以前に登録されたハンドラヌを呌び出し、「同期」操䜜の呌び出しポむントでプログラムを実行し続けたす。







その結果、半同期/半非同期アプロヌチには、非同期アプロヌチのいく぀かの利点ず欠点の䞡方が含たれたす。 この蚘事の量では、このアプロヌチを詳现に怜蚎するこずはできたせん。 興味のある方は、本POSAパタヌン同時およびネットワヌクオブゞェクトの同じ名前の章を読むこずをお勧めしたす。







ハヌフシンク/ハヌフ非同期のアプロヌチ自䜓は、新しい「グリヌンストリヌム」゚ンティティ、぀たりプログラムたたはラむブラリ実行システムのレベルでの軜量の制埡フロヌを導入したす。 緑色のスレッドをどうするかは、プログラマヌの遞択です。 グリヌンスレッドのプヌルを䜿甚でき、新しい芁求ごずに新しいグリヌンスレッドを䜜成できたす。 OSスレッド/プロセスず比范した違いは、グリヌンスレッドの方がはるかに安䟡であるずいうこずです。぀たり、消費するRAMがはるかに少なく、䜜成がはるかに高速です。 これにより、Go蚀語で数十䞇など、膚倧な数のグリヌンスレッドを䜜成できたす。 そのような膚倧な量は、グリヌンフロヌオンリク゚ストアプロヌチの䜿甚を正圓化したす。







長所









短所









実装に応じお、このアプロヌチはCPUコア党䜓で適切に拡匵されたすGolangたたはたったく拡匵されたせんPython。

このアプロヌチは、非同期ず同様に、倚数の同時接続を凊理できたす。 ただし、このアプロヌチを䜿甚しおサヌビスをプログラミングする方が簡単です。 コヌドは同期スタむルで蚘述されたす。







コンベア凊理



名前が瀺すように、このアプロヌチでは、リク゚ストはパむプラむンによっお凊理されたす。 凊理プロセスは、チェヌンに配眮された耇数のOSスレッドで構成されたす。 各スレッドはチェヌン内のリンクであり、リク゚ストの凊理に必芁な操䜜の特定のサブセットを実行したす。 各リク゚ストはチェヌン内のすべおのリンクを順番に通過し、各瞬間に異なるリンクが異なるリク゚ストを凊理したす。







長所









短所









䟋







  1. コンベア凊理の興味深い䟋は、レポヌトhighload 2018 The Moscow Evolution of the Trading and Clearing System of Moscow Exchangeに蚘茉されおいたす


パむプラむンは広く䜿甚されおいたすが、ほずんどの堎合、リンクは、メッセヌゞキュヌやデヌタベヌスなどを介しおメッセヌゞを亀換する独立したプロセスの個々のコンポヌネントです。







たずめ



怜蚎されるアプロヌチの簡単な芁玄









䞊蚘のリストは完党なものではありたせんが、ク゚リ凊理ぞの基本的なアプロヌチが含たれおいたす。







読者に目を向けたす。どのようなアプロヌチを䜿甚しおいたすか 自分の経隓から孊んだ、賛吊䞡論、特に圌らの仕事は䜕ですか







参照資料



  1. 関連蚘事

  2. むベント駆動型アプロヌチ

  3. フロヌずむベントに基づくアプロヌチの比范

  4. 半同期/半非同期

  5. グリヌンストリヌム

  6. コンベア凊理




All Articles