tokyo.ex #2 に参加した
Tokyo.ex #2 に行ってきました
タイムテーブル
時間 | 発表者 | 内容 |
---|---|---|
19:00- | - | 開場 |
19:30-20:00 | @ndruger | セッション 1: Phoenixを使った案件でリリースまでに起きた問題と対応 |
20:00-20:30 | @ohrdev | セッション 2: running web app on elixir |
20:30-20:40 | - | 休憩 |
20:40-20:50 | @ColdFreak | LT枠 1: :ets.give_away関数 |
20:50-21:00 | @ma2ge | LT枠 2: Create LINE Bot with Elixir |
21:00-21:10 | @Daniel | LT枠 3: Elixir concurrency basics |
21:10-21:20 | @yohei_tanimoto | LT枠 4: Phoenix Tips and Tricks |
21:20-21:30 | @mururururu | LT枠 5: AES-NI |
21:30-21:40 | @SasadaKoichi | LT枠 6: 書籍Programming Elixir関連 |
21:40-22:30 | - | 懇親会 (希望者のみ、無料) |
リリースまでに起きたこと
発表者: @ndruger 株式会社ACCESS
- ACCESSさんではElixirのプロジェクトをすでに8プロジェクトくらい作ってる
- 今回はElixirで引っかかったところ
- 2015/7~2015/12でファーストリリース
アプリの構成
バックエンド: Phoenix フロント: React
問題1 ライブラリが無い
- 日時に検索のフォーマットとしてiCalenderを使いたかった
- -> その時点ではElixirライブラリは無かった
対応
- 必要な部分のみゴリゴリ書いてパースした
ライブラリを探す場合の注意点
- awesome_elixirだけじゃなくてawesome_erlang&hex.pmあたりも確認すると、ほしいライブラリがある可能性がある
- 動的にAtomを生成するライブラリは注意
- 場合によってはPortとかNIFも利用できるが、プロセス間通信を使うのはちゃんと考慮が必要
ちゃんと使うと他にも決めることが
- コーディングルール
- elixir_style_guide,credoとかを使用
- Brunchを使うか使わないか
- 多言語対応はバックエンドじゃなくてフロントとかどちらかに寄せた方がよさげ
- coverex でカバレッジをちゃんととっている(マクロは対象にならない)
サーバログ
- サーバのログは多めにとった。
- -> qiita.com/snowball
- -> リクエストBodyもちゃんと出力
問題3 コンパイル時の型チェックがない
- @spec ErlangのDialyzerを利用したDialyxir
- -> Phoenix依存のWarningが出てしまうのであたたかみのある除外が必要
- 今はDialyzeとCromaのdefunを利用している
問題4 5xxエラー
- CloudWatch から 5xx エラーの通知
- ユニットテストもちゃんと書いていたのでエラーはほとんど怒らないはず
- -> ローカルだと再現せず
原因
- mix.exs deps/0 に追加したが applications への追加が漏れていた
- -> test ではエラーにならなかった
- -> リリースパッケージのみ発生
対策
- deps に追加したら applications へ追加されるように
問題5 5xx その2
- 不定のリクエストで 5xxエラー
原因調査
- 本番でもアタッチできる Recon というライブラリが有る
- -> recon_trace
- HTTPoisonのErlangライブラリのHackneyでコネクションプールが溜まっていた
- Hackneyのコードを読むとレスポンスに対してhackney.body/1を呼び出さないとコネクションが開放される
- 304,204 のレスポンスに対してはBodyが存在しないということでHackney.body/1を読んでいなかった
まとめ
- 自動監視の対象を増やしておく
- 4xx の閾値通知とか
- レスポンスタイム
- サービス初期にはログ出力を増やしておく
- phoenix -> filelogger -> fluentd -> s3
- 直接 fluentd に投げてしまうと怖いので一度書き出している
- 障害が起きても致命的なデータが消えない設計にしておく
- デバッグ方法を調べておく
- リモートコンソール、Observer,Reconとか入れておく
- -> 使ったことがないといきなりproductionにアタッチしなくちゃいけなくなってしまう
- Erlang を勉強しておく。。。。
Running web app on elixir
発表者: @ohrdev 株式会社ドリコム
- 安定のおーはらさん
今回は運用周りの話
最近Elixirの採用例増えているが開発/実装の情報ばかりで運用の情報がない
- どう実装するかではなくどう運用しているか。
- -> 今回の例はまだまだ最良ではない
- どう実装するかではなくどう運用しているか。
サービスに付いて
DreeVee:動画広告ネットワーク
- サービスは止められない
- 低レイテンシが求められる
- スパイクが予想できない
規模
- DAU 50-60万
- ユーザの視聴/購入情報 4500万
キャッシュ
vernishでページキャッシュしている - ESIで画面要素ごとにキャッシュ - ESIタグのリストをAPI(elixir) で返却 - 全部のページ構成要素をキャッシュしている -> ESIタグのリストをElixirで返却している キャッシュ/パージはvclで実装している
バージョンアップ
対象 - サーバ - ミドルウェア - ライブラリ - ソースコード
条件 - 無停止 - ロールバックできる - 検証しながらできる
構成
インフラ - サーバ AWS - データ Dynamo ElasticCache(Redis)
プロビジョニング - Ansible Terraform
ログ - Fluentd S3 TD sentry
ソースのデプロイ
Github -> S3 -> AutoSG で読み込む
プロビジョニング
Ansible -> micro -> AMI
デプロイ
方針
ツール
- exrm
- MIX_ENV=prod mix release でリリースファイルを作成
- init.dスクリプトでexrmで作成したリリースファイルを叩く
- mina
- elixirのcapistorano
- S3に投げたりしているらしい
所感
- バージョンアップの時に混ぜ込んだりするときに便利
- 半年に1回くらいハズレを引く
- デプロイ完了までに時間が掛かる
- 異なる環境のサーバを混ぜ込んだりできるので検証に便利
スポットインスタンスを多く使用しているのでコスト的に良い そこらへん(スポットインスタンス)はドリコムさんの外道父さんの記事見ましょう
Elixir ハンズオンイベントやるよー アンケート有るよー
:ets.give_away/3
http://coldfreak.github.io/ets-give-away/
発表者: @ColdFreak 株式会社IDCフロンティア
etsの持ち回りかた。とプロセスが死んだ時のためにマネージャを用意してみるという話
Create Linebot
発表者: @ma2ge エムスリー株式会社
LineBotのはなし。
Elixir concurrency basics
発表者: @Daniel クロードテック株式会社
stack server を作ってみる。LIVEコーディング ElixirTutorialのプロセス周りの復習みたいな感じだった 相変わらずキータイプが早かった vaioかっこいい(コナミ)
Phoenix Tips and Tricks
発表者: @yohei_tanimoto 株式会社うるる
controller で action/2 をオーバライドすると良い話 Task.asyncを使わない場合はTask.awaitを使わないほうがよい話
AES-NI
発表者: @mururururu 株式会社時雨堂/株式会社アカツキ
時雨堂でWebRTCのサービスでの暗号化というボトルネック解消のためAES-NIに対応したPRをErlangに投げた話。 まだ学生らしいが株式会社アカツキでElixirの相談とかに乗っているらしい。 最近の学生はほんとすごい(コナミ)
書籍Programming Elixir関連
発表者: @SasadaKoichi salesforce/heroku
Ruby会議の話とか、ProgrammingElixirの翻訳本の話とか(7月ぐらいに発行されるらしい) オフレコ話面白かった
感想
Meetupの時は??ってなる時が多かったけど今回は話についていけてる感あった。 毎回月曜とか火曜とか週初めの開催が多いので懇親会には出にくい感はある。 個人的にはElixirを本番稼働させてる実例が聞けてよかった。
次回の開催は 6/29 or 30 辺りの予定