「Rubyist |> (^o^) |> Alchemist 〜Elixirの採用からサービス稼動までの記録〜」
株式会社ドリコム大原常徳さんによる「Rubyist |> (^o^) |> Alchemist 〜Elixirの採用からサービス稼動までの記録〜」という発表です。
まず発表の目的をElixirをプロダクション環境で使いたい人が、導入する方法、導入後にどのようなことをするべきか、また、それを行うために何が必要か大まかにわかることと定められました。
Elixirを導入したチームは大原さん+Elixir未経験者4人の合計5人、元々あるRuby On Rails(以下Rails)製広告サービスの基盤をリプレースするというもので、リプレースあたっての要件は「サービスを絶対に停止してはいけない」というものだったので、元のアプリケーションをマイクロサービス化し、一部のAPIから置きかえを徐々にすすめ、6ヶ月で開発し、すでに運用は1年半に及んでいるそうです。
そのプロジェクトの最初には、
- 開発に求められるElixir習熟レベルを具体的に明示
- 知見のある人をボトルネックにしないために、CIでスタイルチェックや静的型解析そして自動テストを行いコードレビューのサポートをする
- Elixir特有のインフラ課題、デプロイや軽量プロセスの監視を行うためにインフラエンジニアを確保する
といったチーミングを行い開発がうまくいくように準備したと大原さんはおっしゃっていました。
機能開発・テストはTDD(以下Test Driven Development)で行っているそうで、TDDでは通常Red-Green-Refactorという三つの状態を行き来しながらの開発になるのですが、大原さんはそれに並行化を加えているそうです。並行処理が得意なElixirならではですね。
開発、リリースが終わると次に運用のフェーズに入ります。開発してから約2年でトラフィックは50倍になったのですが、コードの改変は行わず、スケールアップ、スケールアウトで対応できているそうです。特にスケールアップにはErlangVMのコア数を増やせばある程度線形に性能が向上する性質が効いたといいます。また監視やバージョンアップについても得られた知見を発表されていました。
チームメンバーと大原さんは、本を読む、ペアプログラミング、Pull Request(以下PR)のレビューを相互に行い、業務でElixirを書けるようになるトレーニングを積んだそうです。このうち本を読むのは通常の業務とは独立したフローで行いましたが、ペアプログラミングとPRは業務のフローに組込まれているため自然な形でトレーニングを重ねられたそうです。
最後に、現在日本で活発なElixirコミュニティや組織の紹介があり、そのなかで来年(2018年)もEliirConfを予定とのアナウンスがありました! またtokyo.exとしては今後ハンズオンに力を入れていきたいとのことでしたので、ぜひ参加を検討してみてはいかがでしょうか。
「ニコニコを支えるErlang/Elixir 〜 大規模運用して初めて見えたアレやコレ」
株式会社ドワンゴ 原耕司さんによる「ニコニコを支えるErlang/Elixir 〜 大規模運用して初めて見えたアレやコレ」という発表です。
現在、ニコニコ動画は総動画数1420万、総再生数824億、1日に3千万回再生されており、ニコニコ生放送は総番組数2.9億で1分間に100番組放送されているそうです。そのような大規模な動画やサムネイルなどのコンテンツを配信するシステムDwango Media Cluster(以下DMC)は、
- Erlang 2400ファイル、55万行
- C++ 400ファイル、6万行
- Rust 120ファイル、2万行
- 開発者 20人
- インフラ 4人
- サーバー たくさん
で構成、現在のところニコニコ動画の新規投稿動画全て、およびニコ生の一部がDMCから配信されており、サーバー一台で同時に数千動画配信しても安定した配信を行えているそうです。
DMCは2014年12月プロジェクトがスタート、大規模になることがあらかじめわかっていたため、レシピやタスクグラフという名前をつけた、処理やリソース割り当てを抽象化したり、定義から様々なコードやドキュメントを全自動で生成できるように準備したそうです。
Elixirでは、旧APIと新APIを橋渡しするDMC gatewayというライブラリをElixir/Erlangが初めてのエンジニア1人で3ヶ月程度で書け、Elixirの利点として、Erlangではできない変数の再束縛、Erlang製ライブラリの透過的な利用、ドキュメント内にテストケースを書くとテストを行えるDocTest、RPMの生成が容易になるライブラリの整備が挙げられていました。
また、レビューもテストも十分に行ったのに、下記の三つのバグが出てしまったとのことでした。
- 大きなメモリを保持したbinaryがGCされず、ErlangVMがOOM Killerによってkillされる
- TCPセッションが1時間に2GBリークする
- monitorしたプロセスが終了したときに送られてくるはずのメッセージが送られてこない
現在は解消しているものの、それぞれが印象深かった理由を述べられていました。
最後に”Erlangはマイナーだが役に立つ”という、どこかで聞いたことのある言葉を用いて発表をまとめられていました。
