Zen Erlang [およびElixir-箄 翻蚳者]

翻蚳者からの玹介


この蚘事ではErlangに぀いお説明したすが、同じBEAM仮想マシン䞊で動䜜する関数型蚀語であるElixirに぀いおも同様に適甚できたす。 2012幎に登堎し、珟圚積極的に開発䞭です。 Elixirは、Erlangの利点を保持しながら、最も䜿い慣れた構文に加えお、広範なメタプログラミング機胜を取埗したした。


翻蚳者の詳现

2016幎の蚘事ですが、有効期限のない基本的な抂念に関するものです。


私翻蚳者からの抂念ずコメントぞの参照は角括匧[]あり、「翻蚳者のメモ」でマヌクされおいたす。


翻蚳の䞀郚が、特に甚語に関しお十分に正しくない堎合、たたはその他の゚ラヌが発生した堎合はお知らせください。喜んで修正したす。


テキストの校正ず線集にご協力いただいたJan Gravshinに感謝したす。


これはGenetecが䞻催するConnectDev'16カンファレンスでの私のプレれンテヌションの無料のトランスクリプトたたは長い蚀い換えです。


001


ここのほずんどの人はErlangでプログラミングしたこずがないず思いたす。 聞いたこずがあるか、名前を知っおいるかもしれたせん。 したがっお、私のプレれンテヌションはErlangの高レベルの抂念にのみ圱響し、この蚀語に出䌚ったこずがない堎合でも、仕事やサむドプロゞェクトで圹立぀ようになりたす。


002


アヌランに興味を持ったこずがあるなら、「クラッシュさせよう」ずいうモットヌに぀いお聞いたこずがありたす。 翻蚳者 ]。 圌ずの最初の出䌚いは、それが䞀䜓䜕なのかず思いたした。 Erlangはマルチスレッド実行ずフォヌルトトレランスに優れおいるはずでしたが、ここではすべおを萜ずすこずを提案したす。私が本圓に望むシステムの動䜜の正反察です。 この提案は驚くべきこずですが、それにもかかわらず、アヌランの犅はそれに盎接関係しおいたす。


003


ある意味では、Erlangに「Let it Crash」を䜿甚するこずは、「Blow it up」[ 「 Blow it 」ず同じくらい楜しいです。 -箄 翻蚳者 ]ロケット科孊甚。 「爆砎」はロケット科孊でおそらく最埌に望むこずであり、チャレンゞャヌの倧惚事はこれを鮮明に思い出させたす。 䞀方、状況を異なる芖点で芋るず、ロケットずその掚進システム党䜓が爆発する可胜性のある危険な燃料を扱っおいたすそしおこれは危険な瞬間ですが、宇宙を敎理するために䜿甚できるような制埡された方法でペむロヌドを軌道に移動たたは送信したす。


そしお、ここでのポむントは実際に制埡されおいたす。 ロケットサむ゚ンスを、爆発たたは少なくずもそのパワヌを適切に制埡しお、必芁な凊理を行う方法ずしお怜蚎するこずができたす。 次に、同じ角床からクラッシュさせたすフォヌルトトレランスに関するものです。 このアむデアは、広範囲にわたる制埡䞍胜な障害ではなく、障害、䟋倖、およびクラッシュを䜿甚可胜なツヌルに倉えるこずです。


004


近づいおくる秋[近づいおくる秋-玄。 トランスレヌタ ]ず制埡されたアニヌリングは、火で火ず戊う実際の䟋です。 私の出身地であるサグネ・ラック・サン・ゞャンでは、ブルヌベリヌ畑が定期的に管理された方法で燃やされ、成長を刺激し、再開したす。 かなり頻繁に、森林火灜を防ぐために森林の䞍健康な゚リアが火事でクリアされるのを芋るこずができるので、これは適切な監督ず管理の䞋で起こりたす。 䞻な目暙は、自然の火がさらに広がるこずがないように、可燃物を取り陀くこずです。


これらの状況のすべおにおいお、䜜物や森林を通過する火の砎壊力は、䜜物を癒したり、森林のはるかに倧きな制埡されない砎壊を防ぐために䜿甚されたす。


「Let it crash」の意味はたさにそれだず思いたす。 倱敗、クラッシュ、䟋倖を利甚しお、それを管理可胜な方法にするず、回避する必芁がある恐ろしい出来事をやめ、代わりに倧芏暡な信頌性の高いシステムを組み立おるための匷力な構築芁玠になりたす。


005


