mmag

ハマったことメモなど

umbrellaではRPCしてくれる君をつくろうという話

Elixirのumbrellaは知っていましたが、実際これ分散させて動かすときどうなんのさ、というイメージがぱっとしていなかったのですが、こちらを読んだら腹落ち感が生まれたのでメモ。特にInterface Moduleを切った上でRPCする、というところ。

medium.com

例えばappdatabaseという2つのOTPアプリケーションがあったとします。databaseにクエリ投げたりする関数をDatabaseモジュールにつくり、それをappの中で使おうとすると、appdatabaseに依存している、つまりdeps{:database, in_umbrella: true}を持つ、ということになります。そうなると、appを立ち上げたいだけなのにdatabaseも立ち上がり、何がマイクロサービスだこんちくしょう、デプロイセパレートリーくそくらえ、というわけです。

上の記事で説明されているアプローチは、appdatabaseへの依存を持つのではなく、database_interfaceへの依存を持つようにするというものです。database_interfacedatabaseへのRPCの方法と、databaseがどこで動いているかを知っている存在です。これを間に挟むことで、それぞれのアプリケーションが個別に立ち上がれるようになるわけです。

+--------------------+
|        app         |         +--------------+
|                    |-- RPC --|   database   |
| database_interface |         +--------------+
+--------------------+

言われてみれば、そうですよねー、というやつでした。