Elixir と Reactive System に関する考察


# Reactive Manifesto の印象

正直 [Reactive Manifesto](http://www.reactivemanifesto.org/ja) を初めて読んだときは、Akka や Erlang についてよく知らなかったし「何か変わったことが書いてるか?」ぐらいの感じではあった。

しかしながら先日発表のあった [Typesafe Reactive Platformで作るReactive System](http://www.slideshare.net/yugolf/typesafe-reactiveplatformreactivesystem-scalasummitkansai) このスライドを見て、ようやく自分の中で具体例との対応付けができた。

## Reactive System ･･･ Scala の Akka と Erlang, Elixir

引用するが、スライドでは「Reactive System の価値」として Reactive Manifesto にある Elastic / Resilient / Message-driven / Responsive を以下のように位置づけ整理している。

![59ece94abfcc1bd45933f93a64f7a1cfc8e6af84.png](https://qiita-image-store.s3.amazonaws.com/0/1834/28822f52-7ef5-30c1-4e1a-e903d4231905.png "59ece94abfcc1bd45933f93a64f7a1cfc8e6af84.png")

そして Scala 界隈では、[Typesafe](http://www.typesafe.com/) 社が作った Typesafe スタックによって、この Reactive System を実現する。

![b6a4b29b267a8db6cb20ea5c2d8e7f1afe09bf2a.png](https://qiita-image-store.s3.amazonaws.com/0/1834/906011d4-878c-23d3-5550-02d0f0788600.png)

Reactive Manifesto そのものは、この実装の話と切り離されているから、それ単体で読んだときには特に新鮮味を感じられないのではないか。一方で、この Typesafe スタックの実装を見ていれば、明らかに既存のモデルやパラダイムで Elastic / Resilient ･･･ を達成しようとするのとは一線を画す体系がそこにはある。そこが今ままでわかっていなかった。

さて、これを読み進めていくとその Reactive System の価値を実現する要素として、Erlang/Elixir にとって既視感のある話がいろいろ出てくる。

- Play Framework ･･･ 非同期、WebSocket サポート、Rails のような･･･ ⇒ おや、Phoenix?
- Akka はアクターモデルによる並行/分散処理のためのミドルウェア ⇒ 軽量プロセスのこと?
- Supervision Model ⇒ OTP の Supervision Tree
- Let it Crash
- Actor を増減させ容易にスケール ⇒ プロセスをノードに分散できる

などなど。(なお Reactive Streams は対比が思いついてない)

まあ、Akka は Erlang/OTP にインスパイアされて開発されたものであるからして、その Erlang/OTP の上に構築された Elixir にとって既視感があるのは当然というのが種明かし。そこは [Akka vs Erlang](http://qiita.com/okumin/items/b0e85704268dfb4741b5) に詳しい。

# Elixir の最大の特長

それでElixir は「シンタックスが Ruby 風の関数型言語」という点がよく話題になるが、実際触ってみると最も特徴的だと感じるのはやはり Erlang/OTP から引き継いだ、軽量プロセス + メッセージパッシング (= アクターモデル) による並行/分散処理である。

「並行/分散」と書くと、大規模トラフィックとか大規模計算リソースとかそういうものばかりを想像してしまうが、実際には軽量プロセスはずっとカジュアルに、例えば関数型言語の Elixir において Mutable な状態を保持するために利用したり、耐障害性を確保するために利用したりもする。

その辺りは以下にも書いた。

- [Elixir の OTP (GenServer 編)](http://qiita.com/naoya@github/items/ae17a8166e52fc463012)
- [Elixir のプロセスを使ってフェイルセーフなアプリケーションを作る ─ 失敗は恐れず泥水にダイブ](http://qiita.com/naoya@github/items/ad18b49e9ed56a72cab6)

すなわち、Elixir でアプリケーションを構築するにあたっての根本/基礎的なところを、この軽量プロセスによるプログラミングモデルが支えている。(そして、Elixir が関数型言語であるというまた別の言語的側面は、Shared Nothing を前提とするアクターモデルと相性良い。) これがなければ Erlang や Elixir という言語にはあまり価値がないし、これをしたいがために使うのが Erlang や Elixir だ･･･と言い切っても良いだろう。

"Let it Crash" や Supervision Tree などの考え方/パターンもこの軽量プロセスを手段として、その特長を最大限活かすための手法だと考えられる。

そして先に見たとおり、Reactive System を Scala 的な視座でみればそれは Akka を含む Typesafe スタックであり、一方、Erlang, Elixir からみるとそれは軽量プロセスを中心とするモデル/パターンなのだ! とようやく分かった･･･というのが冒頭の話。

## 従来の言語との差異

Elixir や Scala のこの辺の言語 (というかプラットフォームというか) の特徴は、Web 開発で普段触れている言語 ･･･ Perl/Ruby/PHP/Python や JavaScript そのほかとは大きく異なる。またそこから得られる耐障害性能や並行処理の記述のしやすさといった利点は、直感的に、これからますますスケーラビリティが要求される Web システム開発において大いに役立つものだと想像がつく。

そんなところから、Elixir は明らかに触ったときの感触がそれらの言語と違う。しかし、その感触の違いの区切りになるものが一体何なのか漠然としていて簡単には説明できないでいたのだが、Reactive Manifesto、Reactive System がまさにそれだった、というわけ。

つまり Elixir という言語、プラットフォームを Reactive System の文脈で見れば、より高い抽象度でそれを捉え直すことができるのであった。(まあこれも Reactive Manifesto は Erlang/OTP をインスパイアした Akka 陣営が書いたこともあって当然ではあるのだけども。)

# Elixir はアクター・リアクティブな言語

さて、改めて omo 氏の名文である [Reactive Porn](http://steps.dodgson.org/b/2014/12/07/reactive-porn/) を読むと、ここで言ってる話は「アクター・リアクティブ」と呼ばれるリアクティブ性の一つの方向性でしかなく、「フューチャー・リアクティブ」(Future) や「ファンクショナル・リアクティブ」(FRP や Rx etc.) などなどその他のパラダイムによって相対化されてしまうのではあるのだが。

そんなわけで、Elixir は既存の言語に比較してどんな言語かという問いには「アクター・リアクティブな(モダンな) 言語だ」と回答することができる。

先のスライドを起点にしてその知見を得た、というお話でした。

えー、"Reactive System" に関する考察と良いながら、やや Reactiveness に関する考察にのみ留まってしまったところはお許しください。

おしまい。