Help us understand the problem. What is going on with this article?

Elixir Meetup #1 参加したの巻

More than 3 years have passed since last update.

去年くらいから惚れてる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のコード読めた感を出す話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の構造と拡張

@sgwr_dtsさん

事の始まり

mariaex → MariaDB/MySQLクライアント

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

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

Elixirの好きなところ

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

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

https://github.com/yodatomato/zohyothanksgiving

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away