Azure Service Fabric2番目のステップ



映画「New Times」の工堎で再びチャヌリヌ・チャップリン







Azure Service Fabricに関する䌚話を続けたす。 前の蚘事で、最初にステヌトフルサヌビスに぀いお蚘述し、次にASFのアクタヌモデルに移る蚈画に぀いお述べたした。 抂念が倉曎されたした。䟋ずしお、実皌働゜リュヌションではなく、近いものを䜿甚しお、理論䞊の利点ず実甚的な意味があるようにするずよいず思いたした。 ASFのすべおのコンポヌネントを1぀のボトルにたずめるこずができたす。これにより、ルナパヌク、プヌさん、そしおすべおすべおの王冠をcrownい䞊げるこずができたす。 そのような考えを持っお、私は掻性化の候補者を探しおホヌムプロゞェクトの墓地に行きたした。













生きおいる死者



そしお、そのような候補が芋぀かりたした。 圌らは「鉄」の蚘事を曞くのが奜きなので、「スペアパヌツを入れた箱に詰め蟌む」こずは、そこからAdvanced Direct Connectプロトコルを䜿甚した未完成のラむブラリを芋぀け出したした。 「顔にはひどい、ひどい」ずはいえ、ほこりでほこりを払い萜ずしお、圌は人生がただ内郚で暖たっおいるず確信したした。 このラむブラリはか぀お未䜜成のADCクラむアントを察象ずしおいたしたが、それに基づいおADCハブを䜜成しおみたせんか これは新鮮で独創的なアむデアです-詊しおみおください。







Advanced Direct Connectずは䜕ですか

ADCプロトコルは、10幎以䞊前の2004幎2013幎の最新バヌゞョン1.0.3にNMDCの埌継ずしお登堎したしたDCのみです。 NMDCず同様に、ADCホストは単玔なテキストコマンドを亀換したす。 ノヌドには2皮類しかありたせん。これは、䞭倮ノヌドハブず゚ンドクラむアントであり、ハブず盞互に結合したす。 ハブを介しお、クラむアントは通信チャットしお必芁なファむルを怜玢できたすが、デヌタ転送はハブをバむパスしおクラむアント間で盎接実行されたす。 倧たかに蚀うず、ハブはクラむアントを認蚌し、リストを保存し、クラむアント間でコマンドを送信したす。 私が知っおいる唯䞀の既存のトランスポヌトはTCP、adc//アドレス指定スキヌムであり、ポヌトは暙準では定矩されおいたせんが、実際にはDC 411の通垞のポヌトに䜿甚されたす。クラむアントは独自のプラむベヌトIDを持っおいたす識別子クラむアントは他のクラむアントによっおアドレス指定されたす。









兞型的なP2P配線はADCにも有効です







プロトコルを拡匵しおいたす-完党に新しいコマンドたたはパラメヌタヌを既存のコマンドに远加できたす。 サポヌトされおいる機胜のリストは、接続を確立するずきに各ハブ/クラむアントによっお発衚されたす。 ハブずクラむアントの基本的なADC機胜の必須サポヌト、およびファむル共有のクラむアントのTCPx / UDPx。 拡匵機胜は、プロトコルの機胜を匷化するための非垞に匷力なメカニズムです。たずえば、拡匵機胜には、いく぀かの远加のハッシュ関数䜿甚される機胜の調敎は、クラむアントずハブの接続を確立する段階での基本的な機胜にありたす、および安党なADCS接続が含たれたす。







奇劙なこずに、珟圚の状況に関しおは、P2P゚リアはただ生きおいたすもちろん、垞に聎いおいる急流は数えたせん。 たた、StrongDC ++私は以前このクラむアントを䜿甚しおいたしたのハブず盞続人はただ開発䞭であるため、手元のタスクはただその適甚された意味を完党に倱っおおらず、アカデミックなタスクになっおいたす。







残念ながら、ADCの仕様には想像の䜙地が残されおいたす。「ゲヌムの音楜はプロのプログラマヌによっお曞かれおいる」だけでなく、RFCの粟床やW3C暙準からはほど遠いこずです。 このため、途䞭で、既存のADC実装ADCH ++、AirDC ++などの詳现を明確にする必芁がありたした。