したがっお、問題は、障害が砎壊的よりも建蚭的であるこずを保蚌する方法になりたす。 Erlangのこのためのメむンチップはプロセスです。 Erlangプロセスは完党に分離されおおり、分離できないアヌキテクチャを備えおいたす䜕も共有したせん。 他のメモリにクロヌルしたり、䜿甚するデヌタを歪めたりしお、䜜業に圱響を䞎えたりするプロセスはありたせん。 これは、100保蚌された死にかけおいるプロセスが問題をそれ自䜓に保持し、システムに非垞に匷力な障害分離を提䟛するこずを意味するため、優れおいたす。


Erlangのプロセスも非垞に軜量であるため、数千および数千のプロセスが同時に問題なく動䜜したす。 アむデアは、 䜙裕がある限りではなく、 必芁な数のプロセスを䜿甚するこずです。 オブゞェクト指向プログラミング蚀語があり、い぀でも最倧32個のオブゞェクトを同時に動䜜させるこずができるず想像しおください。 プログラムを䜜成するには、制限が厳しすぎおばかげおいるずいう結論にすぐに到達したす。 倚くの小さなプロセスが存圚するため、故障のばら぀きが倧きくなりたす。 サヌビスに倱敗の力を泚ぎたい䞖界では、それは良いこずです


Erlangのプロセスのメカニズムは少し奇劙に芋えるかもしれたせん。 Cでプログラムを䜜成するず、1぀の倧きmain()関数があり、それがすべおを凊理したす。 これは、プログラムぞの゚ントリポむントです。 Erlangにはそのようなものはありたせん。 どのプロセスも䞻芁なものではありたせん。 各プロセスは関数を起動し、この関数main()この特定のプロセスのmain()圹割を果たしたす。


今、私たちはミツバチの矀れを持っおいたすが、圌らが䜕らかの方法で通信できない堎合、ハむブを匷化するためにそれらを送るこずは非垞に難しいに違いありたせん。 ミツバチが螊る堎所[ ミツバチが螊る -箄 翻蚳者 ]、Erlangはメッセヌゞングを凊理したす。


006


メッセヌゞングは​​、競争の激しい環境で最も盎感的なコミュニケヌション圢匏です。 圌女は、私たちが手玙を曞いおクヌリ゚によっお銬に乗っお送った日から始たっお、ナポレオンのセマフォ[ 光孊セマフォ -箄 翻蚳者 ]むラストに瀺されおいたす。 埌者の堎合、あなたは単にたくさんの人を塔に送り、圌らにメッセヌゞを䞎え、圌らは疲れた銬よりも速い方法で長距離にデヌタを送信するために旗を振る。 埐々に、この方法は電信に眮き換えられ、それが電話ずラゞオを倉えたした。そしお今、私たちはこれらすべおのファッショナブルな技術を䜿っお、本圓に遠く、本圓に速くメッセヌゞを送信したす。


特に昔のこのメッセヌゞングの非垞に重芁な偎面は、すべおが非同期であり、メッセヌゞがコピヌされたこずです。 クヌリ゚が垰っおくるのを埅っおいる人は䞀日䞭ポヌチに立っおいなかったし、誰も私は疑わしいセマフォの近くに座っお答えを埅っおいなかった。 あなたはメッセヌゞを送信しおあなたのビゞネスに戻りたした、そしお、時間の経過ずずもに、誰かが答えが到着したこずをあなたに知らせたした。


これは良いこずです-反察偎が反応しない堎合、あなたは死ぬたであなたのポヌチで立ち埀生するこずはありたせん。 逆に、受信者は、最近到着したメッセヌゞが突然魔法のように消えたり倉曎されたりするずいう事実に盎面するこずはありたせん。 メッセヌゞを送信するずきにデヌタをコピヌする必芁がありたす。 これらの2぀の原則により、通信䞭の障害が歪んだ状態たたは修埩䞍可胜な状態を匕き起こさないこずが保蚌されたす。 翻蚳者 ]。 Erlangは䞡方を実装しおいたす。


各プロセスには、すべおの着信メッセヌゞ甚の独自のメヌルボックスがありたす。 誰でもプロセスメヌルボックスに曞き蟌むこずができたすが、ボックスの所有者のみがそれを調べる機䌚がありたす。 デフォルトでは、メッセヌゞは受信した順に凊理されたすが、パタヌンマッチング[ パタヌンマッチング -箄 翻蚳者 ]を䜿甚するず、優先順䜍を倉曎し、1皮類のメッセヌゞに垞にたたは䞀時的に集䞭できたす。


007


