Open3
ElixirでBotを運用する方法を考える
動機
最近、分散性と堅牢性に注目してElixir周辺を調査している。自分の中では、Elixirはかなり期待できる言語だと考え始めていて、それを証明するためにまずはBotのインフラを構築してみることにした。
ElxirにはOTPスーパーバイザーと呼ばれる、Erlang VM上で動くプロセスを監視する専用の機構が存在する。
この機構はVM上で動くプロセスを監視し、そのプロセスがクラッシュなどを起こして停止した際に、
- one_for_one
失敗した子プロセスのみを再起動 - one_for_all
失敗したイベントの中にある全ての子プロセスを再起動 - rest_for_one
失敗したプロセスと、そのプロセスより後に開始された全てのプロセスを再起動
の3つの監視戦略を指定できる。それぞれのBotをone_for_oneでクラッシュ時に互いに干渉しないように実行させればかなり安定したBotインフラが運用できそう。なおElixirによるBotはドワンゴで実績がある。[1]
Elixirで複数のBotを運用する基盤はこれで十分に思えるけど、複数のBotを1つのリポジトリで管理することになるのでコードベースが大きくなる。
git submodule
等を使って複数のリポジトリに分割するのもありだけれど、Elixirにはそのような問題に対応できる方法が備わっている。それがアンブレラプロジェクトだ。
-
ちなみにそのリンクではプロダクトには用いていないと書いてあるけど、こちらのスライドではプロダクトに関する話がある。 ↩︎