More Related Content
PPTX
PPTX
PPTX
PPTX
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介 PPTX
PPTX
running web app on elixir PPTX
PDF
Viewers also liked
PDF
PDF
PPTX
PDF
PDF
PPTX
PDF
PPTX
Zabbix: Beyond Thunderdome PPTX
TravisCIでErlang/OTP (最小構成版) KEY
Getting Rest With Webmachine PDF
PPTX
PDF
PDF
PDF
Dslからのコードジェネレーションで楽々play開発 PDF
PDF
Regular expressions à la carte PDF
PPTX
Ruby メタプログラミングによるXMLテンプレートエンジンの実装と評価 PPTX
Similar to 地獄のElixir(目黒スタートアップ勉強会)
PDF
PDF
PPTX
Elixir-Conf-Japan-2017-session-ohr486 PPTX
PPTX
PPTX
ElixirをIoTボードで動かしてみた ~ラズパイ・big.LITTLE・Zynq編~ PPTX
PPTX
やや関数型を意識した風Elixir/Phoenixご紹介 PPTX
ElixirでIoT!?ナウでヤングでcoolなNervesフレームワーク PPTX
Rubyのenum系高階関数を elixirでも使いたい KEY
PPTX
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」 PPTX
PPTX
running-elixir-in-production PPTX
PDF
Elixir とか組込みとか (On Elixir and embedded systems) PPTX
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」 PDF
More from Tsunenori Oohara
PPTX
PPTX
PPTX
PDF
PPTX
PPTX
PPTX
PPTX
PDF
地獄のElixir(目黒スタートアップ勉強会)
- 1.
- 2.
- 3.
- 4.
- 5.
Erlangの紹介
• 平行処理指向のプログラミング言語
• 分散化された環境
•障害耐性(フォルトトレラント)
• (ある程度の)リアルタイム性
• 無停止稼動(ホットスワップ)
• ActorModel(Shared Nothing Artchitecture)
• OTP(Open Telecom Platform)
• 超軽量プロセス/メッセージング
• GCはプロセスレベルで実行
• Prologチックなsyntax
• Immutableな変数
• 単一代入変数(1回しか値を代入できない)
• パターンマッチを多用(メッセージパッシングでは特に)
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
OTP
• Open TelecomPlatform
• アプリケーション作成に役立つ標準モジュール・ライブラリ・原則集
• Erlangの基本機能(Link/Monitor/Timeout/Exit/etc)を使って並行アプリ
ケーションを書く際のパターン
• 代表的なビヘイビア(パターン)
– プロセス同士の共通パターン/振る舞いを形式化したもの
– gen_serverビヘイビア : クライアント/サーバー
– gen_fsmビヘイビア : 有限ステートマシン
– gen_eventビヘイビア : イベントハンドリング
– supervisorビヘイビア : supervisor-workerのプロセス監視ツリー
– applicationビヘイビア : 複数モジュールからなるアドホックなアプリケーション
– Etc
• OTPを使う為にErlangを使う
- 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.
- 15.
- 16.
- 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.
環境構築
• 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.
弊社広告事業部の事例
• 動画広告ネットワークサービスで採用
• APIサーバーをElixirで実装
–大量のリクエストをさばけるAPIサーバーが欲しかった
– http://qiita.com/ohr486/items/a6bf071f1fe26f5108ab
• (管理、広告掲載サイトはRails)
• APIサーバーからRDBへのアクセスは無し、全て Redis(Dynamo) から取得
• 非同期処理はSidekiqを利用
– Elixirから、RailsのSidekiqへenqueue
– Sidekiq互換(SidekiqのElixir実装)のexqを利用
- 20.
- 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.
- 23.
- 24.
- 25.
ハマった所
• デプロイ
– minaを採用
–ベストプラクティスがまだ無い、Phoenix周りの情報が参考になりそう
• 監視系
– Erlang/Elixir標準のロガーは今ひとつ使い辛い
• モジュール使うならlagerだけど、too muchだった
• Plugのmiddlewareに埋め込む
– Newrelic使いたい(のでなんとかしている所)
• Newrelicのnative(C++)SDKをerlangの組み込みモジュールとして実装
• Elixirから呼び出し
– Nginxをかましてreq/res監視する
• ホットコードスワップ(無停止更新)
– 苦労の割に報われない感があった
• デプロイで工夫するようにした
- 26.
- 27.
- 28.
- 29.
- 30.
Editor's Notes
- #10 プロセスの他言語との比較
Golang: メモリ:8k byte、上限:数十万、管理:しない
Erlang: メモリ:300word=240 byte、管理:treeを作る
Scala: メモリ:数百byte、スレッド256〜
プロセス間でメモリは強要しないSharedNothingArchitecture(golangは仕組みあり)
- #12 Erlangのメールボックスは、FirstInFirstOut
Scalaはこのキューを制御可能(うらやましい)