皆さんの䞭には、私が蚀うこずに奇劙さを感じる人もいたす。 分離ず独立性が非垞に優れおいるため、システムコンポヌネントが残りの郚分に圱響を䞎えるこずなく死に、萜䞋するこずを蚱しおいるこずを繰り返したす。 しかし、倚くのプロセスたたぱヌゞェント間の通信に぀いおも蚀及したした。


2぀のプロセスの察話の開始時に毎回、それらの間の暗黙的な䟝存関係が衚瀺されたす。 䞡方を接続するシステムで暗黙的な状態が発生したす。 プロセスAがプロセスBにメッセヌゞを送信し、Bが応答せずに死亡した堎合、Aは応答を氞遠に埅぀か、しばらくしおから通信を拒吊できたす。 2番目は蚱容可胜な戊略ですが、非垞にあいたいです。盞手偎が死んだか、長時間にわたっおビゞヌであるかは完党に䞍明であり、コンテキストのないメッセヌゞがメヌルボックスに到着する可胜性がありたす。


その芋返りに、Erlangはこの問題を解決する2぀のメカニズムを提䟛したすモニタヌずリンク[ リンク-玄。 翻蚳者 ]。


モニタヌずは、オブザヌバヌになるこずです。 プロセスを監芖するこずにし、䜕らかの理由でプロセスが停止した堎合、メッセヌゞが受信トレむで䜕が起こったかを通知したす。 これに察応し、芋぀かった情報に基づいお決定を䞋すこずができたす。 2番目のプロセスでは、これをすべお行ったこずを知るこずはありたせん。 したがっお、あなたがオブザヌバヌであればモニタヌはかなり良いです。 翻蚳者 ]たたはパヌトナヌのステヌタスを管理したす。


リンク[ リンク-箄 トランスレヌタ ]-双方向性であり、1぀の䜜成により、䞡方の関連プロセスの運呜が結合されたす。 プロセスが停止するず、それに関連するすべおのプロセスは終了コマンドを受け取りたす。 翻蚳者 ]。 このチヌムは、他の人を殺したす[ 関連-玄。 翻蚳者 ]プロセス。


モニタヌを䜿甚しお障害を迅速に怜出でき、バむンディングをアヌキテクチャ蚭蚈ずしお䜿甚しお、障害が党䜓に広がるように耇数のプロセスを組み合わせるこずができるため、これはすべお非垞に興味深いものになりたす。 独立したビルディングブロックが盞互に䟝存するようになるたびに、これをプログラムに远加し始めるこずができたす。 これは、システムが誀っお䞍安定で郚分的に倉曎された状態にクラッシュするのを防ぐため䟿利です。 接続は開発者を保蚌したす。䜕かが壊れた堎合、それは完党に壊れお空癜のシヌトを残し、挔習に参加しなかったコンポヌネントには圱響したせんでした。


この図では、安党ロヌプで結ばれた登山者の画像を遞択したした。 登山者が互いに接続しおいる堎合、圌らは悲惚な䜍眮にいるこずに気付くでしょう。 1人のクラむマヌがスラむドするたびに、チヌムの他のメンバヌはすぐに死亡したす。 ビゞネスを行うには良い方法ではありたせん。


代わりに、Erlangでは、䞀郚のプロセスを特別なものずしお指定し、 trap_exitパラメヌタヌでマヌクするこずがtrap_exitたす。 その埌、通信を介しお送信された終了コマンドを受信し、メッセヌゞに倉換できたす。 これにより、圌らはトラブルシュヌティングを行い、堎合によっおは故人の仕事を完了するために新しいプロセスをダりンロヌドするこずができたす。 登山者ずは異なり、このタむプの特別なプロセスでは、パヌトナヌシッププロセスの䜎䞋を防ぐこずはできたせん。 これはパヌトナヌ自身の責任であり、たずえばtry ... catch構造を䜿甚しお実装されたす。 出力をキャッチするプロセスには、別のメモリで再生しお保存する機䌚はただありたせんが、共同死を避けるこずができたす。


これは、監督者を䜜成する重芁な機䌚になり぀぀ありたす。 すぐにそれらに到達したす。


008


スヌパヌバむザヌに移る前に、私たち自身の利益のためにドロップを䜿甚するシステムを正垞に準備できる残りのいく぀かの成分を芋おみたしょう。 それらの1぀は、プロセススケゞュヌラの動䜜に関連しおいたす。 私が蚀及したい本圓のケヌスは、アポロ11号の月面着陞です[ アポロ11-玄。 翻蚳者 ]。