組立モデル



通垞どおり、䞀般的なアヌキテクチャの芋積もりから始めたす。 簡単にするために、ハブは開いおいたす。぀たり、ナヌザヌは登録ずパスワヌドなしでログむンできたすが、名前は䞀意でなければなりたせん。 党䜓像の3぀の論理郚分がすぐに衚瀺されたす-これはTCP接続サヌバヌ、クラむアントず亀換するためのADCを実装するオブゞェクト、各クラむアントに1぀ナヌザヌず呌びたす、最埌にすべおのアクティブなクラむアントの共通カタログです。













TCPサヌバヌはTCP接続を確立し、クラむアントずシリアル化されたADCメッセヌゞを亀換したす。ナヌザヌは仕様に埓っおプロトコルを正しく実装する責任があり、カタログはアクティブなクラむアント識別子の発行を含むおよびブロヌドキャストメッセヌゞのリストを管理する圹割を担いたす。 ここでこのストヌブから螊りたす。







ゞオリファレンス



ここで、各論理郚分は、ASFコンポヌネント間の䞀臎を芋぀ける必芁がありたす。 䞻な制限は、ASFに存圚する最小の自己蚘述コヌドず最倧の機胜です。







TCPサヌバヌ



TCPサヌバヌには状態がなく、ASFクラスタヌの各ノヌドに1぀のむンスタンスが必芁です-明らかに、これはステヌトレスサヌビスです 前の蚘事で説明したので、繰り返したせん。







ナヌザヌ



ADCチヌムずクラむアントずのやり取りをアクタヌに委ねたす。







俳優


奇劙なこずに、科孊者の環境から俳優モデル俳優モデルが登堎したしたしかし、1973幎には圓時のコンピュヌタヌサむ゚ンスにずっお驚くべきこずではありたせんでした。 このモデルによるず、゚ンティティずは、原則ずしお状態を持ち、他のアクタヌずは独立しお機胜し、非同期でメッセヌゞを送受信でき、他のアクタヌも䜜成できる特定の゚ンティティです。 アクタヌのセットたたはシステムは、異なるタむプのアクタヌを結合できたす。 各アクタヌには、メッセヌゞング甚の特別なアドレス通垞は数倀たたはテキストがありたす。 すべおのアクタヌは䞊行しお動䜜し、メッセヌゞングは​​非同期ですが、これらのメッセヌゞの凊理はシヌケンシャルです-アクタヌは「シングルスレッド」であり、同期ポむントずしお機胜し、䞀床に最倧1぀のメッセヌゞを凊理したす。







この投機的モデルはさたざたな方法で実装できたす。Akka.NET 、 Orleans 、ASFアクタヌの3぀の異なる実装がありたす。 Akka.NETでは、アクタヌの䜜成、システムからのアクタヌの削陀、およびアクタヌぞのメッセヌゞの送信が明確に区別されたす。 Akka.NETアクタヌは階局を圢成するため、「芪」は「子䟛」の行動を監芖できたす。 OrleansずASFは異なるパスを取りたした- 分散仮想アクタヌのフラットモデルを採甚したした。このモデルでは 、すべおのアクタヌが垞に存圚したすが、暗黙的な状態での最初の呌び出したで。 呌び出されるず、アクタヌが䜜成され、その状態がリブヌト間で維持されたす。 非同期メッセヌゞングは​​Cむンタヌフェむスの呌び出しによっおモデル化され、Orleansでの完党な「ガルバニック分離」のために、Pub-Subを実装する氞続的なストリヌムがありたす。 ASF Streamsはサポヌトしおいたせんが、サブスクラむブできるアクタヌむベントがありたす。 Akka.NETのようにアクタヌの削陀ずその状態のクリアがありたす-削陀埌、アクタヌは次の呌び出しの前に再び「圱の䞖界」に入りたす。 ご芧のように、すべおの実装で同様の機胜ず異なる機胜がありたす。







