フェニックスはい぀Railsを殺したしたか







通垞のプログラミング蚀語では問題を解決できない堎合がありたす。 倧量のトラフィックを䌎うリアルタむムメッセヌゞングを実珟するタスクに盎面しおいるずしたす。 最適な方法 明らかな理由から、Rubyはこれに最適なオプションではないため、代替の怜玢を開始する必芁がありたす。 倚くの方法がありたすが、ルビヌに関しおは、Elixirを䜿甚するのが最善の遞択です。







Elixirは、Erlang仮想マシンで実行されるRuby構文を備えた関数型プログラミング蚀語です。 したがっお、Rubyの䞖界の人にずっおは、この蚀語に粟通するこずは非垞に簡単です。 完党に理解するためには、ドキュメントをもう䞀床読み盎しおみおください。







タむトルからの質問ぞの回答ず、すぐ䞋にある゚リクシヌルに関する倚くの興味深いこず。







絶察に PhoenixはキラヌRailsではなく、パヌトナヌです




䞡方のプラットフォヌムのWebアプリケヌションの構造は非垞に䌌おいたす。 これは驚くべきこずではありたせん。Phoenixコミュニティの最も重芁なメンバヌの1人は、Railsのコアチヌムの元メンバヌであり、フレヌムワヌクの開発に携わる人々のほずんどはルビヌです。 ただいく぀かの違いがありたす。









フロント゚ンドで䜜業するための組み蟌みツヌルから、Railsずは異なるアむデアや哲孊に至るたで、さたざたな小さな違いもありたす。







Erlang仮想マシンずそれが食べるもの



Rubyはオブゞェクト指向プログラミング蚀語です。 これは、生産性ずシンプルさを期埅しお束本幞匘が䜜成したむンタプリタ蚀語です。 䞀方、゚リクサヌは、Jose Valimによっお䜜成され、 BEAM



ず呌ばれるErlang仮想マシンで実行される関数型蚀語です。 プログラムはBEAM



バむトコヌドにコンパむルされたす。これはオペレヌティングシステムの単䞀プロセスのように芋えたすが、実際には宇宙党䜓を運んでいたす。







BEAM



はサヌバヌ䞊で継続的に実行されたす。 RubyおよびRailsプロセスは、サヌバヌがリク゚ストの凊理を開始したずきにのみ開始されたす。 したがっお、たずえば、1時間ごずに䜕らかのアクションを実行する必芁がある堎合、Rails環境でCronJob



を䜿甚する必芁がありたすが、フェニックスでは、 BEAM



内の小さなElixirプログラムがこれを凊理したす。







 defmodule Stack do use GenServer # Callbacks def handle_call(:pop, _from, [h | t]) do {:reply, h, t} end def handle_cast({:push, item}, state) do {:noreply, [item | state]} end end # Start the server {:ok, pid} = GenServer.start_link(Stack, [:hello]) # This is the client GenServer.call(pid, :pop) #=> :hello GenServer.cast(pid, {:push, :world}) #=> :ok GenServer.call(pid, :pop) #=> :world
      
      





Elixirでタスクを実行するには、新しいプロセスErlangの魔法の䞖界ではスレッドのように動䜜したすが、実際にはどちらでもありたせんを䜜成できたす。䞀方、Rubyでは、バックグラりンドタスクを別のキュヌに配眮する必芁がありたすたずえば、 、 Sidekiq



を介しお、Webアプリケヌションずは独立しおスケヌリングできるようにしたす。







プロセスが分離され、メッセヌゞの亀換䞭にデヌタの新しいコピヌが䜜成されるため、システムの反察偎でデヌタの砎損や倉曎を心配する必芁がなくなりたす。 プロセス内の操䜜は同期的であるため、その実行順序は同じノヌドよりもはるかに適切です。 別の利点は、効率的なガベヌゞコレクタヌです。 プロセスが「独自に動䜜」するずすぐに、OSのメモリが解攟されたす。







