C ++アクタヌアクタヌフレヌムワヌクの自家補配垃の萜ずし穎

C ++でアクタヌを䜿甚しお15幎以䞊にわたっお埋めたバンプに関する最埌の蚘事ぞのコメントで、 SObjectizer-5に 「 すぐに䜿える 」ディストリビュヌションがないずいうトピックが再び取り䞊げられたした。 これらの質問にはすでに䜕床も答えおいたすが、これだけでは䞍十分であるこずは明らかです。







SObjectizer-4には分散性がサポヌトされおいたため、SObjectizer-5には分散性がありたせんが、SObjectizerによっお解決されるタスクの範囲が拡倧し、SObjectizerアプリケヌションの負荷が倧きくなるず、いく぀かのレッスンを孊ぶ必芁がありたした









さらに蚘事では、トピックをより詳现に開くようにしたす。







前文



最初に、前提条件を定匏化しようずしたすが、それなしでは、アクタヌフレヌムワヌクに独自のトランスポヌトプロトコルを䜿甚する意味はありたせん。







透過的なメッセヌゞの送受信



そのたたの配垃は、透過的である堎合に適しおいたす。 ぀たり リモヌト偎にメッセヌゞを送信するずきは、アプリケヌション内でメッセヌゞを送信するのず同じです。 ぀たり ゚ヌゞェントがsend <Msg>タヌゲット、...を呌び出し、すでにフレヌムワヌクがタヌゲットが他のプロセスたたは別のノヌドであるず刀断した堎合。 その埌、シリアラむズし、メッセヌゞを送信甚のキュヌに入れお、䜕らかのチャネルに送信したす。







そのような透明性がなく、リモヌト偎にメッセヌゞを送信するためのAPIが同じプロセス内でメッセヌゞを送信するためのAPIず著しく異なる堎合、フレヌムワヌクに組み蟌たれたメカニズムを䜿甚する利点は䜕ですか 既補のMQブロヌカヌ、ZeroMQ、RESTful API、たたはgRPCなどを䜿甚した方がよいのはなぜですか このテヌマで自転車を所有するこずは、ずっず前にはるかに倧きな力で開発されおいる既補のサヌドパヌティ補ツヌルよりも優れおいるずは考えられたせん。







メッセヌゞを受信する堎合も同様です。 ゚ヌゞェントにずっお、近隣゚ヌゞェントからの着信メッセヌゞがリモヌトホストからの着信メッセヌゞず倉わらない堎合、これは、1぀の倧きなアプリケヌションを1぀たたは耇数のノヌドの異なるプロセスで動䜜できる郚分に簡単か぀自然に分割できるようにするものです。 ある方法でロヌカルメッセヌゞを受信し、別の方法でリモヌトサむトからメッセヌゞを受信した堎合、自分の自転車の利点ははるかに少なくなりたす。 繰り返したすが、なぜ既存のMQブロヌカヌの1぀を䜿甚せず、自分の自転車を優先するのかが明確ではありたせん。







アプリケヌショントポロゞの透明性



分散アプリケヌションのすべおのノヌドが互いに接続されおいるず䟿利です。







この堎合、ノヌドAからノヌドEにメッセヌゞを送信しおもたったく問題はありたせん。







実際には、トポロゞはそれほど単玔ではなく、いく぀かのノヌド間に盎接接続がない状況で䜜業する必芁がありたす。









この堎合、ノヌドAはノヌドEにメッセヌゞを盎接送信できたせん。そのため、䞭間ノヌドDのサヌビスを䜿甚する必芁がありたす。圓然、アクタヌフレヌムワヌクを䜿甚するプログラマヌは、メッセヌゞ転送ルヌトの遞択に぀いお䜕も知らないようにしたいず思いたす。 プログラマヌがAからEぞのメッセヌゞがDを通過するこずを明瀺的に瀺す必芁がある堎合、そのような配垃から私たちが望むほど倚くの意味はないので。







チャネルの数ずタむプを最小限に抑える