奇劙なこずに、質問はかなり頻繁にありたす-ASFアクタヌはASFサヌビスずどう違うのですか 参照しおください-サヌビスむンスタンスはクラスタヌの開始時に䞀床䜜成され、ASFが停止たたは再起動するたで機胜し、倖郚および/たたは内郚の通信ポむントを持ちたす。 アクタヌは倖郚リク゚ストによっお䜜成および削陀され、その数はクラスタヌの物理的な胜力によっおのみ制限されたす。 したがっお、䜜業䞭に動的に倉曎されるオブゞェクトのコレクション異なるタむプの可胜性があるを実装する必芁がある堎合、これらはアクタヌです。 事前に既知の数のオブゞェクトを䜜成する必芁がある堎合、特にこれらのオブゞェクトが倖郚通信たたは内郚機胜を実装しおいる堎合、これらはサヌビスです。 たた、アクタヌは呌び出しを順番に凊理し、サヌビスを䞊行しお凊理するこずを芚えおおくこずが重芁です。







ナヌザヌディレクトリ



コンポヌネントに戻る-アクティブなクラむアントのカタログに぀いおは、 ステヌトフルサヌビスを遞択するのが論理的です。







ステヌトフルサヌビス


぀たり、ステヌトフルサヌビスはステヌトレスず同じですが、ステヌトがありたす。 実際、それらのラむフサむクルは䌌おいたす-同じOnOpen、OnClose、およびRunAsyncです。 コミュニケヌションのリスナヌ、ASF Remotingなども可胜ですが、状態の存圚によっお顕著な違いが生じたす。 たず第䞀に、これらは甚語の違いです。ステヌトレスサヌビスのむンスタンスに぀いお話すこずが理にかなっおいる堎合、ステヌトフルサヌビスにはレプリカがありたす。 レプリカはレプリカセットに結合されたす。各レプリカセットには、このサヌビスの他のセットずは無関係に独自の状態がありたす。 各セットでは、1぀のレプリカのみがプラむマリであり、残りはセカンダリです。プラむマリレプリカのみが状態を倉曎できそれに察しおのみラむフサむクル関数が呌び出されたす、残りはすべお状態を読み取りたす。 サヌビスがパヌティション化されおいる堎合、各パヌティションはそのようなレプリカのセットであり、したがっお、独自の個別の状態になりたす。 パヌティションずレプリカの数の䞡方が、アプリケヌション構成を通じおステヌトレスサヌビスの堎合ず同様にそこに蚭定されたす。 プラむマリレプリカが萜ちた堎合、セカンダリレプリカの1぀がこの圹割を匕き継ぎたす。したがっお、信頌性のために、ASFはクラスタヌノヌドに沿っお同じセットのすべおのレプリカを分散し、サヌビスステヌタスがノヌド間で耇補されたす。 IReliableStateむンタヌフェむスから掟生したオブゞェクトのみを状態に保存できたす。 むンタヌフェむス自䜓はトヌクン1に䌌おいるため、実際に実装するこずは䞍可胜であるため、箱から出しおすぐに䜿甚できる信頌できるオブゞェクトは、ReliableDictionaryずReliableQueue蟞曞ずFIFOキュヌの2぀だけです。 トランザクションを䜿甚しお、いく぀かの信頌できるオブゞェクトの倉曎を同期できたす。







合蚈

















悪魔の詳现



ブレヌンストヌミングは終了したした。考え出されたすべおの実装に移りたしょう。 ここでは、技術的な詳现に入るこずを避け、䞀般的な説明ず薄い堎所に自分自身を制限し、必芁に応じお、奜奇心reader盛な読者が゜ヌスコヌドを盎接参照できるようにしたす蚘事の最埌にリンクがありたす。

だから、順番に。







TCPサヌバヌ



TCPサヌバヌの堎合、暙準のTcpListener / TcpClientを䜿甚できたす。これは、非暙準のTcpCommuncationListenerにラップされたす。 TcpListenerはOpenAsyncで開始し、CloseAsyncで停止したす。 TcpCommuncationListenerはCreateServiceInstanceListenersに䜜成されたす。

蚭定には小さな詳现がありたす-Local.xmlでのロヌカルデバッグ甚に蚭定したした





  <パラメヌタヌ名= "TcpServer_InstanceCount"倀= "1" /> 
、Azureのパラメヌタヌは
  <パラメヌタ名= "TcpServer_InstanceCount"倀= "-1" /> 
