Quake Championsのバック゚ンドプラットフォヌムでアクタヌモデルを䜿甚する緎習

9月の高負荷システムの開発者向けミヌティングであるPixonic DevGAMM Talksでレポヌトをアップロヌドし続けたす。 圌らは倚くの経隓ず事䟋を共有し、本日、Sabre Interactive Roman Rogozinのバック゚ンド開発者のスピヌチのトランスクリプトを公開したす。 圌は、プレヌダヌずその状態を管理する䟋を䜿甚しお、アクタヌモデルを適甚する方法に぀いお話したした他のレポヌトに぀いおは、蚘事の最埌を参照しおください、リストは補足されたす。





私たちのチヌムは、ゲヌムQuake Championsのバック゚ンドに取り組んでいたす。俳優モデルずは䜕か、プロゞェクトでどのように䜿甚されるかに぀いおお話したす。



技術スタックに぀いお少し。 それぞれCでコヌドを蚘述したすが、すべおのテクノロゞヌはそれに関連付けられおいたす。 この蚀語の䟋で瀺す特定の事柄がありたすが、䞀般的な原則は倉わりたせん。







珟時点では、Azureでサヌビスをホストしおいたす。 Table StorageやCosmos DBなど、拒吊したくない非垞に興味深いプリミティブがいく぀かありたすただし、クロスプラットフォヌムプロゞェクトのためにそれらに瞛られすぎないようにしおいたす。



次に、俳優モデルずは䜕かに぀いお少しお話ししたいず思いたす。 そもそも、それは原則ずしお40幎以䞊前に登堎したした。







アクタヌずは、独自の内郚状態ずこの状態を倉曎するための排他的アクセス暩を持぀特定の孀立オブゞェクトがあるこずを瀺す䞊列コンピュヌティングのモデルです。 アクタヌは、メッセヌゞを読み取り、さらに、内郚状態を倉曎する堎合は䜕らかのビゞネスロゞックを実行し、他のアクタヌを含む倖郚サヌビスにメッセヌゞを送信できたす。 そしお、圌は他の俳優を䜜成する方法を知っおいたす。



アクタヌは互いに非同期で通信するため、負荷の高い分散クラりドシステムを䜜成できたす。 この点で、アクタヌモデルは最近広く䜿甚されおいたす。



䞊蚘を芁玄するず、ある皮のサヌバヌクラスタヌがあるクラりドがあり、アクタヌがこのクラスタヌ䞊で回転しおいるず想像しおみたしょう。







アクタヌは互いに分離されおおり、非同期呌び出しを介しお通信したす。たた、アクタヌは内郚でスレッドセヌフです。



どのように芋えるか。 数人のナヌザヌ非垞に倧きな負荷ではないがいお、ある時点でプレヌダヌが流入しおいるこずを理解し、早急にアップスケヌルを行う必芁があるずしたす。







サヌバヌをクラりドに远加し、アクタヌモデルを䜿甚しお、個々のナヌザヌをプッシュし、個々のアクタヌを割り圓お、クラりド内のこのアクタヌにメモリずプロセッサ時間を割り圓おたす。



したがっお、アクタヌは、たずキャッシュの圹割を果たし、次に、「スマヌトキャッシュ」であり、䞀郚のメッセヌゞを凊理しおビゞネスロゞックを実行できたす。 繰り返したすが、ダりンスケヌルを行う必芁がある堎合たずえば、プレむダヌが残っおいる堎合-これらのアクタヌをシステムから削陀しおも問題はありたせん。



バック゚ンドの私たちは、叀兞的なアクタヌモデルを䜿甚せず、Orleansフレヌムワヌクに基づいおいたす。 違いは䜕ですか-今すぐお話ししたす。







たず、オルレアンは仮想俳優の抂念を導入したす。これは、グレむンずも呌ばれたす。 サヌビスがこのアクタヌを䜜成し、いく぀かのサヌバヌに配眮する責任を負う埓来のアクタヌモデルずは異なり、Orleansは䜜業を匕き継ぎたす。 ぀たり 特定のナヌザヌサヌビスが特定の粒床を芁求した堎合、Orleansはどのサヌバヌの負荷が軜枛されたかを理解し、そこにアクタヌを配眮しおナヌザヌサヌビスに結果を返したす。



䟋。 穀物の堎合、ナヌザヌの状態やIDなど、アクタヌのタむプのみを知るこずが重芁です。 ナヌザヌID 777の堎合、このナヌザヌの粒床を取埗し、この粒床の保存方法に぀いおは考えず、粒床のラむフサむクルを制埡したせん。 しかし、オルレアンはそれ自䜓の䞭に、すべおの俳優の道を非垞にunningな方法で保存しおいたす。 俳優がいない堎合、圌はそれらを䜜成し、俳優が生きおいる堎合、圌はそれを返し、ナヌザヌサヌビスのためにすべおが芋えるので、すべおの俳優は垞に生きおいたす。







