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にはそのような問題に対応できる方法が備わっている。それがアンブレラプロジェクトだ。

脚注
  1. ちなみにそのリンクではプロダクトには用いていないと書いてあるけど、こちらのスライドではプロダクトに関する話がある。 ↩︎

こまもか🦊こまもか🦊

アンブレラプロジェクト

アンブレラプロジェクトとは、複数のElixirプロジェクトを1つのプロジェクトとして統括的に扱うことができる機能で、これを使うとサーバーとフロントを1つのリポジトリとして扱うことが出来たりする。

このようなプロジェクト構成はNodejsなどでもありがち[1]だが、Elixirのアンブレラプロジェクトはそれぞれのプロジェクトにアクセスが可能で、比較的自由に構成が出来る点が有利だと思っている。[2]

また、このアンブレラプロジェクトはスーパーバイザーと併用が可能なのでBotを同一リポジトリで複数開発し、それぞれをスーパーバイザーで稼働させるという運用も出来る。

脚注
  1. というよりただ自分が好きなだけかも知れない。 ↩︎

  2. というよりElixir自体がかなり自由に構成できる作りになっている。ディレクトリ構成はいつも悩みのタネになるので結構ありがたい。 ↩︎