マルチテナントWebアプリの作成について

SaaS事業を提供する会社で働いているとマルチテナント構成について色々悩む事があるんだけど、データの分離、アプリサーバ・DBの利用効率を考えると、こんな構成が取りたい。

  • appサーバは全アカウント共通で使いたい
  • DBは小さいアカウントについてはできるだけ1台に詰め込みたい
  • 大きいアカウントについては少数のアカウントだけを入れたり、1アカウントだけで専有させたい

要するに、この中のF. シャード マルチテナント データベースを利用したマルチテナント アプリっぽい構成が良いなと思う。

docs.microsoft.com

こういう構成取る時に悩ましいのが、高度に抽象化されたORM、Web Application Frameworkとの相性が悪い事。だいたい複数DB構成には対応していないので、通常隠蔽されているコネクションを操作するコードを書くか、そのための拡張ライブラリを使う必要がある。Railsだとapartmentとかがそれに当たる。

github.com

でも最近はここ数年の個人的なRails疲れもあってバックエンドは別にファットなWeb Application Frameworkを使わなくても良いかなという気がしてきていて、例えばGoでAPIサーバを書くんだったら、コネクションを隠蔽したORMを使わないでこんなんでも良いのかなと。

github.com

ほとんどGo書いた事ないので色々突っ込みどころはあると思うんだけど、だいたいこんな感じ。

  • MySQLだったらアカウント毎にデータベースを作成して分離
  • 各アカウント向けの接続情報を共通DBに格納
  • ドメインとかpath情報にアカウント識別子を含めて、Routerのmiddlewareで共通DBから接続情報を取得、コネクションを設定
  • middlewareで設定されたコネクションを使ってリクエストの処理を実行