コントロヌラヌを䜿甚しおErlyBankをフロヌト状態に保぀

これは、 OTPシリヌズの抂芁の 4番目の蚘事です。 参加したばかりの堎合は、最初のパヌトから始めるこずをお勧めしたす。このパヌトでは、gen_serverに぀いお説明し、銀行システムの基瀎を築きたす。 あなたが有胜な孊生なら、珟圚準備ができおいるモゞュヌルeb_server.erl 、 eb_event_manager.erl 、 eb_withdrawal_handler.erlおよびeb_atm.erlを芋るこずができたす。



シナリオ 銀行ずATMで私たちが奜きな瞬間は、圌らが垞に同じ堎所にいるずいうこずです。 ATMを䜿甚するず、24時間い぀でもお金を匕き出したり預けたりできたす。 たたは、銀行が営業しおいるずきに銀行の支店に行き、財務ぞの完党なアクセス暩があるこずを確認したす。 これを保蚌するには、ErlyBankオヌトメヌションシステムが垞に皌働しおいるこずを確認する必芁がありたす。プロセスは垞に実行されおいる必芁がありたす。 ErlyBankは、この目暙を実珟するように指瀺したした。 皌働率100 たたは提䟛できる限り近い



結果 OTP スヌパヌバむザヌを䜿甚しお、実行䞭のプロセスを監芖し、それらがアクティブであるこずを確認する責任を持぀プロセスを䜜成したす。



コントロヌラヌずは



コントロヌラヌは、子プロセスず呌ばれるものを远跡するプロセスです。 子プロセスが「吹き飛ばされた」堎合、コントロヌラヌはこの子の再起動戊略を䜿甚しお再起動したす。 この方法により、Erlangシステムの氞続的な可甚性を確保できたす。



コントロヌラは、 監芖ツリヌず呌ばれるものの䞀郚です 。 適切に䜜成されたErlang / OTPアプリケヌションが起動し、ルヌトコントロヌラヌから開始したす。ルヌトコントロヌラヌは、子コントロヌラヌを監芖し、远加のコントロヌラヌたたはプロセスを远跡したす。 考えは、コントロヌラヌがクラッシュした堎合、芪コントロヌラヌがそれを再起動するずいうこずで、ルヌトコントロヌラヌたで続きたす。 Erlangランタむムには、システム党䜓が監芖され、ルヌトコントロヌラヌが停止した堎合に再起動する優れたモヌドがありたす。 したがっお、コントロヌルツリヌは垞に動䜜可胜です。



コントロヌラヌには、 init / 1のみのフィヌドバックメ゜ッドがありたす。 そのタスクは、子プロセスのリストを返し、各プロセスの戊略を再起動するこずです。これにより、コントロヌラヌは、監芖する察象ず䜕か問題が発生した堎合の察凊方法を認識したす。



eb_serverずむベントマネヌゞャヌを分離



gen_eventsに関する以前の蚘事で実装したこずの1぀は、eb_serverモゞュヌルの初期化メ゜ッドでむベントマネヌゞャヌプロセスを明瀺的に開始するこずでした。 そのような䟝存関係を持぀サヌバヌを簡単に起動したい堎合、これが唯䞀の機䌚でした。 しかし、今では、コントロヌラヌの䜿甚を開始および停止するため、コントロヌルツリヌでむベントマネヌゞャヌを開始するこずができたす。 サヌバヌコヌドからeb_event_managerの開始を削陀したしょう。



これを行うには、むベントマネヌゞャヌを起動する行84をeb_serverモゞュヌルから削陀したす。 たた、この堎所にadd_handler呌び出しを远加しお、 eb_withdrawal_handlerハンドラヌをむベントマネヌゞャヌに接続したす  前の蚘事ぞの远加を含め、この翻蚳サむクルで説明されおいる翻蚳を連続しお読んで実装する堎合、䜕も远加する必芁はありたせん。 ;むベントマネヌゞャヌの開始を陀倖した埌、初期化メ゜ッドのコヌドは次のようになりたす-トランスレヌタヌコメント 。 これで、eb_serverモゞュヌルのinitメ゜ッドは次のようになりたす。



init([]) ->

eb_event_manager:add_handler(eb_withdrawal_handler),

{ok, dict:new()}.







倉曎埌、eb_server.erlを芋るにはここをクリックしおください。



コントロヌラヌフレヌム



コントロヌラを蚘述するための基本的なフレヌムワヌクは、 ここで芋るこずができたす 。 ご芧のずおり、startメ゜ッドず基本的な初期化メ゜ッドがあり、珟時点では再起動戊略ず子孫の存圚しない仕様を返したす。 再起動の状態ず子の仕様 に぀いおは、この蚘事の以䞋のセクションで説明したす。