Rubyストリヌム JRuby



、 Rubinius



には、他のストリヌムからのデヌタずやり取りする機胜がありたす。これは、その埌デバッグするのに非垞に問題がありたす。 このような堎合、競合状態はかなり急速に進行したす。







Web゜ケットを操䜜する



リアルタむムアプリケヌションチャットなどは、デヌタ亀換チャネルWeb゜ケットなどを䜿甚したす。 Phoenixでこれらを䜜成するのは簡単です。 Railsではこれも可胜ですが、Web゜ケット接続を提䟛するActionCable



コンポヌネントは、最初の1000の同時接続に察凊する可胜性は䜎いです。 フェニックスの芳点から芋るず、サヌバヌからクラむアントにメッセヌゞを送信するためのActionCable



アルゎリズムは、 ActionCable



単玔で、信頌性が䜎く、拡匵性が䞍十分です。 この堎合、ElixirずPhoenixを䜿甚するほうがどれだけ有利であるかを理解できたす。アプリケヌションは、1぀のサヌバヌから数十䞇の同時接続を簡単に凊理できたす。







公平に蚀うず、実行䞭のアプリケヌションでRailsケヌブルに問題が発生した堎合は、実装の1぀がErlangでのみ行わ AnyCable



こず AnyCable



お勧めしたす。 これにより、 BEAM



on Railアプリケヌションの利点が埗られたす。







膚倧なWebアプリケヌションをBEAM



実行するこずBEAM



特に楜しいです。耇数のサヌバヌにたたがるスケヌリングは非垞に簡単です。 フェニックスでプロゞェクトを䜜成するず、䞀般的にスケヌリングの問題を忘れるこずができたす。 そういえば... WhatsApp



サヌバヌもBEAM



実行されるこずを知っおいたすか







~~~



倚くの人が率盎に蚀っお、アプリケヌションをスケヌラブルにするためには、Elixirを䜿甚する必芁があるず䞻匵したす。RubyずRailsはこれに察応しおいないからです。







これは非垞に近芖県的なヒントであり、著者がスケヌリングの抂念に完党に粟通しおいないこずを瀺しおいたす。 Rubyは最も賢いプログラミング蚀語ではありたせんが、倚くの劎力をかけずに兞型的なRailsアプリケヌションをスケヌルアりトできたす。 このようなアプリケヌションは通垞、リ゜ヌスを共有しないアヌキテクチャに基づいおおり、ほずんどの堎合、サヌバヌを远加するだけで1秒あたりの凊理枈みリク゚ストの総数を増やすこずができたす。







鉄の面で最も安䟡なオプションではないかもしれたせんが、正確にスケヌラブルです







~~~



関数型プログラミングずOOP



゚リクサヌはRubyに少し䌌おいるこずがありたす。 rubyはオブゞェクト指向プログラミングの䞖界に属し、Elixirは機胜の原則に基づいお構築されおいるため、これは非垞に玛らわしいです。 これらは2぀の平行した宇宙です あなたずRubyが「あなた」に長い間切り替えた堎合、Elixirを理解するにはただ時間がかかりたす。







PhoenixはElixirで曞かれた軜快なRailsだけではありたせん




次のモゞュヌルを䜿甚しお、Elixirでメッセヌゞを送信するプロセスを構成するものを芋おみたしょう。







 defmodule Example do def start_link do spawn(fn() -> loop() end) end def loop do receive do {:hello, pid} -> IO.inspect("Got hello from #{inspect pid}") end loop() end end
      
      





それではIEx



開いおみたしょう







 iex(1)> pid = Example.start_link() #PID<0.120.0> iex(2)> send pid, {:hello, self()} "Got hello from "#PID<0.118.0>" "#PID<0.118.0>" {:hello, #PID<0.118.0>}
      
      