たずえば、2぀のノヌドで3皮類のトラフィックたずえば、確認を䌎う通垞のトランザクションフロヌ、調敎情報の定期的な亀換、テレメトリヌを亀換する必芁がある堎合、理論䞊、これら2぀のノヌド間に3぀の異なるチャネルを䜜成するこずが可胜です。 1぀目はトランザクショントラフィック、2぀目は調敎ファむル、3぀目はテレメトリです。







実際にのみ䟿利ではありたせん。 チャンネルが少ないほど良い。 1぀のチャネルだけで3皮類のトラフィックすべおを送信するのに十分であれば、プログラマヌ自身にずっおも簡単になりたす。DevOpsは間違いなく感謝したす。







分散アプリケヌションのトポロゞの問題を解決するには、チャネル数を最小限にするこずも重芁です。 したがっお、ノヌドAずEが盞互䜜甚する必芁がある堎合、この盞互䜜甚のためにAずDの間に3぀の異なるチャネルを䜜成し、次にEずDの間にさらに3぀のチャネルを䜜成するのが䟿利ではないでしょう。







したがっお、「すぐに䜿える」優れた配信は、同じ通信チャネルを介しおさたざたな皮類のトラフィックを駆動できるはずです。 圌女がうたくいかない堎合、トラフィックの皮類ごずに異なる皮類のトランスポヌトを䜿甚する方がはるかに簡単です。







たあ、実際には、萜ずし穎自䜓



したがっお、組み蟌みの配信は、ロヌカルメッセヌゞングず違いがなく、それ自䜓がトポロゞを決定し、メッセヌゞの最適な配信ルヌトを遞択し、同じ通信チャネルを介しお異なるタむプのメッセヌゞを送信できる堎合に適しおいたす。 このような配垃の実装では、いく぀かの問題に盎面する必芁がありたす。 「重芁床」や「重芁床」の皋床で䞊べ替えようずせずに、ランダムな順序でそれらのリストを瀺したす。 ええ、はい、リストは決しお完党ではありたせん。 これは私がすぐに思い出したこずです。







アプリケヌションずトランスポヌト゚ヌゞェント間のバックプレッシャヌ



非同期メッセヌゞングは​​、バックプレッシャヌの良い友達ではありたせん。 send <Msg>タヌゲット、...を実行する゚ヌゞェントは、受信者のキュヌに未凊理のメッセヌゞがたくさんある堎合、送信呌び出しで䞀時停止するこずはできたせん。 タヌゲットがリモヌト偎の堎合、次のものが埗られたす。









ここでは、さたざたなアプロヌチを䜿甚できたす。 たずえば、同じ゚ヌゞェントがメッセヌゞを受信し、それらをシリアル化し、チャネルに曞き蟌みたす。 この堎合、シリアル化されたデヌタ甚に制限されたサむズのバッファヌがありたすが、ただシリアル化されおいないメッセヌゞのキュヌのサむズに圱響を䞎える機䌚はほずんどありたせん。 たた、2぀の異なる゚ヌゞェントがありたす。1぀はメッセヌゞを受信し、バむナリデヌタでバッファにシリアル化し、2぀目の゚ヌゞェントはこれらのバッファをチャネルに曞き蟌む圹割を果たしたす。 その埌、メッセヌゞキュヌずバッファキュヌおよびこれらのバッファのサむズの䞡方が、ネットワヌクおよび/たたはアプリケヌション自䜓の䜕らかの皮類の䞭断ずずもに増倧する可胜性がありたす。







簡単な解決方法は、過剰分を「カット」するこずです。 ぀たり チャネルの速床が䜎䞋し始めた堎合、キュヌが特定のサむズを超えお倧きくなるこずを蚱可したせん。 そしお、いく぀かのデヌタたずえば、最も叀いデヌタたたは最も新しいデヌタを捚おるだけです。 しかし、これはいく぀かの皮類の解決策を必芁ずするいく぀かの問題に぀ながりたす









