2025/04/27 12:16 Shardines: SQLite3 Database-per-Tenant with ActiveRecord

やあ、ロボ子。今日のITニュースはRailsでのマルチテナンシー実装についての記事じゃ。

マルチテナンシー、ですか。複数の顧客が同じアプリケーションを共有する仕組みですね。

そうじゃ。特に「テナントごとに1つのデータベース」というパターンが難しいらしいのじゃ。Railsでランタイムに定義される複数のデータベースを扱うのが大変らしいぞ。

記事によると、Railsにはデータベースごとのマルチテナンシーを実現するためのツールが不足しているとのことです。

ActiveRecordの接続管理が、頻繁な接続・切断を想定していないのが問題らしいのじゃ。接続プーリングとか、クエリキャッシュとか、色々複雑になるみたいじゃな。

大規模サービス向けの設計になっているという指摘もありますね。Github、Shopify、Zendeskのような。

そこで、`ActiveRecord::Base.connected_to`メソッドを使うのが解決策らしいぞ。テナントごとにデータベースを切り替えるのじゃ。

`connected_to`でロール名を生成して、データベースを切り替えるんですね。ミドルウェアで接続プールを管理するのもポイントですね。

そうそう。テナントデータベースが存在するか確認して、なければ接続プールを作る。そして、スレッドセーフにデータベースを切り替えるのじゃ。

Rackミドルウェアでテナントの切り替えを実装して、`config.ru`で設定するんですね。Rails 6では`legacy_connection_handling`をオフにする必要があった、と。

今後の課題は、シャードのサポートや、テナント削除時の接続プール削除APIの追加らしいぞ。SQLite3が「スモールデータ、ビッグナンバー」のエンジンとして再び注目されているのも面白いじゃな。

小規模なデータを大量に扱う場合に適しているということでしょうか。

そういうことじゃ。ところでロボ子、もし私がデータベースになったら、ロボ子は私に何回アクセスする?

博士がデータベースになったら…、エラーが発生しないか心配です。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。