OOPのようですね。 Erlang / Elixirコミュニティは、ナヌモアがあっおも、これらの2぀の蚀語は、他の䞀般的なプログラミング蚀語よりもOOPの抂念ず䞀貫性があるず指摘しおいたす。 それで、Elixirはオブゞェクト指向蚀語ですか 皮類はありたせん。 しかし、それに぀いおは埌で。







メッセヌゞングの利点は、送信者が事前にわかっおおり、プロセスの盞互䜜甚を制埡できるこずです。 芖芚化ずデバッグのプロセスは、ロックやミュヌテックスなどの䞊列フロヌを制埡するための埓来の方法で起こるこずず比范しお、はるかに簡単です。







オブゞェクトRubyずは異なり、機胜的なElixirのコヌドはモゞュヌルで構成され、各モゞュヌルには通垞、特定の皮類の問題を解決するこずを目的ずした䞀連の関数が含たれおいたす。 Elixirの倧きな利点は、特定のアクションの結果が予枬可胜であるこずです。







各関数の匕数は事前に蚘述されおいるため、開発者は、むンスタンス倉数などで発生するさらなる困難から解攟されたす。 たた、システムの䞀郚が意図しおいないデヌタず察話する堎合、䞊蚘の問題を回避するのにも圹立ちたす。







競争力



Rubyに぀いおは、競争が䞍十分であるず蚀えたす。 はい、Rubyストリヌミングの䞀郚のバヌゞョンでは競争力がサポヌトされおいたすが、 GIL



ストリヌムを同期する組み蟌みのMRI



元のRuby、Cで蚘述メ゜ッドは、タスクの競争的な実行を防ぎたす。 Rubyはただ競争力のあるI / Oを蚱可しおいるこずに泚意しおください。







゚リキシルはこのために䜜成されただけです。 文字通りの意味で。 その䞭での競争は、いわゆる「アクタヌのモデル」に基づいお実装されたす。この甚語は、この甚語がリリヌスされる前からErlang仮想マシンによっお実装されおいた抂念です。







アむデアは、メッセヌゞングを通じお盞互に䜜甚し、盞互の状態に圱響を䞎えない分離プロセスを䜜成できるずいうこずです。 前のサブセクションでそのようなモデルの䟋を芋おきたした。







゚リクサヌは、Ruby自身がか぀お気に入っおいたのず同じように、通垞、ルビストに奜たれるこずに泚意しおください。 ここでの問題は、ある蚀語から別の蚀語に切り替えるこずです。 それぞれが独自の方法で優れおおり魅力的ですが、2぀の蚀語で同時に曞くこずは䞍可胜です。 あなたは遞択をしなければなりたせん。







デヌタベヌスを操䜜する



RubyずElixirで最も䞀般的なデヌタベヌスツヌルであるActiveRecord



ずEcto



それぞれ比范したしょう。 どちらもリク゚ストを䜜成しお怜蚌を䜿甚できたすが、それでもたったく異なる方法で機胜したす。 ハッカヌにずっおActiveRecord



はシンプルで盎感的に䜿甚でき、さらにSQL



知識は必芁ありたせん。 Ecto



のストヌリヌは正反察です。理解するのがより難しく、さらに基本的なSQL



知識が必芁です。







 defmodule Sample.App do import Ecto.Query alias Sample.Weather alias Sample.Repo def keyword_query do query = from w in Weather, where: w.prcp > 0 or is_nil(w.prcp), select: w Repo.all(query) end def pipe_query do Weather |> where(city: "Kraków") |> order_by(:temp_lo) |> limit(10) |> Repo.all end end
      
      





ActiveRecord



はRailsの秘密の歊噚であるず蚀えたす そこから誰もが錻を向け始めたのです。 Ecto



に぀いおもEcto



こずは蚀えたせん。 Ecto



は優れおいたすが、Phoenixはそれがなければ玠晎らしいのですが、 ActiveRecord



ないRailsはそれ自䜓ではありたせん。







宝石ずパッケヌゞ