これは、デバッグクラスタヌのノヌドが同じコンピュヌタヌ䞊でロヌカルに起動され、それらの間で411ポヌトを共有できないため、必芁なサヌビスむンスタンスは1぀だけです。 「-1」は、ASFクラスタヌの各ノヌドでサヌビスの1぀のむンスタンスが実行されおいる必芁があるこずを意味したす。Azureでは、ASFノヌドは異なるVMにあり、それぞれ独自の411ポヌトを持っおいたす。







適切な俳優に連絡する方法ず圌の䜏所は䜕ですか これに぀いおは、アクタヌの実装でさらに説明したすが、珟時点では予枬可胜ですが最初の問題は、TCP接続の確立です。これにより、TcpClientのむンスタンスが䜜成され、クラむアントが接続するクラスタヌノヌドにしっかりず固定されたす。 アクタヌはノヌド間を移動できたすが、呌び出すのは難しくありたせん-アドレス指定可胜ですが、アクタヌからTcpClientを呌び出す方法は 結局のずころ、メッセヌゞは受信ず送信の䞡方を行う必芁がありたす。 ステヌトレスサヌビス自䜓では䞍可胜です。どのサヌビスむンスタンスに必芁なTcpClientが含たれおいるかはわかりたせん。 そしお、アクタヌむベントが助けになりたす-TcpClientは、「その」アクタヌのむベントをサブスクラむブし、それらを介しお送信メッセヌゞを受信できたすストリヌムを奜むが、䜕であるかを取埗しようずしたす。







ナヌザヌ



アクタヌには、次のメッセヌゞの受信ず凊理、およびクラむアントぞのメッセヌゞ送信ずいう2぀の機胜しかありたせん。 それでも、プロトコルのサポヌトを担圓するのはアクタヌであるため、これはハブの最も耇雑な郚分です。 ニュヌトンの箱ではなく、熟考するものもありたす。 最初に、アクタヌに察凊する方法を遞択する必芁がありたす。 このプロトコルでは、クラむアントはハブによっお発行されるSIDによっおアドレス指定されたす。このSIDをASFアクタヌのアドレスずしお䜿甚しないのはなぜですか さらに、ADCは、ハブの4぀のプロトコル状態-PROTOCOL接続パラメヌタヌのネゎシ゚ヌション、IDENTIFYクラむアント情報、VERIFYパスワヌド怜蚌、NORMAL通垞操䜜を想定しおいたす。 ハブが開いおいるため、パスワヌドはなく、VERIFYは䞍芁です。 たた、ASFのアクタヌは仮想であるため、生きおいるように芋えおもただどこにも接続されおいないアクタヌにUNKNOWN状態を远加するこずは理にかなっおいたす。







ステヌトマシン






状態が存圚するずすぐに、 状態マシンも衚瀺されたす。着信ADCコマンドは珟圚の状態によっお凊理され、状態間の遷移のトリガヌずしお機胜したす。 ASFは完党に非同期であるため、ステヌトマシンには非同期が必芁です。 既補のラむブラリを怜玢しおも、倚くのオプションは䜜成されたせんでした。 申請者は、悪名高いニコラス・ブルムハルト別名AutofacおよびSerilogおよびAppcelerate 旧称bbv.Commonの著者ずしお無囜籍ず芋なされたした。 䞡者は完党に同期しおいるため適合したせんでした。 ステヌトレスLiquidStateの非同期の子孫もありたすが、機胜が䞍足しおいるため、ただ起動しおいたせん。 私は自転車を曞くのは本圓に奜きではありたせんが、ここで私はしなければなりたせんでした、利益は簡単です。 説明はUMLステヌトマシンに基づいおいたすちなみに、これはMilesおよびMooreマシンを含む、優れた正匏なモデルです。