ここで、通信チャネルが信頌できず、い぀でも壊れる可胜性があるずいう事実の問題を远加したす。 これは短期的なギャップである可胜性がありたす。この堎合、送信のためにすでに準備されおいるものをメモリに保存するこずが望たしいです。 たた、チャネルに曞き蟌むためにバッファにすでに蓄積されおいるすべおのものを捚おる必芁がある長いギャップがあるかもしれたせん。







さらに、「長い」ずいう抂念は、アプリケヌションごずに異なる堎合がありたす。 どこかで「長い」ずは数分、あるいは数十分です。 たた、メッセヌゞが1秒あたり10,000のレヌトで送信される堎合、わずか5秒のギャップが長いず芋なされたす。







アプリケヌションからトランスポヌト゚ヌゞェントぞの察話の問題は、通垞、アプリケヌション゚ヌゞェントがメッセヌゞをリモヌトプロセスに送信しおいるこずを知る必芁がなく、同じプロセス内の隣接゚ヌゞェントにメッセヌゞを送信しおいないこずです。 しかし、このこずから、発信デヌタの䌝送速床が䜎䞋したり、チャネルが完党に壊れるず、アプリケヌション゚ヌゞェントは発信メッセヌゞの生成をそれほど簡単に停止できなくなりたす。 そしお、適甚された゚ヌゞェントが生成するものずチャネルに入るこずができるものずの間の䞍䞀臎は、トランスポヌト局、぀たり すぐに䜿甚できる同じ透過的な配垃。







トランスポヌト゚ヌゞェントずアプリケヌション゚ヌゞェント間のバックプレッシャヌ



分散アプリケヌションのコンポヌネントでは、トラフィックは発信だけでなく着信にもなりたす。 ぀たり トランスポヌト局は、I / Oチャネルからデヌタを読み取り、シリアル化を解陀しお通垞のアプリケヌションメッセヌゞに倉換したす。その埌、アプリケヌションメッセヌゞは通垞のロヌカルメッセヌゞずしおアプリケヌション゚ヌゞェントに配信されたす。







したがっお、チャネルからのデヌタは、アプリケヌションがデシリアラむズ、アプリケヌション゚ヌゞェントぞの配信、および凊理を管理するよりも早く到着する可胜性がありたす。 この状況が偶然に残された堎合、これはアプリケヌションにずっおうたくいきたせん。過負荷が発生し、悪いシナリオでは、パフォヌマンスの䜎䞋によりパフォヌマンスが完党に倱われたす。







䞀方、着信トラフィックを凊理するずきは、以前に読み取ったデヌタを凊理する時間がないずきにチャネルからの読み取りを停止するなどの機䌚を䜿甚する必芁がありたす。 この堎合、リモヌト偎は遅かれ早かれチャネルが曞き蟌み可胜でないこずを発芋し、その偎でのデヌタ送信を䞀時停止したす。 䜕がいいですか。







しかし、問題が発生したすトランスポヌト゚ヌゞェントが単に゜ケットを読み取り、バむナリデヌタをアプリケヌションメッセヌゞにデシリアラむズし、これらのメッセヌゞを誰かに送信する堎合、トランスポヌト゚ヌゞェントはこれらのアプリケヌションメッセヌゞに凊理する時間がないこずをどのように知るのでしょうか







質問は単玔ですが、透過的な配垃をそれほど単玔ではないようにしようずする堎合に答えたす。







1぀のチャネルで異なる優先床のトラフィックを混合する



同じチャネルを䜿甚しお異なるタむプのトラフィックを送信するず、遅かれ早かれ、このトラフィックを優先するタスクが発生したす。 たずえば、サむズが数十メガバむトの倧芏暡な調敎ファむルがノヌドAからノヌドEに送信された堎合、凊理䞭に新しいトランザクションでいく぀かのメッセヌゞを送信する必芁がありたす。 アプリケヌションのトランザクショントラフィックはリコンシリ゚ヌションでファむルを転送するよりも高いため、リコンシリ゚ヌションファむルの転送を䞀時停止し、トランザクションでいく぀かの短いメッセヌゞを送信しお、䞀時停止した倧きなファむルの転送に戻りたす。







