去年くらいから惚れてるElixirのイベント参加してきました。
ドリコムさん。
目黒なので会社から近いぜ!って思ってたけどよく考えたら祝日でした。
遠い。しょうがないっすね。
Elixir in Production
ドリコム @ohrdev さん
- 主旨
- 自己紹介
- 最近のElixir事情
- 運用システム構成
- 利用しているツール/ライブラリ群
- 運用(負荷テスト)時のトラブル(とその地雷処理)
- 事例1.ログ
- 事例2.コネクションプール
- 事例3.アセット
- その他
- まとめ
主旨
使ってるところないじゃんみたいなのをなくしたい。
あるある事例があるので、共有することでトラブル回避に。
最近のElixir事情
- Elixirの薄い本
- アランビックの錬金術師
- BOOTHで買える
- Programming Elixri 1.2
- Programming Phoenix
運用システム構成
広告配信API
- F/W: maru … RubyのGrape風なやつ
- DB: Redis/ Dynamo
- Job: exq Sidekiq
- 環境変数: dotenv
- Deploy: exrm/ mina = capistranoのシンプル版 / asset_sync(自作)
- Test: mech / power_assert
- Monitoring: sentry ( raven-elixir ) / monit
- Provisioning: Ansible
WAF
- maru
- シンプルなAPI DSL
- 純粋なAPI作るときに使ってる
- Phoenix
- フルスタック
- アセットコンパイルにbrunch.io使ってるのでNode.jsが必要
DB
- Redis
- exredis
- poolboy → Erlangのライブラリ。勉強になる。
- Dynamodb
- ex_aws
- RDB
- ecto
Job
- exq Sidekiqのライブラリ
Env
- dotenv-elixir
Monitoring
- Sentry
- raven-elixirでエラーが起きたらSentryに投げる
死活監視/自動再起動
- monit
- supervisor(OTP)
- きちんと設定しとくと非常に助かるらしい
Provisionig
- Ansible + galaxy-role
- Erlang/elixir/phoenixのバージョンアップ頻度が早いから自動化しておくべき
- ErlangとElixirのバージョン相性があるからバージョン指定できるといい感じ
トラブル
Elixirの本番運用歴1年くらい
開発時に発見しづらく、負荷テスト・本番運用字に現れる事例
ある程度トラフィックが発生しないと起きないような地雷
ログ
IOウェイトがなぜか高い
- 原因
- loggerのバックエンドがconsoleだったため。
- waitが発生してしまうのでヤバイ。
- 対応
- Elixirのloggerのバックエンドは公式にはconsoleしか対応してない
- logger_file_backend使おうとしたけどカスタマイズしづらかったので自前実装した
- 教訓
- ロガーのバックエンドはfileベースにしよう
- 最新のPhoenixでも確認
- 負荷テスト時のサーバーの状態は確認しましょう
- ロガーのバックエンドはfileベースにしよう
コネクションプール
Redisのコネクション数が溢れた
- 状況
- コネクション管理はPoolboy
- Redisのexredisはコネクション管理を含まない
- DynamodbはAPIベースなのでコネクション管理は関係ない
- リクエスト毎にRedisコネクションを確立していた
- ElasticCache(Redis)のコネクション
- 負荷かけないと気付かない
- 5分で2万いかないと…
- 対応
- コネクション管理を含むRedisドライバを使用
- exredis_pool
- redis_pool
- 設定が貧弱。チューニングできない。
- poolboyでコネクションプールを自前実装した
- コネクション管理を含むRedisドライバを使用
- 教訓
- poolboyはイイ実装
- Redisを使う際はコネクション管理に注意。
アセット
AWSの転送量が増大
asset_sync実装した。
- 教訓
- インフラコストはちゃんと監視すること
その他
色んな地雷処理をやった
その時必要なこと
- ドキュメントを読む
- 実装コードを読む
- Erlangもわからないとアカン
- ElixirからErlangをラップしてるだけのライブラリもあるのでちゃんと見る
- awesome-elixir/awesome-erlangをチェックする
- いけてるライブラリとかがのってるから見るといい
- 地雷処理班を増やす
- Erlang読めるように
- OTP概念を理解する
- 関数型言語を理解する
- 社内勉強会
- すごいE本
- コップ本読む
- 時雨堂さんにコンサルを頼む
まとめ
それなりに本番で運用できてる
IEXを学ぶ
Elixir/Erlangの薄い本作った人
Elixir内部の話をする
Elixirのコード読めた感を出す話wElixirそんなに難しくない。
mix から見ていく
Keyword.get
は複数あったら最初に定義されたものを返す
Elixir作っているガチ勢のガチコードはよくわからん。。。
なので内部コード見ると勉強になる。
Power Assert
M3の@ma2geさん
- Elixirのシンタックスをわかっていること
- マクロがちょっとでもわかっていること
What is Power Assert?
ExUnitがそこそこPower Assertライク
表現力豊かな失敗結果を提供
色んな言語のライブラリがある
PowerAssertExのコンセプト
ExUnitで十分なんじゃないか?
パワフルな表示だったので作った
- シンプル
- 標準のExUnitにいつでも戻せる
PowerAssert内部の説明
位置情報と値をどうやって取ってくるかの説明
マクロ使ってる
Macro.to_string
にASTを渡すと文字列が返る
ポジションの取り方
ASTをトラバースするときに正規表現で取得して位置を取り出す
トラバースとは?
prewalk = ASTの構文木を行きがけ順に読んでく
postwalk = その逆
Agent
LT
Javaメインの会社でElixirを流行らせようとしてる話
UZABASE @kaonashさん
ずっとJavaエンジニアの人
会社もJava。
Elixirいけてるポイント
- パイプ演算子・パターンマッチ
- 軽量プロセス
- mix
- PhoenixでWebアプリ手軽 → RubyやったことないからRailsぽくていいとかは特にない
楽しい。
Elixir流行らせたい理由
- 好きな物つかっていいと言われてもJavaくらいしか選択肢がない
- 新しい言語を学ぶことがエンジニアの成長に繋がる
- 社内全体のスキルレベルを上げる
- 好きな言語・技術で好きなものを創れる文化を創りたい
Elixirが楽しいから
流れ
API作ろう→Elixirで作ろう→提案→3秒で却下(理由:2年後に消えてるかもしれない言語で作るのやめてくれ)カチーン!
布教が足りてない
布教LTしてみた
- 生粋のJavaエンジニアがElixirに入門してみた
- Elixirで負荷テストツール作った
- まだオブジェクト指向で消耗してるの?
今後
社内で布教していく
Loggerの構造と拡張
事の始まり
mariaex → MariaDB/MySQLクライアント
接続時のエラーをハンドルしたい
エラーを出してみたら大変だったのでLoggerを読むことになった話
Elixirの好きなところ
- ライブラリとかにいい感じな名前
- FFStackへの中に病的期待
オールスター大感謝祭作った