アポロ11号は1969幎に月に行ったミッションです。 画像では、バズ・アルドリンずニヌル・アヌムストロングが搭乗しおいる月面モゞュヌルが芋えたす。写真は、コマンド・モゞュヌルに残ったマむケル・コリンズによっお撮圱されたず思いたす。


月面着陞の途䞭で、モゞュヌルはApollo PGNCS䞀次ガむダンス、航法および制埡システム[ Apollo PGNCS-箄 翻蚳者 ]。 制埡システムは、慎重に蚈算されたサむクル数で耇数のタスクを実行したした[ CPU-玄。 翻蚳者 ]各。 たた、NASAは、プロセッサを容量の85以䞋で䜿甚し、15を無料で䜿甚する必芁があるこずも発芋したした。


宇宙飛行士は、ミッションを䞭断しなければならない堎合に備えお、信頌できるバックアップ蚈画を望んでいたため、コマンドおよびサヌビスモゞュヌルをオンにしお䌚議のレヌダヌを残したした。 これにより、CPUの残りの電力が適切にロヌドされたした。 Buzz Aldrinがコマンドを入力し始めるずすぐに、茻茳に関するメッセヌゞが衚瀺され始め、実際には、利甚可胜なコンピュヌティング胜力を超えたした。 システムがこれから倖れおいたら、おそらくその仕事をするこずができなかったでしょう、そしお、すべおは2人の死んだ宇宙飛行士で終わっおいただろう。


たず、レヌダヌに既知のハヌドりェアの問題があり、その呚波数が制埡コンピュヌタヌの呚波数ず䞀臎しなかったために過負荷が発生したした。これにより、通垞よりもはるかに倚くのサむクルの「窃盗」が発生したした。 NASAの人々はバカではなく、このような重芁なミッションのために実生掻でテストされおいない新しいテクノロゞヌを䜿甚する代わりに、実瞟のあるコンポヌネントを再利甚したした。 しかし、もっず重芁なのは、圌らが優先スケゞュヌリングを思い぀いたこずです。


これは、このレヌダヌ、たたはおそらく入力されたコマンドがプロセッサヌに過床の負荷をかけるず、タスクが殺され、優先床が高く、本圓に必芁な重芁なものにCPUサむクルが䞎えられるこずを意味したす。 1969幎でした。今日では、協調的なディスパッチのみを提䟛し、それ以䞊の機胜を提䟛しない蚀語やフレヌムワヌクがさらに倚くありたす。


Erlangは重芁なシステムに䜿甚されるべき蚀語ではありたせん。゜フトリアルタむムの制玄のみを考慮に入れおいたす-玄。 翻蚳者 ]、および厳密なリアルタむムの制限ではないため、このようなシナリオに䜿甚するこずはお勧めできたせん。 しかし、Erlangは予防的な蚈画を提䟛したす[ 圌女は先制的なスケゞュヌリングです。 翻蚳者 ]およびプロセスの優先順䜍付け。 ぀たり、開発者たたはシステム蚭蚈者は、フリヌズを防ぐために、コンポヌネント䜿甚するラむブラリを含むに必芁なCPU負荷を絶察に党員が慎重に蚈算するこずに泚意する必芁はありたせん 。 圌らは単にそのような力を埗るこずができたせん。 たた、必芁なずきにい぀でも重芁なタスクを実行したい堎合は、提䟛するこずもできたす。


これは深刻なたたは頻繁な芁求のようには芋えず、人々は䟝然ずしお䞊列プロセスの協調スケゞュヌリングのみに基づいお本圓に成功したプロゞェクトをリリヌスしたすが、それは確かに非垞に䟡倀がありたす。他の人の間違いから、そしおあなた自身の間違いからあなたを守るからです。 たた、自動負荷分散、「悪を眰する」たたは「良いを奚励する」プロセス、たたはより倚くのタスクを持぀プロセスに高い優先順䜍を割り圓おるなどのメカニズムぞの扉を開きたす。 これらすべおにより、最終的にシステムは負荷や予期しないむベントに十分適応できるようになりたす。


009


たずもな埩元力を確保するための䞀郚ずしお説明したい最埌のコンポヌネントは、ネットワヌクで機胜するこずです。 長期的な掻動を念頭に眮いお開発されたシステムでは、耇数のコンピュヌタヌで迅速に実行できるこずが䞍可欠な芁件になりたす。 䞻にナヌザヌに圱響を䞎える障害を補うこずができないため、金色の車でチタンのドアの埌ろにロックされた堎所に座りたくありたせん。


遅かれ早かれ、2台のコンピュヌタヌが必芁になりたす。そのため、故障䞭にシステムの䞀郚を展開したい堎合、2台目、堎合によっおは3台目の障害に耐えるこずができたす。


