質問者のいう様な非常に大きなバイナリになる製品は単一のプロセスで全ての機能を賄う「モノリシック」な設計と言えます。
また、コンテンツ(HTMLや画像)をバイナリに含めたままだと巨大なコンテンツを扱うと結合コストがバカにならなくなるのでおそらくコンテンツをバンドルする様な構成はどこかで破綻します。
そしてロジックだけなら数百メガバイトからはなかなか増えないと思います。(ウインドウズとかを提供するレベルならあり得るわけですが、それでも多数のアプリを含むから数ギガのサイズになってるわけで。)
またモノリシックな製品はアップデートが行いにくくなるので結果として単一バイナリのモノリシックな構成は小さなプロダクト向けだという認識です。(ウインドウズアップデートがいつも数ギガダウンロードでディスク大量書き換えだと大変ですよね)
巨大な仕組みの場合はおっしゃる通り責任分岐点を見極め、分離したマイクロサービスで構築するのがアップデートも行いやすくなりモノリシックのいろんな欠点を回避できます。
モノリシック製品最大の欠点はとある小さな業務の変更(例えば誤字の訂正)なのに全ての業務を止めて差し替えなければならなくなる点です。
もちろん運用次第ではそれでも構わないということはあるかもしれませんが、こういうリスクを抱えたまま巨大な仕組みをモノリシックな設計にわざわざ振ることはしないでしょう。
プロセス内のメモリは複数のスレッドから参照可能なのでスレッドごとに冗長なメモリを占有する必要はあまりありませんが、プロセスをまたぐ情報は相互参照をOSにより禁止されているのでほとんどの場合は冗長に持たせることになります。Goの場合、1プロセスだけでホストのマルチコア性能を引き出す運用が可能ですのでその場合、マルチプロセスで性能を稼ぐやり方に比べ冗長なメモリを浪費することが無いのは利点の一つですね。
traefikやnginxなどのリバースプロキシサービスを前段に置くことで複数のWebアプリへ振り分けることができますし、業務別にWebアプリを分離して構築するのは簡単です。(URLのプレフィックスで別のサーバーに中継など)
まとめると、
- 数ギガに及ぶバイナリはビルド・運用・維持全てに無理が出る
- まずはコンテンツとロジックを分けよう
- Goなら1プロセスサービスで大量の処理を捌けるのはメモリに優しい
- 多岐にわたる業務は分離実装の方がメンテしやすい
- ある程度大きな仕組みになる予定ならリバースプロキシやロードバランサーを活用した設計に
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/01 03:25 編集
2019/09/30 22:52