「Elixir導入提案」
Erlang歴10年、現在は株式会社gumiのCTOである幾田雅仁さんによる「Elixir導入提案」という発表です。
Elixirは最近のWeb開発で求められる並行性、メンテナンス性、耐障害性に強い性質を持つ一方、求人数が既存の言語に比べて桁が1つ、2つくらい少ないのでまだ現場に導入している企業は少ないだろうとのことでした。
そんな中でもgumiではElixirを導入していくそうです。なぜでしょうか。幾田さんは以前クレジット決済サービス会社にお勤めで、クレジット決済サービスの価値はSLAというものにあるそうでした。SLAとはService Level Agreementの略で、こでは異常なく処理ができる時間のことを指しています。それが99.9982%、つまり年間のサービス停止時間が9分30秒以下というものを売りにしていたとのことです。2007年のある日Erlangを発見しSLAが99.9999999%(nine nines 9が9個)を実現できると書かれているのを読み興奮したそうです。9が8個99.999999%でも年間のサービス停止時間が300msとなるのでほぼ止まらないと言えますね。このErlangを導入するため、幾田さんはErlangの勉強と、Erlangの導入を決定できる権限を得るための出世を両立させ、2011年にそのチャンスを得ました。
そこで社内プレゼンを行い、現在のシステムよりSLAが高く、性能がよいシステムを開発すると約束し、Erlangでの開発の合意を取りつけたのですが、その際に、ビジネスロジックを既存の社員が慣れた言語で変更を加えられるように「更新頻度が高い場所はなるべくPerlを使うこと」という要件を加えられたそうです。その要件も取り込みながらシステムは完成し、うまく動作したのですが、言語間をつなぐために導入したブリッジ部分が災いしてメンテナンス性は低かったそうです。そこでビジネスロジックをErlangで書き、一つの言語でシステムを完成させるべく、Erlangを書ける人を増やすことにも挑戦したのですが、教育が難しく、書ける人は増えなかったそうでした。
幾田さんがgumiに入社されて、2013年にネイティブアプリ化がはじまったため、プラットフォームが行ってくれていた認証、課金、テキスト検証の処理を自分達で用意しなければいけませんでした。そこでErlang製の共通基盤を用意し数台のサーバーで十分運用できていたそうでした。ただし以前と同じようにErlangを読み書きできる人は自然にはあらわれなかったので、なんとか無理矢理引き継いだそうです。
ここまでのことをまとめると、ErlangVMは最近のWeb開発に求められる性質を有しているため、認証や課金などのビジネスロジックが介在しにくい基盤部分へ導入すると成功する。ただし、Erlangという言語はネットワークのミドルウェアの記述が行いやすいような記述に特徴を持ち、逆に言うとその他の言語を使っている開発者にとっては馴染みにくいシンタックスになっている。そのためビジネスロジックの介在するような部分では導入しにくかった。Elixirは比較的既存の言語に似たシンタックスを持ち、ErlangVMを利用しているので、基盤部分、アプリケーション部分のどちらでも利用できるということになります。
以上をふまえて、gumiでは、現在のWebアプリケーション開発に利用しているPythonと、共通基盤に利用しているErlangから、今後はElixirを用いた開発へと一本化を進めるとのことでした。
「ElixirはリアルタイムWebに強いというのは本当か?」
元株式会社アカツキ相談役、現Treasure Dataの伊藤友気さんによる「ElixirはリアルタイムWebに強いというのは本当か?」という発表です。
そもそもタイトルにある「リアルタイムウェブ」とは何でしょうか。wikipediaには、
リアルタイム・ウェブ(Real-time web)は、インターネット上のユーザーの書き込みや動向を、即時かつ大規模に他のユーザーと共有する仕組みの総称。
と書いてありますが、これだけでは抽象度が高く、はっきりしません。
そこで伊藤さんはより具体的な例を知るため、リアルタイムウェブという言葉が使われはじめた時期は、Node.jsやSocket.IOが使われはじめたころであったと振り返っていました。これらは、
- ロングポーリング
- SSE(Server Sent Events)
- WebSocket
などの技術を利用し、従来のHTTP通信では達成が難しかった、サーバー側での変更をできるだけ速くクライアントへと伝えたいという要望を解決するものであったといいます。
しかし、これらの技術を利用してリアルタイムウェブを行った場合、従来の通信では起きにくかった問題が発生しました。サーバーとクライアント間を結ぶ大量の接続の維持や、接続状態の保持などです。リアルタイムウェブのための技術をElixirで実装すると、上記の問題は解消できるのでしょうか? 結論としてはElixirが利用しているErlangVMの軽量プロセスが持つ以下の性質のおかげで、これらの問題は解消できるそうです。
- N:Mスレッドモデルである
- 軽量プロセスを作ってもメモリをほとんど消費しない
- 軽量プロセス同士はメッセージパッシングでデータをやりとりする
- 軽量プロセス毎にGCが行われる
- プリエンプティブなスケジューリングにより実行される
さて、Elixirを使うだけで、リアルタイムウェブに関する問題がすべて片づくのでしょうか? そうではなく、軽量プロセスの繋がりを上手く設計しなければいけない、しかしPhoenixの場合はあらかじめChannelというリアルタイムウェブを扱う機能が準備されておりこの機能を使うと軽量プロセスの繋がりが上手く設計された状態でアプリケーションを構築できると述べられていました。
結論として、ElixirはリアルタイムWebに強いというのは概ね正しく、特にPhoenixのChannelはその性質をうまく利用しているため、そのフレームワークに乗るとよいとのことでした。