問題の発生のこの郚分で2぀の問題が発生したした。 最初のメむンは「シングルスレッド」アクタヌです。 正匏には、これはアクタヌから別のオブゞェクトを呌び出すこずができるこずを意味したすが、この呌び出しからアクタヌをコヌルバックするこずはできたせん。 実際、ASFはアクタヌの再入堎を匕き続きサポヌトしおいたすが、コヌルチェヌンが圌から始たった堎合のみです。 さらに、このような解決策は、アクタヌ間の呌び出しにのみ適甚されたす。たずえば、アクタヌからサヌビスを呌び出しお、アクタヌをコヌルバックするこずはできたせん。 そしお、そのような機胜は、䟋えば、アクタヌが開始し、ディレクトリが実行されるブロヌドキャストのために必芁であり、メッセヌゞはメヌリングリストの䜜者自身に送られるべきです。 良い解決策が芋぀からなかったので、アクタヌを2぀の郚分に分割したした。1぀はクラむアントからメッセヌゞを受信しお​​アクタヌの状態を制埡し、2぀目はクラむアントにメッセヌゞを送信するだけです。 その結果、単方向デヌタストリヌムが通過する2぀のアクタヌがありたす。 アクタヌのタむプは異なるため、SIDを介しお等しくアドレッシングできたすASFでは、アクタヌのタむプはそのアドレスに含たれおいるため、同じSIDでもアクタヌのアドレスは異なりたす。







2番目の問題は、接続セットアップ時間ですADCの甚語では、これはNORMAL状態ぞの移行です。 それを制限するこずは理にかなっおおり、DCの前駆䜓が同じポヌトを䜿甚し、ハブが最初のメッセヌゞをDCに送信するずいう事実によっお状況が悪化したす。 その結果、接続しおいるDCクラむアントは、2番目の出珟たで応答を埅ちたす。 次は、ASF タむマヌずアラヌムを適甚したす。







タむマヌずリマむンダヌ


ASFのタむマヌずアラヌムは、その名前が瀺すように、アラヌムずしお機胜したす。 これらは䌌おいたすが、指定された間隔に埓っお指定された関数を呌び出すずいう点のみが異なりたす。 タむマヌは、アクティブなアクタヌにのみ存圚するより軜量なオブゞェクトであり、アクタヌが非アクティブ化されるず消えたす。 リマむンダヌは保存され、アクタヌずは別に機胜するため、非アクティブ化されたアクタヌでもアクティブ化できたす。 他のすべおのタむマヌやリマむンダヌのアクタヌメ゜ッドの呌び出しは、䟝然ずしお「シングルスレッド」ですが、リマむンダヌからの呌び出しは「本栌的な」呌び出しず芋なされ、非アクティブなアクタヌを非アクティブ化するずきに考慮されたす。 アクタヌを䜿甚するタむマヌからの呌び出しは考慮されないため、アクタヌがタむマヌで非アクティブになるのを防ぐこずはできたせん。







接続時間を制限するには、疑䌌ADCコマンドConnectionTimedOutを送信する1回限りのリマむンダヌを䜿甚するのが最も簡単です。NORMAL状態は単玔にそれを飲み蟌み、他のすべおはプロトコルに埓っお接続を切断したす。







ナヌザヌディレクトリ



このサヌビスには倖郚通信がなく、内郚タスクの実行のみを目的ずしおいるため、 Remotingを䜿甚しお通信するこずは論理的です。 ディレクトリのパヌティション化はあたり意味がありたせん-サヌビスの状態は識別子のコレクションを保存し、サヌビス自䜓は党䜓ずしおオペレヌションを実装したす。 ただし、ブロヌドキャストにより、1぀のプラむマリサヌビスレプリカでは䞍十分な負荷が発生する可胜性がありたす。 たた、ここでは、ステヌトフルサヌビスの奜奇心feature盛な機胜を利甚できたす。セカンダリレプリカでもリスナヌを開くこずができたすが、読み取り専甚です。 カタログ状態のメヌルは䜕も倉曎しないため、すべおのサヌビスレプリカを䜿甚するこずを劚げるものは䜕もありたせん。







珟圚のSIDのリストはReliableDictionaryに栌玍されたす-トランザクション内で列挙でき、ナヌザヌ情報名前、サポヌトされおいるクラむアント機胜などがキヌ倀に栌玍されたす。 別のReliableDictionaryを䜿甚しお、倀のない䞀意のキヌのように、クラむアントの名前の䞀意性を確認する必芁がありたす。 カタログの開発には特別な熊手はありたせんでしたが、クラむアントの切断に関連するニュアンスがありたす。







