何これ?
皆さん、おはこんばんちは。
4月になりましたね。
新しく何かを始めるには良い季節です。
ということで、やろうやろうと思っていたであろうElixir/Phoenix、そろそろ始めまちゃいましょう。
という記事になります、ご確認下さい。
息を吸うようにDockerで入門しちゃいましょう
楽です。そして、速い。
四の五の言わずにまずはdocker run。
やり方はDockerのイメージプロジェクト作ったんで、そのreadme見てください。
先程DockerHubにも登録したので、上記のRequirementにあるboot2dockerが起動している人は下記を実行するとPhoenixまで立ち上がります(まだインストールしてない人は、Requirementの通りにインストールしましょう)
docker run -d -p 80:4000 --name phoenix -t xtity/docker-centos7-elixir-phoenix
で、boot2docker ip
を叩いて出たIPにアクセスすると下記の画面が出るはずです。
ね、簡単でしょ。
内容物(Dockerfile)
- CentOS 7系
- en_US.UTF-8
- 日本語も指定可
- コメントアウト
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
- アンコメント
#ENV LANG ja_JP.UTF-8
#ENV LANGUAGE ja_JP:ja
#ENV LC_ALL ja_JP.UTF-8
- コメントアウト
- 日本語も指定可
- en_US.UTF-8
- Erlang/OTP 17系
- elixir 1.0.3
- 下記の値で変更可
ENV ELIXIR_VERSION 1.0.3
- 下記の値で変更可
- Phoenix 最新
- プロジェクト名:sample
- 下記の値で変更可
ENV PHOENIX_APP_NAME sample
- 下記の値で変更可
- ポート:4000
- 下記の値で変更可
ENV PHOENIX_APP_PORT 4000
-
docker run -p
のポートも忘れずに変更
- 下記の値で変更可
- MIX_ENV:prod
- devも指定可
- コメントアウト
RUN yes | mix local.hex && yes | mix local.rebar && mix do deps.get && MIX_ENV=prod mix compile.protocols
CMD ["/bin/bash", "-c", "MIX_ENV=prod PORT=${PHOENIX_APP_PORT} elixir -pa _build/prod/consolidated -S mix phoenix.server"]
- アンコメント
- #RUN yes | mix local.hex && yes | mix local.rebar && mix do deps.get, compile
- #CMD ["/bin/bash", "-c", "mix phoenix.server"]
- コメントアウト
- devも指定可
- プロジェクト名:sample
せっかくなんでベンチもとってみようず
この本読んで書いてあっただけなんですが、wrkでベンチでも取ってみましょう。
wrk -c15 -t15 -d60s http://(boot2docker ipで出たIP)/
とりま、15スレで1分。
手元の10万後半MBPだとこんなん出ました。
ちな、Elixir Cookbookそこそこオススメです。Mac版Kindleで検索して使ったりすると捗ります。
Running 1m test @ http://192.168.59.103/
15 threads and 15 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 13.08ms 10.04ms 96.39ms 77.90%
Req/Sec 87.84 32.20 333.00 69.75%
78536 requests in 1.00m, 158.41MB read
Requests/sec: 1308.79
Transfer/sec: 2.64MB
手元のコンテナに立ってるヤツなのに、秒間1300以上捌けてますね。
Elixir/Phoenix、恐ろしい子...
因みに一杯ログ出ちゃいますが、docker logs phoenix
すると楽しいです。
数百μsで返ってきてたりするのが見れたりします。
ようこそ、マイクロ秒の世界へ
その後の入門
上記の公式を見ろ、以上!だと流石にマッチョ過ぎるので、下記のような日本語のドキュメントも見ながら、docker exec -it phoenix bash
した後色々ソースを弄ってはコンパイル、弄ってはコンパイルとかがわりと速習な気がしたり、しなかったり。
- Elixir
- Phoenix
勿論Dockerでiexもインスコ済みなので、コンテナの中で大抵の事は出来るでしょう。
次回予告
入門した後必要なのは、そうdeploy
と、CI
ですね?(多分
deploy方法は、mix release
を使います。
この前投げた拙プルリクも無事マージされたようなので、
今なら最新のphoenixをcloneしてくれば、mix release
でビルドできるはずですb
CIは、せっかくDockerで入門したのだから(?)、drone.ioでやってみようかなとぼんやり思ってます。
終わりに
Elixir、Phoenix熱いですね。
こんなつぶやきもあるくらいです。
読んだ。何故Ruby on Rails, Scala on Playから離れるのか。それは時間という価値あるもののためだし、コミュニティの毎日のハードワークの有無のためだと。Web開発における次の10年のパラダイムか。熱いわ QT https://t.co/4KHEa0j951
— kousuke_sima (@kousuke_sima) 2015, 3月 1
誰なんでしょうか、熱いですね。
Elixirは最近v1.0.3が出て、Phoenixもv0.10.0が出ました。
Elixirの中の人もPhoenixに並々ならぬ情熱を抱いているみたいです。
プルリク出したら速攻返事きますよ、わりと(体験談)。
なんで、今は結構丁度いい入門時期かなと思ったりします。
それでは皆さん、是非是非良いElixir/Phoenixライフをノシ
追記
結構反響が大きかったようで、速攻レスがあったような気配をキャッチしました。
なによりです。
以下にコンテナ上のPhoenixではなく、MBP上で直に動かしたPhoenixのベンチも参考としてのせておきますノシ
Running 1m test @ http://localhost:4000
15 threads and 15 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 5.88ms 3.56ms 32.26ms 63.70%
Req/Sec 210.03 90.81 578.00 61.01%
184000 requests in 1.00m, 371.12MB read
Requests/sec: 3066.63
Transfer/sec: 6.19MB
上記のCookbookに載ってる同様のベンチが秒3700くらいなんで、まあこんなもんでしょう。流石にVM上で動かすとこの数字は無理ゲーです。
参考にして下さいませー。
追記 その2
去年作ったRailsのDockerfileがこいつのせいで動かなくなってたのを直したついでに、Ruby on RailsをDocker上で走らせた時のベンチも取りました。
せっかくなんでその結果も載せておきます。
因みに、そのRailsの環境は下記のDockerfileで構築したものです。
環境変数等の設定は下記の通りです。
-
net.core.somaxconn
:1024 -
RAILS_ENV
:production - Topのアクセスで、
rails generate controller welcome index
で追加したページを返すようにroutes.rb
を設定
以下、ベンチ結果。
Running 1m test @ http://192.168.59.103/
15 threads and 15 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 86.21ms 16.54ms 285.79ms 79.97%
Req/Sec 11.40 2.56 18.00 73.61%
10644 requests in 1.00m, 13.37MB read
Requests/sec: 177.34
Transfer/sec: 228.08KB
同じDocker上でElixir on Phoenixが秒1308.79だったので、Ruby on Railsと比べて、__約7.4倍__のスループットが出てるのが分かりますね。なかなかやってくれますb