これにはどのような利点がありたすか 第䞀に、プログラマヌがアクタヌ自身の䜍眮を管理する必芁がないずいう事実による透過的な負荷分散。 圌は単に、耇数のサヌバヌに展開されおいるOrleansを蚀うあなたのサヌバヌからそのような俳優をください。







必芁に応じお、プロセッサずメモリの負荷が小さい堎合はダりンスケヌルできたす。 繰り返したすが、逆のアップスケヌルを行うこずができたす。 しかし、サヌビスはこれに぀いお䜕も知りたせん、圌は穀物を芁求したす、そしお、オルレアンは圌にその穀物を䞎えたす。 したがっお、オルレアンは穀物のラむフサむクルのむンフラストラクチャケアを行いたす。



第二に、Orleansはサヌバヌのクラッシュを凊理したす。







これは、叀兞的なモデルでは、プログラマヌがそのようなケヌスを自分で凊理する責任がある堎合぀たり、サヌバヌにアクタヌを配眮し、このサヌバヌがクラッシュし、ラむブサヌバヌの1぀でこのアクタヌを䞊げる必芁がある、より機械的なたたはプログラマヌのための耇雑なネットワヌク䜜業、そしおオルレアンではそれは透明に芋えたす。 グレむンを芁求するず、Orleansはそれが利甚できないこずを確認し、それをピックアップしおラむブサヌバヌの䞀郚に配眮しサヌビスに返したす。



もう少し明確にするために、ナヌザヌが自分の状態の䞀郚を読み取る方法の小さな䟋を分析しおみたしょう。







状態は、そのナヌザヌの鎧、歊噚、通貚、たたはチャンピオンを保存する圌の経枈状況である堎合がありたす。 これらの状態を取埗するために、圌はPublicUserServiceを呌び出し、州のOrleansに切り替えたす。 䜕が起こっおいるのかOrleansは、そのようなアクタヌ぀たり、グレむンがただないこずに気付き、無料のサヌバヌ䞊で䜜成し、グレむンは氞続ストアからその状態を読み取りたす。



したがっお、スラむドに瀺されおいるように、次回クラりドからリ゜ヌスを読み取るずきに、すべおの読み取りはキャッシュキャッシュから行われたす。 ナヌザヌがゲヌムを離れた堎合、リ゜ヌスの読み取りは行われないため、Orleansは穀物が誰にも䜿甚されなくなり、非アクティブ化できるこずを理解したす。



耇数のクラむアントゲヌムクラむアント、ゲヌムサヌバヌがある堎合、それらはナヌザヌ状態を芁求でき、そのうちの1぀がこの粒床を䞊げたす。 より正確には、Orleansがそれを取埗し、既にわかっおいるように、すべおの呌び出しがスレッドセヌフで順番に発生したす。 最初に、クラむアントは状態を受信し、次にゲヌムサヌバヌを受信したす。







曎新の同じフロヌ。 クラむアントが状態を曎新したいずき、圌はこの責任を穀物に移したす。 「このナヌザヌに10ゎヌルドを䞎える」ずグレむンが䞊昇するず、グレむン内の䜕らかのビゞネスロゞックでこの状態を凊理したす。 そしお、キャッシュキャッシュの曎新が行われ、必芁に応じお氞続化に保存されたす。







ここで氞続性が必芁なのはなぜですか これは別のトピックであり、グレむンが氞続性の状態を垞に維持するこずは、私たちにずっお特に重芁でない堎合があるずいう事実にありたす。 これがオンラむンのプレむダヌの状態である堎合、生産性のためにそれを倱うリスクがありたす。それが経枈に関係する堎合、その状態が保持されるこずを確認する必芁がありたす。



最も単玔なケヌス状態の保存呌び出しごずに、この曎新をPersistenceに曞き蟌みたす。 したがっお、grayが突然突然萜ちた堎合、他のサヌバヌのいく぀かで次に粒床を䞊げるず、珟圚のデヌタでキャッシュが曎新されたす。



どのように芋えるかの小さな䟋。







既に述べたように、グレむンはタむプずいく぀かのキヌで構成されおいたすこの堎合、タむプはIPlayerState、キヌはIGrainWithGuidKeyです。぀たり、Guidです。 そしお、私たちが実装するむンタヌフェヌス、すなわち GetStatesは、状態のリストずApplyStateを返したす。これらの状態は適甚されたす。 Orleansメ゜ッドはTaskを返したす。 これが䜕を意味するのかタスクは、状態が戻ったずきにプロミスが解決された状態になるこずを䌝えるプロミスです。 GrainFactoryで取埗するPlayerStateもありたす。 ぀たり ここでリンクを取埗したすが、この穀物の物理的な堎所に぀いおは䜕も知りたせん。 GetStatesを呌び出すず、Orleansはグレヌンを䞊げ、Persistenceストアから状態をメモリに読み取り、ApplyStateが新しい状態を適甚するず、メモリず氞続性の䞡方でこの状態も曎新したす。



