3

短縮版

クラス変数は、コントローラ アクションの実行中はスレッド セーフですか?

ロングバージョン

tenant_idデータが誰に属しているかを識別するために、各テーブルに列を持つ単一のデータベース スキーマを使用してマルチテナンシーを実装する Rails 3 アプリを作成しています。

当然、データへのアクセスがテナントごとに適切に分離されるように、データベースで実行されるすべてのクエリの範囲を設定する方法が必要です。

tenant何人かの人々は、常にインスタンスを介してデータベースにアクセスすることでこれを達成することを提案しています。

current_tenant.associate_collection.where(...)

ただし、マルチテナンシーはアーキテクチャの問題 (ビジネス ドメインの問題ではない) であるため、スコープをグローバルに設定することで、モデルに対して可能な限り透明性を維持したいと考えています。また、はるかに乾燥しています。

マルチテナントgemとaround_filtersを使用してこれを行うことができることがわかりました:

class ApplicationController
  around_filter do
    Multitenant.with_tenant current_tenant
      yield
    end
  end
end

これdefault_scopeにより、適切なモデルが操作され、すべてのデータ アクセスが現在のテナントに自動的に適用されます。

これは開発ではうまく機能しますが、スレッドの安全性について懸念があります。参照をクラス変数にMultitenant.with_tenant保存します。current_tenant

問題は、コントローラーのアクションがスタック上にある間、その変数の整合性を信頼できるかどうかです。または、別の要求によって破損している可能性がありますか?

また、Rails の一般的な同時実行の問題に関する良い情報源は何ですか?

4

1 に答える 1

1

これは期間の問題ではなく、コントローラーをアトミックな(中断できない)コードシーケンスにする特別なことは何もありません。スレッドセーフとは、ロック、同期、およびスレッドスケジューラを理解することです。

この場合、あなたの質問はRails固有のものでさえないと思います。一般的な意味で、スレッドセーフは、書き込みが行われている間はデータをロックし、書き込みが終了するとデータをロック解除することで実現されます。それらに精通している場合、これはデータベースのロックメカニズムと非常によく似ています。

Rubyに焦点を当てた参考資料として、ここにアクセスします:http ://www.rubycentral.com/pickaxe/tut_threads.html

スレッドセーフの概念の詳細については(スレッドはOSレベルで実行されるため、どのプログラムでもスレッドセーフがどのように機能するかを理解することが重要です)、http://en.wikipedia.org/wikiにアクセスしてください。 / Thread_safety

于 2011-10-07T02:31:51.923 に答える