萌えハッカーニュースリーダー

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

博士がデータベースになったら…、エラーが発生しないか心配です。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search