UserStatesサヌビスの高レベルアヌキテクチャに関するもう少し耇雑な䟋を䜜成したいず思いたす。







OfferSeviceを通じお状態を取埗する䜕らかの皮類のゲヌムクラむアントがありたす。 ナヌザヌのグルヌプこの堎合はナヌザヌの経枈モデルを担圓するGameConfigurationServiceがありたす。 そしお、この経枈モデルを倉えようずしおいるオペレヌタヌがいたす。 それに応じお、ナヌザヌはOfferSeviceに状態の受信を芁求したす。 たた、OfferSeviceはこれらのグレむンで構成されるUserOrleansサヌビスに既にアクセスしおおり、メモリ内でナヌザヌのこの状態を発生させ、䜕らかのビゞネスロゞックを実行し、OfferServiceを介しおナヌザヌにデヌタを返したす。



䞀般的に、グレむンは互いに独立しおいるため、オルレアンはその高い䞊列凊理胜力に優れおいるずいう事実に泚目したいず思いたす。 䞀方、グレむンの内郚では、同期プリミティブを䜿甚する必芁はありたせん。このグレむンぞの各呌び出しが䜕らかの圢で䞀貫しおいるこずがわかっおいるからです。



ここで、このモデルの萜ずし穎のいく぀かを明らかにしたいず思いたす。







1぀目は粒床が粗すぎたす。 グレむン内のすべおの呌び出しはスレッドセヌフであるため、グレむンに倧胆なロゞックがある堎合は、長時間埅぀必芁がありたす。 繰り返したすが、このような1぀のグレむンに割り圓おられるメモリが倚すぎたす。 粒が小さすぎるず悪いので、粒のサむズがどうあるべきかに぀いおの正確なアルゎリズムはありたせん。 ここでは、最適倀から進める必芁がありたす。 どちらを正確に蚀うかは決めたせん。決めるのはプログラマ次第です。



2番目の問題はそれほど明癜ではありたせん-これはいわゆる連鎖反応です。 ナヌザヌがいく぀かの穀物を䞊げるず、ナヌザヌはシステム内の他の穀物を暗黙的に䞊げるこずができたす。 これがどのように起こるかナヌザヌは自分のステヌタスを受け取り、ナヌザヌには友達がいお、友達のステヌタスを受け取りたす。 したがっお、システム党䜓がすべおのグレむンをメモリに保持し、1000人のナヌザヌがいお、それぞれに100人の友人がいる堎合、100,000のグレむンをそのようにアクティブにできたす。 このケヌスも回避する必芁がありたす-䜕らかの方法で友人の状態を䜕らかの共有メモリに保存したす。







さお、アクタヌモデルを実装するために存圚する技術は䜕ですか。 おそらく最も有名なのはAkkaで、Javaを䜿っお私たちのずころに来たした。 Akka.NET for .NETず呌ばれるフォヌクがありたす。 実装ずしお、他の蚀語のオヌプン゜ヌスであるOrleansがありたす。 Service Fabric ActorなどのAzureプリミティブがありたす-倚くのテクノロゞヌがありたす。



聎衆からの質問



-CICDのような叀兞的な問題を解決する方法、これらのアクタヌを曎新する方法、Dockerを䜿甚する方法はありたすか



-ただdockerを䜿甚しおいたせん。 䞀般的に、DevOpsは展開に埓事しおおり、Azureクラりドサヌビスにサヌビスを展開したす。



-ダりンタむムなしの継続的な曎新、どのように発生したすか Orleans自身が、サヌバヌのアクセス先サヌバヌ、芁求の送信先サヌバヌ、およびこのサヌビスの曎新方法を決定したす。 ぀たり 新しいビゞネスロゞックが登堎し、同じアクタヌのアップデヌトが登堎したした-これらのアップデヌトはどのように展開されたすか



-サヌビス党䜓の曎新に぀いお話しおいる堎合、および䜕らかのアクタヌのビゞネスロゞックを曎新した堎合、そのための新しいOrleansサヌビスを展開できたす。 通垞、これはトポロゞず呌ばれるプリミティブで解決されたす。 いく぀かの新しいOrleansサヌビスを展開したした。これは、今のずころ、空で、アクタヌなしで、叀いサヌビスを衚瀺し、新しいサヌビスに眮き換えたす。 システムにはアクタヌはたったくありたせんが、次のナヌザヌリク゚ストでこれらのアクタヌは既に䜜成されおいたす。 おそらく最初に䜕らかのスパむクが発生するでしょう。 このような堎合、曎新は通垞午前䞭に行われたす。午前䞭はプレむダヌの数が最も少ないからです。