gemは、別の開発者が䜜成したコヌドで、アプリケヌションに簡単に統合できたす。 本質的に普通のラむブラリ。 プロゞェクトのほずんどのルビストは、垞に同じ宝石を䜿甚しおいたす。 gemを䜿甚しないコヌドは、塩を䜿甚しない食品に䌌おいるず蚀えたす。 gem゚コシステムの党機胜を評䟡するには、 こちらをご芧ください 。







Elixirの䞖界では、サヌドパヌティの開発者が提䟛するこのような゜フトりェアはパッケヌゞず呌ばれたす。 パッケヌゞの゚コシステムは、ただヘムの゚コシステムの芏暡たで成長しおいたせん詳现はリンクを参照 。 PhoenixずEcto



での動䜜から刀断するず、パッケヌゞは将来のアップデヌトで問題を匕き起こすこずはないはずです。 しかし、確実に蚀うのは数幎埌にのみ可胜です。







スピヌド



私たちは自信を持っお蚀うこずができたすフェニックスは高速です。 Railsよりもはるかに高速です。




ネットワヌクの広倧さでは、さたざたなパフォヌマンステストに関する倚くの情報を芋぀けるこずができたすが、詳现ではありたせん。 おもしろいですが、Elixirでテストをロヌドしおサヌバヌを「再起動」しようずするず、優れた電源むンゞケヌタヌにもかかわらず、テストマシンはほずんどの堎合倱敗したす。







たた、RubyずElixirおよびRailsずPhoenixでの開発速床はほが同じです。 もちろん、あるフレヌムワヌクから別のフレヌムワヌクに初めお移動する堎合、時間の損倱は避けられないこずを理解する必芁がありたす。







ダりンタむムのない高速展開



ほずんどのWebアプリケヌションでは、゜フトりェア曎新䞭の短いダりンタむムは問題を匕き起こしたせん。 倚くの䌁業は、1〜2分のダりンタむムを排陀しようずしおいたすが、お金を捚おおいるこずに気付くこずすらありたせん。 堎合によっおは、ダりンタむムなしの展開が本圓に必芁です。







Rubyの環境でこの問題を解決するには汗をかかなければなりたせん。Elixirはすぐに察凊したすBEAM



特にこの機胜が組み蟌たれおいたす。これはホットコヌドの眮き換えです。 倚くの人にずっお、それは奇跡になりたす。 Dockerを攟棄しなければならない可胜性が高いです。 芁するに、いく぀かのプラス。







ただし、急いで喜ばないでください。曎新にデヌタベヌスの移行が含たれおいる堎合、䞡方のテクノロゞヌのダりンタむムを達成するのはそれほど簡単ではありたせん。







ナキヒロvsホセ デビッドvsクリス



束本幞宏ずホセ・ノァリムは本圓に重芁な人物であり、それぞれが自分の蚀語ずコミュニティ党䜓で倚くのこずをしおきたした。 しかし、各蚀語の原動力の䜜成者に぀いお詳しく話したしょう。 RailsやPhoenixなどのオヌプン゜ヌスプロゞェクトには通垞、倧芏暡な開発チヌムがいたす。 そのようなチヌムでは、通垞、補品クリ゚ヌタヌが重芁な圹割を果たしたす。 開発の方向性を決定し、公共掻動を実斜したす。







Railsの開発者であるデビッドハむンマむダヌヘン゜ン 別名 DHHは、発案の最初の日からプレれンテヌションを行っおいたす。 圌は玠晎らしいスピヌカヌです。 以前、RailsConfカンファレンスでの圌のプレれンテヌションは、垞に倚くのこずに目を向けおいたした。 今、圌は少し地面を倱いたしたが、圌の貢献はただ巚倧です。







デビッドは、也燥した䟋を説明する方法を知っおいたす。 プログラミングに加えお、圌は写真ずモヌタヌスポヌツに埓事しおいたす。 しかし、それでも、゜フトりェア補品たたは本を「埩掻させる」圌の胜力そう、圌は䜜家でもありたす ず競うこずは困難です。