むラストの飛行機-F-82ツむンマスタング[ F-82ツむンマスタング -箄 翻蚳者 ]、第二次䞖界倧戊䞭に、他のほずんどの戊闘機が単にカバヌできなかった距離で爆撃機を護衛するために蚭蚈された航空機。 圌は2぀のキャビンを持っおいたため、パむロットはシフトでデバむスを制埡できたした。 適切なタむミングで、1人のパむロットが飛行機を操瞊し、2人目のパむロットが迎撃機の圹割でレヌダヌを制埡できるように、責任を分割するこずができたした。 珟代の航空機にはただ同様の機胜がありたす。 圌らには無数の重耇システムがあり、倚くの堎合、乗務員は飛行䞭に眠りたす。そのため、必芁に応じお、誰かがすぐに航空機の制埡を匕き継ぐ準備ができおいたす。


プログラミング蚀語たたは開発環境に関しおは、それらのほずんどは分散䜜業の可胜性なしに蚭蚈されおいたすが、サヌバヌスタックを開発する堎合、耇数のサヌバヌで䜜業する必芁があるこずは明らかです。 それでも、ファむルを䜿甚する堎合は、暙準ラむブラリにこのためのツヌルがありたす。 ほずんどの蚀語が提䟛できる最倧倀は、゜ケットサポヌトたたはHTTPクラむアントです。


Erlangは、分散システムの珟実に敬意を衚しお、文曞化された透過的な䜜成のための実装を提䟛したす。 , , - [ pylyglot systems — . ].


010


" ". - , . "Let it crash" , , .


— .


011


[ supervision trees — . ] — , . — , — — , . , — "OTP", , "Erlang/OTP" [ OTP — Open Telecom Platform — . ].


— , , , , , "" . , : , , .


, , , , — .


012


. " , ". , . .


. " " [ one for one — . *]. . , .


— " " [ one for all — . *]. , . , , . , . , . , , . , , !


, , , . , . : , .


, . — " " [ rest for one — . ]. , , . .


[ , — — . ] . 1 , 150 .


013


, , " , !"


. , , , . "" [ — . ] "" [ — . ], Jim Gray 1985 ( Jim Gray, !)


-, — , , . . , , . , , , , .


— , , , . , , . , , .


, , .


014


, — .


, . , , .


, — , , . , — ; . , , . , , , .


, , .


. , , [ Property-Based Testing Basics , Property-based testing — . ] ( ), — - , . , , , .


015


( ). , , .


, . , , , , . - -.


. , , , , , , .


, . Jim Gray, , , 132 , , . 131 132 , , . , , , , ; , , , 100 000 , — 10 , - .


, , .


016


?


, . . , . , , . , "" Facebook ( ), , , Facebook .


, , , , . , , .


, . : , , , , .


, ( ), , . , .


017


, , . , , , .


, , .


018


() . , : . Tally () , Live Reports ( ) .


, . District (; ) , (Storage). (Cache) ( ) (Worker pool).


[ supervision strategies — . ], , , , . , " ", , , . ( ) " ". , (OCR) , , . , , , , .


OCR , C , . , C, , , .


, , , . 10 , , , .


, , . , . — , .


, , , . OCR C , . OCR . . , , ( ). , , — , .


OCR , . , , — . — . , , , , - , .


, . , — - , - ( ) , . , — , . — let it crash!


. , if/else , switch ', try/catch . , , , . [ , — . ], .


019


, , , , . : , .


, , , . (, SMS).


, , , , , .


020


OTP. OTP- — , . , , . , , , . , , , .


, OTP- . OTP-, . [: OTP-, , ]


:



. , . , , . , — , , .


021


, ? , . , Heroku .


. (vegur) , , , . , , .


- , . , : 500 000 1 000 000 ! , . ? , , , 100 000 , ? - 1:17000 1:7000. , , , .


, . , , , . , . , , .


022


. .


, - : " , . , , , . , , . , ."


. .


, , , 60 . ( United 734), , , , - . , , , , ABS, .


( ), . , . , , .


023


, . ( , ) Richard Cook. , YouTube, .


- . , , , .. — ( , , ..) , , - , .


, , , . , , - - .


, , , . , . , . - - , , , .


024


, . , , : , . . , , , .


, , , . .


025


, , . , , , .


. , , , - , , , , , . , .


026


, 'let it crash' — , , , , , — , , , . . fail-fast , , " ", .


, . , , . . , , . Let it crash.


027


: , , , — . , ( , !) .



Source: https://habr.com/ru/post/J443290/


All Articles