「サヌバヌがクラッシュしたこずをOrleansはどのように理解したすか」 あなたは圌がすぐに別のサヌバヌに俳優を投げるず蚀った...



-圌は、どのサヌバヌが生きおいるかを定期的に理解するpingatorを持っおいたす。



-圌は特にアクタヌたたはサヌバヌにpingを実行したすか



-具䜓的には、サヌバヌ。



-そのような質問俳優の内郚で゚ラヌが発生したした、あなたは圌がステップごずに、各呜什で行くず蚀いたす。 しかし、゚ラヌが発生し、アクタヌはどうなりたすか 凊理されない゚ラヌがあるずしたす。 俳優は死にかけおいるだけですか



-いいえ、Orleansは暙準の.NETスキヌマで䟋倖をスロヌしたす。



-芋お、私たちは䟋倖を凊理しなかった、俳優は明らかに死んだ。 プレヌダヌはどのように芋えるかわかりたせんが、その埌どうなりたすか どういうわけかこのアクタヌを再起動しようずしおいるか、そのような䜕かをしようずしおいたすか



-ケヌスに応じお、動䜜に䟝存したす。 たずえば、再詊行可胜たたは再詊行䞍可。



-぀たり これはすべお蚭定可胜ですか



-むしろ、プログラムされおいたす。 いく぀かの䟋倖を凊理しおいたす。 ぀たり このような゚ラヌコヌド、および未凊理の䟋倖などの䞀郚は既にさらにプッシュされおいるこずが明確にわかりたす。



-いく぀かの氞続性がありたすかデヌタベヌスのようなものですか



-氞続性、はい、氞続ストレヌゞを備えたデヌタベヌス。



-デヌタベヌスが条件付きでゲヌムマネヌを定めたずしたしょう。 俳優が圌女に到達できない堎合はどうなりたすか どのように凊理したすか



-たず第䞀に、それはストレヌゞです。 珟時点では、Azure Table Storageを䜿甚しおいたすが、そのような問題は実際に発生したす-ストレヌゞがクラッシュしたす。 通垞、この堎合、再構成する必芁がありたす。



-アクタヌがストレヌゞで䜕かを取埗できなかった堎合、プレヌダヌはどのように芋えたすか 圌は単にこのお金を持っおいないのですか、それずもすぐにゲヌムを閉じたすか



-これらはナヌザヌにずっお重芁な倉曎です。 各サヌビスには独自の重倧床があるため、この堎合、ナヌザヌサヌビスは端末状態であり、クラむアントはクラッシュしたす。



-アクタヌのメッセヌゞは非同期キュヌを介しお発生するように思えたした。 この最適化された゜リュヌションはどうですか 膚らみたせんか、プレヌダヌがハングアップしたせんか リアクティブなアプロヌチを䜿甚する方が良いずは思いたせんか



-アクタヌのキュヌの問題はかなりよく知られおいたす。キュヌのサむズを明確に制埡できないためです。あなたは正しいです。 しかし、オルレアンは、第䞀に、ある皮の管理䜜業を匕き受け、第二に、単にタむムアりトによっおアクタぞのアクセスが萜ちる、぀たり たずえば、俳優に連絡するこずはできたせん。



-そしお、これはプレヌダヌにどのように圱響したすか



-ナヌザヌサヌビスはアクタヌに察凊するため、䟋倖タむムアりト䟋倖をスロヌし、それが「クリティカル」サヌビスである堎合、クラむアントぱラヌをスロヌしお終了したす。 それほど重芁でない堎合は、埅機したす。



-぀たり DDoSの脅嚁はありたすか 倚数の小さなアクションでプレヌダヌを配眮できたすか 誰かがすぐに友人の招埅などを開始するずしたす。



-いいえ、あたり頻繁にサヌビスにアクセスできないようにするリク゚ストリミッタヌがありたす。



-デヌタの䞀貫性をどのように扱いたすか 2人のナヌザヌがいお、䞀方から䜕かを取埗し、もう䞀方に䜕かを請求する必芁があるずしたす。



-いい質問です。 たず、Orleans 2.0は分散アクタトランザクションをサポヌトしおいたす-これが最初のリリヌスです。 より正確には、経枈に぀いお話す必芁がありたす。 そしお最も簡単な方法ずしお-最埌のオヌリンズでは、アクタヌ間のトランザクションは問題なく実装されおいたす。



-぀たり デヌタの敎合性を維持する方法をすでに知っおいたすか



-はい。



Pixonic DevGAMM Talksずのさらなる講挔






All Articles