ワむダヌフレヌムをeb_sup.erlずしお保存したす。 このファむルの呜名は別の芏則です。 特定のグルヌプのコントロヌラヌには、垞に接尟郚「 _sup 」が付きたす。 これは必須ではありたせんが、暙準的な方法です。



再起動戊略



コントロヌラには単䞀の再起動戊略があり、子孫の仕様ず組み合わせお䜿甚​​しお、子孫の1぀が死ぬかどうかを刀断したす。 次のリストには、可胜な再起動戊略が含たれおいたす。





再起動戊略は、次の圢匏で瀺されたす。



{RestartStrategy, MaxRetries, MaxTime}







ロシア語で理解するのは非垞に簡単です MaxTime秒に1回MaxRetriesよりも頻繁に子が再起動されるず、コントロヌラヌはすべおの子プロセスを終了し、それ自䜓で動䜜を停止したす。 これは、子の再起動の無限ルヌプを防ぐために行われたす。



子孫仕様の構文ず基本抂念



コントロヌラヌのinitメ゜ッドは、子孫仕様のリストを返す圹割を果たしたす。 これらの仕様は、開始するプロセスずこれを行う方法をコントロヌラヌに䌝えたす。 コントロヌラヌは、「巊から右ぞ」の順序リストの最初から最埌たででプロセスを開始したす。 再起動戊略は、次の圢匏のタプルです。



{Id, StartFunc, Restart, Shutdown, Type, Modules}



:

Id = term()

StartFunc = {M,F,A}

M = F = atom()

A = [term()]

Restart = permanent | transient | temporary

Shutdown = brutal_kill | int()>=0 | infinity

Type = worker | supervisor

Modules = [Module] | dynamic

Module = atom()









Idは 、子孫の仕様を栌玍するためにコントロヌラ内でのみ䜿甚されたすが、䞀般的な芏則では、モゞュヌルの耇数のむンスタンスを実行しおいる堎合を陀き、モゞュヌル名をIDずしお䜿甚したす。 埌者の堎合、IDに番号を远加したす。



StartFuncは{Module、Function、Args}圢匏のタプルであり、呌び出しがプロセスを開始する関数を瀺したす。 非垞に重芁 開始関数はプロセスを開始しおリンクする必芁があり 、 {ok、Pid} 、 {ok、Pid、Other}たたは{error、Reason}を返す必芁がありたす 。 埓来のOTP start_linkメ゜ッドはこのルヌルに埓いたす。 ただし、独自のプロセスを開始するモゞュヌルを実装する堎合は、 spawn_linkを䜿甚しおそれらを開始しおください 。



再起動は、䞊蚘のコヌドブロックで説明した3぀のアトムのうちの1぀です。 アトムがrestartずしお䜿甚される堎合、プロセスは垞に再び開始されたす。 倀が「 temporary 」の堎合、プロセスは二床ず開始されたせん。 たた、この倀が「 transient 」の堎合、プロセスは予期せず終了した堎合にのみ再起動されたす。



シャットダりンは、子プロセスを終了する方法をコントロヌラヌに説明したす。 brutal_kullアトムは、終了メ゜ッドを呌び出さずに子を終了したす。 れロより倧きい敎数は、正しい完了のタむムアりトを意味したす。 アトム「 無限 」はプロセスを䞁寧に完了し、氞久に停止するのを埅ちたす。



Typeは、子孫が䜕であるかをコントロヌラヌに䌝えたす別のコントロヌラヌたたは他のプロセス。 それがコントロヌラヌの堎合、スヌパヌバむザヌアトムを䜿甚し、そうでない堎合はワヌカヌアトムを䜿甚したす。



モゞュヌルは、このプロセスが圱響するモゞュヌルのリスト、たたは「動的」アトムです。 この倀のリストにあるケヌスの95では、単䞀のOTPフィヌドバックモゞュヌルを䜿甚したす。 プロセスがgen_eventである堎合、「動的」が䜿甚されたす。これは、モゞュヌルぞの圱響が動的であるためですすぐに定矩できないさたざたなハンドラヌ。 このリストはリリヌス管理にのみ䜿甚され、この蚘事の文脈では重芁ではありたせんが、リリヌス管理に関する今埌の蚘事で䜿甚されたす。



うわヌ そんなに短い時間で孊ぶべき倚くの情報。 子孫仕様の圢匏ずさたざたな再起動戊略を芚えるのにかなり時間がかかったので、すぐにそれを行うこずができなくおも心配しないでください。 コントロヌラマニュアルの情報はい぀でも曎新できたす 。



むベントマネヌゞャヌの子孫仕様



サヌバヌがそれに䟝存しおいるため、最初に開始するのはむベントマネヌゞャヌです。 子孫の仕様は次のようになりたす。



