全2265文字
PR

 関数型言語であるElixirは、登場時期は2012年とプログラミング言語のなかでは比較的新しい部類に入る。1980年代に登場した関数型言語Erlangの仮想マシン(Erlang VM)上で動作し、大量の並行処理を安定的に実行できる特徴を備える。またElixirはRubyの影響を受けているため、記法がシンプルというメリットもある。

 Elixirはこうした特徴から、コンテンツ配信やSNSなどのWebアプリケーション開発で利用される事例が増えている。ここでは飲食店の予約管理システムや決済システムを手掛けるITベンチャーであるTableCheck(テーブルチェック)の事例からElixirの使いどころを見ていこう。

大量のリクエストを並行処理できる

 関数型言語とは、数学的な関数定義の集合としてプログラムを記述し、関数の適用(呼び出し)によってそれらを組み合わせて処理を実現するプログラミング言語である。Elixirで開発を進めるTableCheckのMatthew Pinkston(マシュー・ピンクストン)Principal Developerは「Elixirを使った開発は初めてだったが、調べれば調べるほど並行処理に向いていることが分かった」と話す。並行処理とは例えば、時間のかかる処理を待っている間に他の処理にCPUリソースを割り当てて実行することである。一方、大量の処理をCPUの複数コアに割り当てて並列に処理することは並列処理と呼ぶ。

 Elixirでは全ての処理がErlang VMのプロセスという単位で動く。Erlang VMはマスタープロセスを根とするプロセスツリーを構成し、子プロセスが実際の処理を実行する。子プロセスはスーパーバイザーによって監視され、障害が発生すれば再起動する。

Elixirプログラムの実行イメージ
Elixirプログラムの実行イメージ
[画像のクリックで拡大表示]

 Erlang VMのプロセスはOSが提供するプロセスと似た仕組みを備えている。例えば独立したCPUとメモリー空間を利用できる点だ。その一方でErlang VMのプロセスは、OSが提供するプロセスと比べて軽量だ。Elixirの公式サイトによれば、同時に数万~数十万のプロセスを同時に実行することも珍しくないという。そのためErlang VMを使うElixirは、多数の軽量データを処理するのに適している。

 処理に際してはErlang VMが各プロセスにCPUリソースを割り当て、一定量の処理を実行すると別プロセスに処理が移る。プロセスが利用するメモリー空間もプロセスごとに用意されるため、あるプロセスで障害が発生しても他のプロセスに影響が及びにくい。

 またプロセスごとにガベージコレクション(GC)が実行される。プロセスを終了するとメモリーを解放するのでシステム全体でメモリリークが発生しにくい。システム全体が落ちるような障害を回避しやすいと言える。