umbrellaではRPCしてくれる君をつくろうという話
Elixirのumbrellaは知っていましたが、実際これ分散させて動かすときどうなんのさ、というイメージがぱっとしていなかったのですが、こちらを読んだら腹落ち感が生まれたのでメモ。特にInterface Moduleを切った上でRPCする、というところ。
例えばapp
とdatabase
という2つのOTPアプリケーションがあったとします。database
にクエリ投げたりする関数をDatabase
モジュールにつくり、それをapp
の中で使おうとすると、app
はdatabase
に依存している、つまりdeps
に{:database, in_umbrella: true}
を持つ、ということになります。そうなると、app
を立ち上げたいだけなのにdatabase
も立ち上がり、何がマイクロサービスだこんちくしょう、デプロイセパレートリーくそくらえ、というわけです。
上の記事で説明されているアプローチは、app
はdatabase
への依存を持つのではなく、database_interface
への依存を持つようにするというものです。database_interface
はdatabase
へのRPCの方法と、database
がどこで動いているかを知っている存在です。これを間に挟むことで、それぞれのアプリケーションが個別に立ち上がれるようになるわけです。
+--------------------+ | app | +--------------+ | |-- RPC --| database | | database_interface | +--------------+ +--------------------+
言われてみれば、そうですよねー、というやつでした。