商用SaaSプロジェクトでElixir Phoenixを使用する
LinklyはElixirで書かれています。
私は常にErlangエコシステムに触れたいと思っており、Elixirはその簡単なルートです。
ここではBEAMやErlangの利点については直接取り上げません。それらについては他の場所で書かれているためです。代わりに、実際のプロジェクトでElixir Phoenixを使用する際の実用性に焦点を当てます。
Ruby on Railsが何であるかはご存知だと仮定します。ElixirのWebフレームワークであるPhoenixは、Railsから大きな影響を受けているためです。
Elixir Phoenixでの実際のプログラミング
Elixirで書くことは喜びに満ちた体験です。
MVCを含むRailsと同様のパラダイムに従い、見た目も似ています。
Railsとは異なり、コードは実行前にコンパイルされます。これは有用なステップであり、そうでなければ気づかなかったかもしれないエラーをキャッチすることができます。
Phoenixのモデルは「コンテキスト」にグループ化されています。これは抽象化の追加レベルであり、アプリケーションの部分(例:ユーザーと製品)間に明確な分離を作成することを目的としています。各コンテキストには任意の数のモデルを含めることができます。
パフォーマンス
他のブログでパフォーマンスについて多くのことが語られているので、ここでは実用的な側面をカバーします。
完全に機能を備えたWebフレームワークとして、パフォーマンスは明らかにRailsよりもはるかに高速であり、実行に必要なハードウェアも大幅に少なくなります。
mix phx.server対rails serverの起動時間は高速です。ラップトップで開発している場合でも、Phoenixではページの読み込みが明らかに速くなります。
Elixir Phoenix対Railsのパッケージの可用性
表面的には、ここに違いがあるように見えます。Railsには数千のgemがありますが、ElixirにはHexリポジトリがあります。
実際には、実際に使用するほぼすべてのものがElixir Hexパッケージシステムで利用可能です - JSONパーサー、HTTPクライアント、Markdownのフォーマットおよび解析用ツール - すべてそこにあり、モジュールの品質は優れています。
Railsには、はるかに多くのgemがありますが、メンテナンスされていない状態や、アプリケーションに外部依存関係を組み込みすぎることに関連するリスクのため、実際のプロジェクトにそれらを含めることはないでしょう。
StripeやRecurlyのようなプラットフォームは、APIとのやり取りのために独自のRails gemを維持しています。これは便利ですが、Elixirのサポートは一般的に不足しています。
しかし、サービスのHTTPエンドポイントとやり取りするためにElixirのTeslaパッケージを使用するのは非常に簡単であり、最終的には、事前にパッケージ化されたgemを使用するのではなく、この方法で作業することを好むようになりました。それは軽量で、何が起こっているのかを理解できるためです。
データベース抽象化 - EctoとActiveRecord
EctoはActiveRecordほど完全に機能を備えていません。
それはそのように意図されていません。
Ectoは、データベースクエリをElixirオブジェクトにマッピングするシンプルなデータベースラッパーです。
最初は、ActiveRecordのように機能しないことに不満を感じました。
しかし、Ectoを使用すると、非常にわかりやすい方法でデータベースとやり取りでき、実際にWebアプリケーションのプログラミングがはるかに簡単になります。
ActiveRecordでは、複雑なクエリの構築を開始すると、ActiveRecordを理解するよりも、SQLとしてクエリを書く方が時間がかかります。
両方を使用した結果、Ectoのような軽量なデータベースラッパーを使用する方が、ActiveRecordのような重量級の抽象化を使用するよりも簡単であるという結論に達しました。
データベースラッパーを使用する安全性を提供しながら、「賢すぎる」抽象化の頭痛と重さはありません。
どちらもマイグレーションとロールバック機能を含んでいます。
PhoenixプロジェクトのデフォルトデータベースはPostgresです。
NoSQLデータベースを使用する人にとって、EctoはMongoと連携します。
さらに良いことに、EctoはPostgresのNoSQL機能と連携し、Mongoを必要とせずにJSONを保存してクエリできます。
ユーザー認証
これはElixir Phoenixが不足している分野です。
RailsにはDeviseモジュールがあります。PhoenixにはCoherenceがありますが、現在はメンテナンスされていません。
基本的なユーザー名とパスワードのログインを使用したい場合は、そのすべてのステップを構築する必要があります。これには、パスワードのハッシュ化、パスワードリセットロジック、「ログイン状態を保持する」設定などが含まれます。
これは面倒であり、かなりのセキュリティリスクを伴います。
私はAuth0を使用することを選択しましたが、Phoenixと問題なく連携しました。おそらくこれはとにかくより良いソリューションですが、選択肢があればよかったです。
デプロイとホスティング
Phoenixアプリの主なホストは、Elixir愛好家によって運営されている小さなアメリカの会社、Gigalixirです。
GigalixirはGoogle Cloudでホストされているため、基盤となるインフラストラクチャは健全です。
Gigalixirのビルドパックによりデプロイが簡単になり、Elixirのすべての巧妙なデプロイ戦略(distillery、mix)をサポートしています。
「自作」よりも高価ですが、コストの大部分はPostgresデータベースホスティングに包まれています。
Elixir Phoenixは非常に軽量であるため、小さなDockerポッドで実行でき、それでも非常に健全な数のリクエストを処理できます。
マークアップにもかかわらず、頭痛を取り除くために絶対に価値があります。
付け加えると、カスタマーサポートは素晴らしいです。
プログラマーの可用性
Elixirプログラマーははるかに少ないです。
Elixirは「プログラマーの言語」です - 人々が何か他のことを学んでから来る言語です。
とはいえ、Elixirを使用する人々は通常、より優れたプログラマーです。おそらく、より良い言語を選ぶという意識的な選択のためでしょう。
これは、「ロックスター」だけがそれを使用するように見えたRailsの初期の頃を思い起こさせます(PHPと比較して)。
優れたRailsプログラマーであれば、Elixir Phoenixを習得するのに問題はなく、数日以内に稼働できるでしょう。
Elixir Phoenixを再び使用するか?
間違いなく。
私は多くの言語で作業してきましたが、Elixirは私が作業した中で最も簡単で最も強力です。
私はElixirを書くことを楽しみにしています。