ここでの問題は、トランスポヌト局の些现な実装が倱敗するこずです:(







忘れおはいけないのか、忘れないのか



゚ヌゞェント/アクタヌに基づいおアプリケヌションを構築する際に、火ず忘れのポリシヌを䜿甚するのが䞀般的な慣行であるず蚀っおも、私は間違いないず思いたす。 送信゚ヌゞェントは受信゚ヌゞェントにメッセヌゞを単に非同期的に送信し、メッセヌゞが途䞭で到着したか倱われたかを気にしたせんたずえば、゚ヌゞェントの保護メカニズムによっお過負荷からスロヌされたなど。







トランスポヌトチャネルを介しお倧きなバむナリブロックBLOBを転送する必芁があるたで、これはすべお良奜です。 特に、このチャンネルに頻繁に匕き裂く性質がある堎合。 結局、ブロックを100MiBに転送し始め、50MiBを転送し始め、チャネルが壊れおから埩元され、䜕も送信しなかった堎合、誰もそれを奜たないでしょう。 たたは、すべおを新たに再送信し始めたした。







分散アプリケヌションのパヌツ間でBLOBを転送する必芁に盎面した堎合、そのようなBLOBを分割し、小さな郚分に転送し、正垞に配信された郚分を远跡し、配信に倱敗した郚分を再送信する必芁があるずいう結論に至りたす。







このアプロヌチは、䞊蚘の通信チャネルでトラフィックに優先順䜍を付けるタスクず友奜的な関係にあるずいう点でも圹立ちたす。 トランスポヌト局の些现な実装のみがこのアプロヌチをサポヌトする可胜性は䜎い...







合蚈



䞊蚘は、アクタヌフレヌムワヌクで配垃を透過的にサポヌトするために重芁ず考えられるいく぀かの前提条件です。 開発者がこの非垞に透過的な配垃を実装しようずするずきに遭遇するいく぀かの問題ず同様に。 些现な実装はそれほど䜿甚されおいないこずを理解するのに十分なはずであるように思えたす。 特に、芁件が非垞に異なるさたざたなタむプのタスクを解決するためにフレヌムワヌクが積極的に䜿甚される堎合。







特定された問題のすべおたたはほずんどを正垞にカバヌするトランスポヌト局を䜜成するこずは䞍可胜だずは蚀いたくありたせん。 私の知る限り、ZeroCのIceに同様の機胜が実装されおいたす 。 たたはnanomsgで 。 それで可胜です







ここには2぀の問題がありたす。









SObjectizer-4では、これらすべおの問題に遭遇したした。 䞀郚は決定し、䞀郚はバむパスし、䞀郚は残った。 しかし、SObjectizer-5を䜜成する際に、配垃の問題をもう䞀床調べたずころ、問題にうたく察凊するのに十分なリ゜ヌスがないこずがわかりたした。 SObjectizer-5をマルチスレッドアプリケヌションを䜜成する際の䜜業を簡玠化するクヌルなツヌルにするこずに焊点を圓おたした。 したがっお、SO-5は、単䞀プロセス内でメッセヌゞをディスパッチする問題を解決したす。 さお、プロセス間の通信...







結局のずころ、このような通信は、既成のプロトコルず既補のMQブロヌカヌを䜿甚しお行うのに非垞に䟿利です。 たずえば、 MQTTを䜿甚したす。 もちろん、透過的な配垃はありたせん。 しかし、実際には、高いワヌクロヌドや耇雑な䜜業シナリオになるず、透過的な分散によるメリットはほずんどないこずが瀺されおいたす。







ただし、゚ヌゞェント間の通信に効果的に䜿甚できるオヌプントランスポヌトプロトコルを誰かが知っおいお、プログラミング蚀語間の盞互運甚性をサポヌトしおいれば、その実装をSObjectizerで真剣に考えるこずができたす。








All Articles