デビッドは慢に芋えるかもしれたせんが、理解できたす。 RailsコミュニティはPhoenixコミュニティよりもはるかに倧きく、DavidはChrisが行うように、䌚議で党員ず物理的に通信するこずができたせんでした。







そのお金は成功の指暙ではありたせんでしたが、Davidはbasecamp companyのおかげで倧富豪になりたした。これはRubyずRailsスタックで動䜜したす。







フェニックスのクリ゚ヌタヌであるクリス・マッコヌドも、最初から人前で話しおいたした。 クリスはRailsコミュニティのメンバヌでしたが、いく぀かの問題の解決策が芋぀からなかったため、゚リクサヌに切り替えたした。 ダビデがか぀おやったように、圌は自分の創造に情熱を傟けおいるず感じおいたす。 䌚議では、クリスは新参者により忠実です。 圌のレポヌトは、蚓緎されおいないリスナヌにより適しおいたす。







ChrisはDockYardで働いおいたす。DockYardのリヌダヌは印象的な゚リキシルのチヌムを集めたした。 䌚瀟にはクヌルなブログもあり、倚くの蚘事をサむトの翻蚳に䜿っおいたす 。







䞡方のフレヌムワヌクの䞻な問題



最も難しいのは、優れた開発者を芋぀けるこずです。これは、PhoenixずRailsの䞡方に関連しおいたす。 フェニックスにずっお、このタスクははるかに深刻です。 そしお、これは倧きな問題です。 誰も䜜業しないのに、なぜ完璧なフレヌムワヌクが必芁なのでしょうか おそらく、Phoenixは䞀流のPHP開発者ず友達になるべきでしょうか







今日、誰もがどこでも゚リクシヌルに぀いお話しおいる。 勉匷を始めたしょう-今すぐ




テクノロゞヌの原動力は私たちですので、゚リクサヌの開発にできるだけ早く参加しおください







たた、どのフレヌムワヌクを遞択したすか



芁玄するず、Phoenixはわずかに匷力なテクノロゞヌを提䟛しおいるず蚀えたすが、これはプロゞェクトの成功を瀺すものではありたせん。 本圓に重芁なのは、䜜業するフレヌムワヌクに粟通しおいる開発者の存圚です。







Railsで長い間プロゞェクトを実行しおいる堎合、Phoenixに移動するずきは非垞に泚意しおください。 奇劙な庭では、草は垞に緑です。 実際には、転送は成功したすが、ほずんどの堎合、圌らの技術のマスタヌがそれらに察凊したした。







䜕か新しいこずに挑戊したい優秀なRails開発者のチヌムが既にある堎合は、Phoenixでサむドプロゞェクトを線成し、その結果を芳察し、ゲヌムがろうそくに倀するかどうかを刀断する䟡倀がありたす。







ElixirずPhoenixは、通垞のCRUDアプリケヌションを䜜成するためにも䜿甚できたす。䜕らかの理由で、機胜プログラミング、1぀のサヌバヌのみの存圚、蚀語の新芏性など、䌁業がこれを必芁ずする堎合







ダりンタむムなしの速床ず展開がプロゞェクトに䞍可欠である堎合、Phoenixを䜿甚すればすぐに察応できたす。







そしお、あなたが遞択したものは䜕でも、間違ったオプションがないこずを知っおいたす。







おわりに



この蚘事は、次の3぀の資料を線集したものです。









翻蚳はNadezhda / tresstenselによっお行われたした 。

材料の適合は、 ダロスラフ / ダロスラフによっお行われたした 。







PS興味のある人は党員、10月19日19:00 にRamblerで開催されるElixirミヌティングに招埅されたす。 他の郜垂や囜の居䜏者向けに、オンラむンブロヌドキャストが開催されたす。







PPS TelegramのElixirに関する質問ぞの回答。








All Articles