🧊

ElixirでNode.jsのAPIサーバーを書き直してみたメモ

っても、個人プロジェクトなのですごく小さいけど・・。

そもそもElixirを学ぶところからはじめて、だいたい1週間くらい。

そもそもなぜElixir?

仕事でWebRTCなことをやってると、他の事例とかも気になるもので。
で、そのサービスの性質からか、シグナリングサーバーとかバックエンドにErlangやらElixirが使われることが多いと知る。

というわけでまあどんな感じか知っておいて損はないかなーというのと、最近フロントエンドに飽きがきてるのも否めなくて、いっちょ他の言語でもさわってみるかーという感じ。

関数型に思い入れとかはないですw

やったこと

APIサーバーは、自分で作ったmp3のストリーミングサービスのバックエンド。

  • ルートは4つ
    • うち2つはログインしないと叩けない
  • オンメモリでログイン認証
  • パラメータでもらったパスからmp3ファイルをまるっと返す

というまあとりあえず学ぶにしてはほどよい感じ。

書き換えてみて

Phoenixしか選択肢がないのか

「Elixir APIサーバー」って検索すると、Phoenixを使う内容ばっかし出て来る。

PhoenixRubyでいうRailsとのことで、

  • 今回のケースではオーバースペックだなーと思った
  • たぶんPhoenix使ったらスグ書き換えられるけど、それじゃ勉強にならん

というわけで、その一歩手前(Phoenixも中で使ってる)のPlugでいろいろ書いてみることにした。
結果としては完成したけど、冗長なコードとかも多くなったので、大人しくPhoenixにしててもよかったかもなーという気持ちもある。(Pipelineとか使いたかった)

Node.jsエンジニア向けに書くと、Plugはミドルウェアなしの素のExpressよりもさらに機能を削ったやつって感じ。
立ち位置的には、素のExpressって言ってしまってよさそう。

Elixirという言語

言語自体は覚えればいいだけなのでそこまで苦労はしてない。
ただJavaScriptばっかやってるせいで、そもそものコンテキストスイッチが大変だった。

  • スネークケースとかディレクトリの構成とか
  • 関数型特有のコードで再帰とか状態をどこで持つかとか
  • パターンマッチ

特にパターンマッチはElixirのキモみたいな感じで、これをフルに活用する = コードの雰囲気が勝手に関数型っぽくなる感じかなーと。
あとは関数が名前・引数の組合せで区別できるやつ、すごい便利やん・・・!

そして行き着くErlang/OTP

ちょっとElixirを書いてみただけでもわかります。
まじめにやるならErlangできないとあかんやつやコレ、OTPも無視できひんやつやんコレー!

ちょっと前にDiscordがこんなブログ出してましたね。

How Discord Scaled Elixir to 5,000,000 Concurrent Users

具体的な数字もいっぱい書いてあって、Elixirすげーな!俺らも使うか!ってなりそう。
ただコレよくよく読むと、「素のElixirではパフォーマンスが冴えないやつもあるので、根っこのErlang/OTPまで降りていって検証し、1から書き直したライブラリ使ってこの境地に立った」記事なのよね・・。

あとはSupervisorでどういう感じに使って子プロセスをどんな感じにして・・とか、こういう実装にはOTPのアレを使ったほうがいいなとか、そういうコアなところを知ってないと、あくまでプログラミングやったことあります程度の人では使いこなせない言語なのだなぁという感想。

まあ逆にいえばNodeみたくアレもコレもnpmで調達しなくとも、だいたいコアなやつは用意されてて便利。まあこれも言語としての出自の問題か。

開発環境

ツールの充実度はNode(JavaScript)の方が勝ってるかなーという印象。
↓を見つけ出すまでずっと悶々としてた。

それでもMixはとてもよくできてると思った。ApplicationとかConfigとか。強いて言えば`npm-scripts`的な機能が欲しかった。

あと`@spec`とか`@moduledoc`とか、こういうのが言語機能に入ってるのはすごく理にかなってると思った。

やり残し

デプロイまわり。
https://github.com/bitwalker/distillery とか使ってパッケージするの試したかった。

わざわざDockerでUbuntuのイメージ作ってElixirの1.6を入れて・・っていうのが面倒で・・。
1.6が公式リリースされたらまた考える。

てかうちのVPSErlangのrebar3?かなんかがコンパイルできず、結局ローカルでしか試せてないっていう。

次にやる

あとはPhoenixも少し見ておきたいなーと。

  • とりあえずさわる
    • Channelsまわり
    • 付属のJS使わずにアクセスできないかとか

まあ結局のところ仕事で使わない = 趣味プロONLYとなると、今の自分のスキルセットから見ると別にNode.jsでいいかな・・という感じではある。
どっかにそういう仕事ないかなー。