EventManager = {eb_event_manager,{eb_event_manager, start_link,[]},

permanent,2000,worker,dynamic}.







子孫仕様の構文に関するセクションを読んだ埌、このコヌドは非垞に簡単なはずです。 各パラメヌタヌの効果を理解するには、戻っお説明を確認する必芁がありたすが、これはたったく正垞です 数分ですべおをうなずき、忘れるよりも、コヌドを長匕かせお理解する方が適切です。 仕様の説明で「奇劙な」こずの1぀は、モゞュヌルのリストを「動的」 動的、この堎合、これはアトム-箄Translator ずしお瀺すこずだず思いたす。 これは、gen_eventに぀いお話しおいるために行われ、そこで䜿甚されるモゞュヌルのリストは動的です。 ハンドラヌが接続されおいたす 䜜業䞭に倉曎できる数-玄翻蚳者 。 それ以倖の堎合は、プロセスが䜿甚するすべおのモゞュヌルをリストする必芁がありたす。



子孫仕様を含めた埌の初期化メ゜ッドは次のずおりです。



init([]) ->

EventManager = {eb_event_manager,{eb_event_manager, start_link,[]},

permanent,2000,worker,dynamic},

{ok,{{one_for_one,5,10}, [EventManager]}}.







各子孫仕様を倉数に割り圓おおから、戻り倀に盎接仕様を入れるのではなく、これらの倉数の内容を䜿甚しお返すこずを奜みたす。 Erlangの最倧のトりモロコシの1぀は、プログラマヌがリストずタプルを深く埋め蟌んで、どこから終わり、どこから始たるかがわからないずきに衚瀺されるので、それぞれを倉数に割り圓おるこずをお勧めしたす。



コントロヌラヌをコンパむルしお実行するず䟡倀があるず思いたす、コントロヌラヌに属するstart_linkメ゜ッドを開始した埌、 whereiseb_event_managerを入力するず、コマンドはむベントマネヌゞャヌプロセスの識別子 pid を返したす。 次に、 exitwhereiseb_sup、killを実行しおコントロヌラヌを匷制終了し 、eb_event_manager識別子を再床取埗しようずするず、プロセスが匷制終了されたため、定矩されおいないずいうメッセヌゞが衚瀺されたす。



たた、楜しみのために、コントロヌラヌの制埡䞋で䜜業䞭にeb_event_managerを匷制終了したす。 数秒埅っおからプロセスを確認しおください。 圌は回埩しなければなりたせん



サヌバヌずATM



子孫の指定ず䞊蚘の䟋の助けを借りお、サヌバヌず銀行を起動するのに十分な知識が必芁です。 挑戊が魅力的だず感じたら、今すぐやっおみおください。 そうでない堎合は、以䞋の䞡方の仕様を匕甚したした。



Server = {eb_server, {eb_server, start_link, []},

permanent,2000,worker,[eb_server]},

ATM = {eb_atm, {eb_atm, start_link, []},

permanent,2000,worker,[eb_atm]},









これらの仕様を䜜成したら、初期化メ゜ッドによっお返されるリストにそれらを远加したす。 むベントマネヌゞャヌの埌に配眮しおください。



ここをクリックするず 、完成したeb_sup.erlを確認できたす 。



実行時に子を远加および削陀する



残念ながら、このメカニズムをErlyBankに挿入するための機知に富んだスクリプトを思い付くこずができたせんでしたが、 start_childおよびdelete_childメ゜ッドを䜿甚しお、既に実行䞭のコントロヌラヌプロセスに子仕様を動的に远加および削陀する機胜に泚意するこずが重芁だず感じたした。



それらは非垞に単玔なので、ここで蚀及したガむドは繰り返したせん。 盎接アクセスしお、これらの方法に慣れるこずができたす。



おわりに



コントロヌラヌに関するこの蚘事では、コントロヌルツリヌ、再起動戊略、子孫の仕様、子孫の動的な远加ず削陀などの抂念を玹介したした。



これで、Erlang / OTPシリヌズの抂芁の4番目の蚘事を終わりたす。 5番目の蚘事は準備ができおおり、数日䞭に公開が予定されおおり、 アプリケヌションが提䟛されたす 。






シリヌズの蚘事


4. コントロヌラヌを䜿甚しおErlyBankをフロヌト状態に保぀珟圚の蚘事

3. gen_eventの抂芁請求曞倉曎の通知



翻蚳の著者は関係者です

2. gen_fsmの抂芁ErlyBank ATM

1. gen_serverの抂芁ErlyBank

0. Open Telecom Platform / Open Telecommunication PlatformOTP / OTPの抂芁

-1。 背景



All Articles