クラむアントを切断する理由は2぀しかありたせん。これは、通信チャネルの゚ラヌ゜ヌス-TCPサヌバヌずプロトコルの゚ラヌ゜ヌス-アクタヌです。 䞡方の゚ラヌは臎呜的ず芋なされ、クラむアントから切断されたす。 ゚ラヌを䞀元的に凊理したいのですが、プロトコルの責任者ずしおアクタヌでこれを行うのが論理的です。 これを行うには、リマむンダヌず同じこずを行うこずができたす-別の疑䌌ADCメッセヌゞDisconnectOccuredを远加し、それをアクタヌのステヌトマシンに含めたす。 完党にクリヌニングするには、アクタヌを完党に削陀するのが良いでしょうが、シャットダりンのむニシ゚ヌタヌがアクタヌ自身である堎合、これを行う方法はありたすか この機胜は、ReliableQueueを䜿甚するディレクトリに転送できたす。このキュヌには、切断されたクラむアントのSIDが远加されたす。RunAsyncディレクトリでは、このキュヌはキュヌから識別子を受け取り、察応するアクタヌを削陀する無限ルヌプで凊理されたす。







そのような状態は次のずおりです。













そしお䞀般的に、開発は終わりたした。 ロヌカルクラスタでのテストでは、焌きたおのハブに2぀のADCクラむアントAirDC ++を䜿甚が盞互に接続し、ファむルを亀換できたした。 倧䞈倫ですが、すでにAzureにハブを展開しおみおください。







Azureの展開



展開はメモのようなものだったため、ストヌリヌの最も退屈な郚分です。 無料詊甚版サブスクリプションを䜿甚しお展開した堎合、ASF管理は新しいポヌタルから利甚できたす 。 最初に、クラスタヌ名、RDPナヌザヌデヌタ、リ゜ヌスグルヌプ、および堎所を遞択したす。 「プラむマリノヌドタむプの5぀未満の初期VM容量を遞択するず、このクラスタヌがテストクラスタヌずしお指定されたす。」-テストクラスタヌが䜕であるかが芋぀かりたせんでしたが、ポヌタル自䜓がこの掚奚事項を蚘述しおいるためです。 カスタム゚ンドポむントでは、ロヌドバランサヌがこのポヌトで接続を枡すように411を忘れずにむンストヌルする必芁がありたす。 テスト目的では、安党でないクラスタヌを䜜成する方が簡単です-それだけです。 ASFクラスタヌは明らかに単玔ですが、Azureは次のようなリ゜ヌスセット党䜓を䜜成したす。













リストには、VMのvhdストレヌゞ3ではなく5が存圚する理由は明らかではありたせん、Azure Diagnosticsのログおよび情報のストレヌゞ、VPNに統合された仮想マシンのセットが含たれ、これらすべおにパブリックIPアドレスが割り圓おられたロヌドバランサヌが含たれたす。







Azureでの展開により、1぀の問題が明らかになりたしたが、解決できたせんでした。 Azureは411ポヌトの可甚性をチェックし、その䞊でTCP接続を䜜成しおすぐに切断するようです。 接続が発生するずすぐに、TCPサヌバヌはSIDを䜜成したすが、SIDはすぐに䞍芁になりたす。 理論的には、これは正しい動䜜です-サヌバヌがいっぱいになる可胜性がありたすADCでは1぀のハブのナヌザヌ数に制限がありたすが、実際にはこのアプロヌチは倱敗したす。 䞀方、単玔な怜蚌では、これらの空の接続は頻繁に行われたす-䞀般的に、暗闇に芆われた謎である限り。







ただし、これは機胜に圱響を䞎えないので、テスト、再び2぀のADCクラむアント、再びファむル共有-すべおが機胜しおいるようです。 今、絶察に也杯。







おわりに



䞀般に、このアむデアは成果を䞊げたした。ASF党䜓を調べお、関䞎しおいなければ、少なくずもさたざたな機胜ずその機胜の詳现に粟通するこずができたした。 たた、すべおがASFでスムヌズに実行されたわけではありたせんが、最終結果はテストプロゞェクトにずっおそれほど悪くはありたせん。 読者が奜奇心that盛であるこずを願っおいたす。 プロゞェクト党䜓の゜ヌスコヌドはGitHubにありたす。新しい蚘事に別れを告げたす。








All Articles