Recommended
running web app on elixir
iQONの開発手法 at iQONエンジニアセミナー
20170510 タウンwi fixlifull_スマホアプリ開発の実例 (1)
Behind-the-Scenes and Goals of LINE Summer Internship Program
Scotty + Aeson + Persistentで作るJSON Web API
[jaws days 2014]ELB/AutoScaling
COOKPAD tab 勉強会 2014.04.24
自作アプリを Apple Watch対応した話 〜FastCheckin編〜
iOSエンジニア in ハードウェア・プロジェクト
マルチデバイス時代だからこそ a-blog cms 2.0
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemyORM2017.key
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
SORACOM Conference Discovery 2017 ナイトイベント | Discovery ラップアップ
Deep learning reading club @ nimiri for SWEST
AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
More Related Content
running web app on elixir
iQONの開発手法 at iQONエンジニアセミナー
20170510 タウンwi fixlifull_スマホアプリ開発の実例 (1)
Behind-the-Scenes and Goals of LINE Summer Internship Program
What's hot (13)
Scotty + Aeson + Persistentで作るJSON Web API
[jaws days 2014]ELB/AutoScaling
COOKPAD tab 勉強会 2014.04.24
自作アプリを Apple Watch対応した話 〜FastCheckin編〜
iOSエンジニア in ハードウェア・プロジェクト
マルチデバイス時代だからこそ a-blog cms 2.0
Similar to running-elixir-in-production (20) PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemyORM2017.key
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
SORACOM Conference Discovery 2017 ナイトイベント | Discovery ラップアップ
Deep learning reading club @ nimiri for SWEST
AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
ElixirをIoTボードで動かしてみた ~ラズパイ・big.LITTLE・Zynq編~
関数型言語ElixirのIoTシステム開発への展開
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
More from Tsunenori Oohara (18)
Elixir-Conf-Japan-2017-session-ohr486
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介
running-elixir-in-production1. Running Elixir in Production
2016-09-03 RubySapporo.beam
おおはら つねの
Ooharabeamlang.tokyo
Elixi
r
Productio
n
使
う
正気
? 癖チョッ
ト
筋
良
い
通っ
た言語
いやい
や
5. 自己紹介
• おーはら@ohrdev
• 札幌(学生,SIer:10年) => 東京(web系:5年)
• RubySapporoNightがきっかけでRubyに◯◯◯
– 大通り近くのAppleStoreで島田さんが定期開催
• ボブおじさん、パターン、etc の紹介LTに刺激
– SapporoRubyKaigiは皆勤(多分)
• 東京でElixir関係のmeetup・イベントを主催/運営
– ElixirMeetup,tokyo.ex,phoenixハンズオン,VR.tokyo
6. • Rubyの会社のサーバーサイドエンジニア
• 普段使っている技術
– Elixir/Erlang/Ruby/Lisp/AWS/etc
• Elixirの運用アプリ: 本番x2、開発・検証x1
– Elixirアプリ: 運用1年半, elixir1.0 -> elixir1.3.1
– Phoenixアプリ: 運用1年, phoenix0.14 -> phoenix1.2
9. 開発環境
• vim/atom (IDEを使ってるメンバーは居ない
– 特に理由はない、公式的にはemacs推奨(らしい)
– plugin: vim-elixir
• バージョン管理
– 開発: kerl + exenv
※elixirのバージョンはerlangのバージョンに依存
– 本番: ansible + AMI
• CI
– Jenkins + mix test
11. 開発
• 単体テスト
– モックライブラリ
• meck : https://github.com/eproxus/meck
• mock : https://github.com/jjh42/mock
– モックライブラリに癖があるので、きちんとテスト
設計しないとメンテ不可能になる場合も・・・
• TDD
– Ruby + Guard + mix test
– phoenix_live_reload
12. 開発:tips
• mockライブラリ
– :meck (erlang)
• 癖がある
• Test毎に定義したモックをunloadする必要がある
– unloadしないとモック内容が別のtestでも有効になる
• 定義していないモックをunloadするとnot_mocked error
– 特定のTestでのみsetupでまとめてunloadできない
– Mock (elixir)
• meckの面倒な処理をまとめて行うマクロ
• 細かいところには手は届いていない
15. (負荷)テスト:tips
• empd: Erlang Port Mapper Daemon
– 分散Erlang環境におけるノードの名前解決を行う
– 使用ポートはデフォルトで4369
• ノード間の通信ポート
– inet_dist_listen_min, inet_dist_listen_max で指定
可能、VMのパラメータとして起動時に渡す
17. (負荷)テスト:tips
Remote Server Local Server
epmd epmd
EralngVM
name:remote
EralngVM
name:monitor
sshdsshd
Port 4369Port 4369
Port 9001 Port 9001〜5
Port 22
ssh –N –L
9001:localhost:9001 –L
4369:localhost:4369
root@remotehost
erl -name monitor@127.0.0.1 -setcookie my-cookie -run observer
iex --name remote@127.0.0.1 --cookie my-cookie
--erl “-kernel inet_dist_listen_min 9001 inet_dist_listen_max 9001” –S mix
18. 運用初期〜
• リリース時:5000DAU -> 現在:60万DAU
• トラフィックが増えた時にトラブルは起こる
– DBのコネクション数増加
– ログのローテーション
– ログ出力に伴うI/O負荷
– (phoenixアプリの)データ転送量が増大
19. 運用初期:tips(redis)
• DBコネクションの増加
– Ecto : コネクション管理機能がバンドル
• https://github.com/devinus/poolboy
– Redis: コネクション管理機能を含まない場合あり
• https://github.com/artemeff/exredis
• 意識せずに書くと、1Req=1Process=1Connectionに
20. 運用初期:tips(redis)
Our App
front
P P
RedisP P
P P
P P
Request Handling process Redis Client
Handling process毎に
Redis Client(コネクショ
ン)を作ると・・・
リクエストの数だけ
Redisへのコネクション
ができてしまう
Timeoutで接続が切
れるまでコネクション
が残るので
too many connection error!
27. 運用中後期
• 日々のチェック
– エラー検知
• sentryでエラーを通知
• Clientはravenを使用
– https://hex.pm/packages/raven
– サーバーメトリクス
• AWS CloudWatch で取得
• NewRelic (erlangのライブラリ)
– https://github.com/wooga/newrelic-erlang