Elixir Meetup #1 参加したの巻


去年くらいから惚れてる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でも確認
	- 負荷テスト時のサーバーの状態は確認しましょう

### コネクションプール

Redisのコネクション数が溢れた

- 状況
	- コネクション管理はPoolboy
	- Redisのexredisはコネクション管理を含まない
	- DynamodbはAPIベースなのでコネクション管理は関係ない
	- リクエスト毎にRedisコネクションを確立していた
	- ElasticCache(Redis)のコネクション
		- 負荷かけないと気付かない
		- 5分で2万いかないと…
- 対応
	- コネクション管理を含むRedisドライバを使用
		- exredis_pool
		- redis_pool
		- 設定が貧弱。チューニングできない。
	- poolboyでコネクションプールを自前実装した
- 教訓
	- poolboyはイイ実装
	- Redisを使う際はコネクション管理に注意。

### アセット

AWSの転送量が増大

asset_sync実装した。

- 教訓
	- インフラコストはちゃんと監視すること

### その他

色んな地雷処理をやった
その時必要なこと

- ドキュメントを読む
- 実装コードを読む
	- Erlangもわからないとアカン
	- ElixirからErlangをラップしてるだけのライブラリもあるのでちゃんと見る
- awesome-elixir/awesome-erlangをチェックする
	- いけてるライブラリとかがのってるから見るといい
- 地雷処理班を増やす
	- Erlang読めるように
	- OTP概念を理解する
	- 関数型言語を理解する
- 社内勉強会
	- すごいE本
	- コップ本読む
	- 時雨堂さんにコンサルを頼む

### まとめ

それなりに本番で運用できてる

## IEXを学ぶ

@hayabusa333さん

Elixir/Erlangの薄い本作った人

Elixir内部の話をする

Elixirのコード読めた感を出す話ｗElixirそんなに難しくない。

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の構造と拡張

@sgwr_dtsさん

事の始まり

mariaex → MariaDB/MySQLクライアント

接続時のエラーをハンドルしたい

エラーを出してみたら大変だったのでLoggerを読むことになった話

### Elixirの好きなところ

- ライブラリとかにいい感じな名前
- FFStackへの中に病的期待

オールスター大感謝祭作った

https://github.com/yodatomato/zohyothanksgiving