Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

地獄のElixir(目黒スタートアップ勉強会)

11,183 views

Published on

Elixirの紹介

Published in: Engineering
  • Be the first to comment

地獄のElixir(目黒スタートアップ勉強会)

  1. 1. Drecom @ohrdev 地獄の Elixir入門
  2. 2. 自己紹介 • 自分 大原常徳(エロスマ) @ohrdev ドリコム広告事業部 入社4年目 • 仕事 動画広告周りのシステムの開発/メンテ • 生活・趣味 – お寺巡り、写経、仏像彫り – 丸太・流木探し(仏像用) – 週末は光の戦士(白魔導士Lv.50) – ダイエット – エロい広告バナー画像収集 • エロいカリスマ -> エロスマ
  3. 3. 今日のお話(3行で) Elixirっていう Erlangの上で動く 言語の紹介するよ
  4. 4. Agenda • 言語の紹介 – Erlang/Elixirの紹介 – エコシステムについて – 環境構築 • 弊社広告事業部での使われ方 – 利用モジュール – サービスの構成 • 所感 – 良い/悪い所 – ハマった所 • まとめ
  5. 5. Erlangの紹介 • 平行処理指向のプログラミング言語 • 分散化された環境 • 障害耐性(フォルトトレラント) • (ある程度の)リアルタイム性 • 無停止稼動(ホットスワップ) • ActorModel(Shared Nothing Artchitecture) • OTP(Open Telecom Platform) • 超軽量プロセス/メッセージング • GCはプロセスレベルで実行 • Prologチックなsyntax • Immutableな変数 • 単一代入変数(1回しか値を代入できない) • パターンマッチを多用(メッセージパッシングでは特に)
  6. 6. Erlangの紹介-ざっくり ネットワークサーバーのDSL(と考えるとしっくり) OTPを使わなければ使う意味がなさそう 無停止更新は大変、面倒くさい エコシステムはそれなりに整っている 関数型脳というよりアクターモデル脳 1回しか変数に値を代入できない 制御構造はパターンマッチ・再帰・ガードで表現
  7. 7. Erlang分散アーキ(VM) スケジューラー ---------- ---------- ---------- CPU数のスレッド VM 実行キュー (プロセス) VMがいい感じにマイ グレーションする(最 適化) Ex) キュー数が多いス レッドから少ないス レッドへ、キューを移 動
  8. 8. Erlang分散アーキ(m-process)
  9. 9. Erlang分散アーキ(cluster、s/w) OS VM BEAM-files BEAM-filesBEAM-filesBEAM-files s s s s w w s w w w w w s s www OSOS OS VM VM VM Supervisor Workerを監視 Worker 処理を実行 - 再起動戦略 - 再起動頻度 - 子プロセスの 起動方法 プロセス メモリ:300word〜 起動:micro sec単位 上限:2.6億程度
  10. 10. プロセスTree
  11. 11. プロセス ---------- ---------- ---------- ---------- (FIFO) プロセス1 プロセス2 メールボックス メッセージ PID2 ! msg. my_m:my_f( Arg1,… ) の処理内容 receive PID2 = spawn(my_m, my_f, [Arg1,…]). spawn -modle(my_mod). my_f(Arg1,Arg2,…) -> receive msg -> do_something end. プロセス0
  12. 12. OTP • Open Telecom Platform • アプリケーション作成に役立つ標準モジュール・ライブラリ・原則集 • Erlangの基本機能(Link/Monitor/Timeout/Exit/etc)を使って並行アプリ ケーションを書く際のパターン • 代表的なビヘイビア(パターン) – プロセス同士の共通パターン/振る舞いを形式化したもの – gen_serverビヘイビア : クライアント/サーバー – gen_fsmビヘイビア : 有限ステートマシン – gen_eventビヘイビア : イベントハンドリング – supervisorビヘイビア : supervisor-workerのプロセス監視ツリー – applicationビヘイビア : 複数モジュールからなるアドホックなアプリケーション – Etc • OTPを使う為にErlangを使う
  13. 13. Elixirの紹介 • Jose Valim(RailsCoreTeam/devise/etc) によって開発 • Erlangの仮想環境(BEAM)上で動作する汎用script言語 • Erlangの関数をシームレスにcallできる • ErlangのASTを操作できる(LISPのマクロ)、メタプログラミング • Protocolによるポリモーフィズム(Clojureのdefprotocol) • 言語レベル(FirstClassDocument)でドキュメントをサポート • ErlangのActorModel(Shared Nothing Artchitecture) • パターンマッチ • OTP(Open Telecom Platform)をbundle • Rubyチックなsyntax
  14. 14. Elixirの紹介-ざっくり ErlangをRubyチックにかける! 変数への値の代入は何回でもできる Lispのマクロ(ASTを直接操作)使える Erlang<->Elixirのオーバーヘッド(ほぼ)なし (天真爛漫にErlangのmoduleをcallできる) モダン
  15. 15. Erlangのコンパイル ソースコード xxx.erl 文字列 Token AST erl_scan erl_parse 実行ファイル xxx.beam compile VMにload &実行 erl_eval
  16. 16. Elixirのコンパイル ソースコード xxx.ex Elixir AST Erlang AST 実行ファイル xxx.beam compile VMにload &実行 erl_eval ASTレベルで変換 オーバー ヘッドなし ElixirのOTPアプリ ケーションで実現 シームレスにerlang のコードをcallできる
  17. 17. エコシステム • ライブラリのhosting、配布フォーマット – Ruby -> rubygems ( https://rubygems.org ) – Elixir/Erlang -> hex ( https://hex.pm ) • 統合Buildツール – Ruby -> rake – Elixir -> mix – Erlang -> rebar (http://qiita.com/ohr486/items/b33cfcf0978ec51afc63 ) • WebAppFW – Ruby -> Rails – Elixir -> Phoenix (https://github.com/phoenixframework/phoenix )
  18. 18. 環境構築 • Erlangの環境が必要 – Erlangのバージョン管理ツール : kerl – http://qiita.com/ohr486/items/3a5229bcdf9c4d5fbfe6 • Mac – brew install erlang; brew install elixir • Win – スイマセンやった事無いです・・・ • *nix – Ansibleのrole作りました • https://galaxy.ansible.com/list#/roles/2930 • https://github.com/ohr486/ansible-elixir
  19. 19. 弊社広告事業部の事例 • 動画広告ネットワークサービスで採用 • APIサーバーをElixirで実装 – 大量のリクエストをさばけるAPIサーバーが欲しかった – http://qiita.com/ohr486/items/a6bf071f1fe26f5108ab • (管理、広告掲載サイトはRails) • APIサーバーからRDBへのアクセスは無し、全て Redis(Dynamo) から取得 • 非同期処理はSidekiqを利用 – Elixirから、RailsのSidekiqへenqueue – Sidekiq互換(SidekiqのElixir実装)のexqを利用
  20. 20. 適用箇所 API server Elixir App 管理系 system(RoR) redi s Job Server (Sidekiq) redi s MySQL enqueue nginx LB GoogleBigQuery
  21. 21. 利用モジュール • Web(http):cowboy (erlangのデファクトモジュール) • WSGI(相当のもの):plug (rubyのrack) • API DSL:maru (grapeのelixir実装) • Json:poison • SentryClient:raven-elixir • Job:exq (sidekiqのelixir実装) • AwsLib:erlclud (ErlangLib) • Coverage:coverex • Dotenv:dotenv • RedisDriver:exredis • ReleaseManager:exrm • PackageManager:hex • etc
  22. 22. 所感 • Erlang周りのエコシステムをある程度把握しておくと捗る • OTPありきで考えた方が良い • アクターモデル脳大事 • 腹をくくって英語のドキュメントを読む
  23. 23. 良い所 • Erlangの資産を利用できる • Erlangのエコシステムに乗っかれる • OTPがクソ便利、ElixirバンドルのOTPも大体が揃っている – 揃ってなければErlangのモジュールとしてcallすれば良い • メタプログラミングできる – Phoenix(RailsインスパイアされたWAF)のコードがかなり参考になる
  24. 24. 悪い所 • (日本語の)ドキュメントが弱い、コミュニティが少ない • 採用事例が少ない(ので採用ハードルが高い、上司説得工数が高い) • Ruby程ライブラリ数が多く無い(粒は揃ってる) • Erlang周りの情報もアンテナをはる必要がある(Erlang実装に影響される) • 足回りが整備されきっていない(deploy/log/update/monitor/etc) • チューニングするにはErlangの知識が必要
  25. 25. ハマった所 • デプロイ – minaを採用 – ベストプラクティスがまだ無い、Phoenix周りの情報が参考になりそう • 監視系 – Erlang/Elixir標準のロガーは今ひとつ使い辛い • モジュール使うならlagerだけど、too muchだった • Plugのmiddlewareに埋め込む – Newrelic使いたい(のでなんとかしている所) • Newrelicのnative(C++)SDKをerlangの組み込みモジュールとして実装 • Elixirから呼び出し – Nginxをかましてreq/res監視する • ホットコードスワップ(無停止更新) – 苦労の割に報われない感があった • デプロイで工夫するようにした
  26. 26. まとめ • 弊社広告事業部ではElixirを広告配信APIサーバーで採用しています • 言語もですが、バンドルされているOTPが強力です – ネットワークサーバーを書く為のDSLと考えるとしっくりきます • まだ採用事例は多くありませんが、今後トレンドになるのでは • マルチプロセッサマシンに相性が良い、スケールがし易い • アクターモデルのパラダイムで考える必要がある – 何も考えずに作ると性能が出ないので注意
  27. 27. 最後に
  28. 28. 落ち込んだり (地獄)するけど
  29. 29. 私達元気 (天国)です
  30. 30. ドリコム広告事業部はアドテク好きなエ ンジニアを募集しています。 http://www.drecom.co.jp/recruit/ [PR]

×