モノリスとマイクロの話

2022/11/23作成

1/ GitHub 元CTO「マイクロサービスにしたことがアーキテクチャ上の最大のミスだった」(※少しマニアックな内容ですが、個人的には面白いと感じたので載せます→)

なかなか興味深かったツイートというかツリーというか。なるほどなるほど。

なんとなく漠然とマイクロサービスっていいものだと思ってたんですが、足かせになってるところもあると。あ、これを書いてる私はちなみにマイクロサービスの経験ありません。モノリスか、せいぜいサービスが数個程度に分割されたシステムしか経験無いです。

一連のツイートを読んでまず思ったのは、私のマイクロサービスに対する認識ってどうやら間違っていたのかなと。私はせいぜい数十程度のサービスに分割することをイメージしていました。開発者全員がサービスの存在と機能をだいたい把握できるくらいの規模。でもどうやら違うっぽい。マイクロというくらいで一つ一つのサービスが本当に小さい。数百行程度ってことは、モジュールやメソッド単位でサービス化してる感じでしょうか。

例えば認証基盤だと、私のイメージだと認証基盤で一つのサービスになってるイメージでしたが、パスワードのバリデーション、照合、ハッシュ化、更新などが全部別々のサービスに分割されてるんですかね。そりゃ確かに大変そう。そんな粒度でサービス分割しているとシステム全体では何百何千とサービスが存在するでしょうから、開発者は個々のサービスを把握できないし、なんなら機能が重複するサービスがあっちこっちにある状態も容易に生まれますよね。そりゃマイクロサービスはだめだって話にもなりそうな気がします。

こういう話で思い出すのが、LinuxのモノリシックカーネルとMinixのマイクロカーネルの話です。リーナスとタネンバウム教授が論争してましたよね。って、私はちゃんと読んでないんですけど。

この論争の時にも思ったんですが、純粋に開発者の視点からしてみると、マイクロであるかモノリスであるかどうかって実はどうでもいいなと思ってます。コードがきちんと整理されて高凝集粗結合になってさえいれば、実体としてのプロセス空間が分離されていようがどうだろうが関係ないからです。メソッドとして直接呼べるかAPIを介すかの違いはありますが、それも適当にラップしておけば普段は気にすることもないですからね。

もちろんこれは開発者の視点のみの話であって、作ったシステムは運用されてなんぼ。そして運用されるときにはプロセス空間やコンテナがどうなってるかは非常に重要なんですけどね。

カーネル論争から30年。世界はLinuxが席巻していますからモノリスが勝利したように思えます。でもちょっと視点を変えてみるとどうでしょう。現代の運用の世界ではコンテナ技術が一般的になりました。コンテナではモノリスカーネルであるLinuxが動いていますが、コンテナ自体は単機能です。そしてシステム全体では何百何千というコンテナが相互に連携しながら動いています。これってマイクロカーネルな世界観に近しいんじゃないですかね。

というようなことをぼんやり思ったりもします。まあ、所詮は素人の戯れ言ですけれども。