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

  • クライアントはブラウザ, スマホApp
  • AWSを使用
  • 独自でラッピングしたDBを使っているのでectoは使えない

問題1 ライブラリが無い

  • 日時に検索のフォーマットとしてiCalenderを使いたかった
    • -> その時点ではElixirライブラリは無かった

対応

  • 必要な部分のみゴリゴリ書いてパースした

ライブラリを探す場合の注意点

  • awesome_elixirだけじゃなくてawesome_erlang&hex.pmあたりも確認すると、ほしいライブラリがある可能性がある
    • ElixirからErlangのライブラリを使用するのは簡単なのでErlangも探してみると良い
  • 動的にAtomを生成するライブラリは注意
    • AtomGCの対象外なので注意が必要
    • -> ヘタしたらBeam自体が死んでしまう
  • 場合によってはPortとかNIFも利用できるが、プロセス間通信を使うのはちゃんと考慮が必要

ちゃんと使うと他にも決めることが

  • コーディングルール
  • 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

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 辺りの予定