steveklabnik/request_storeのコードリーディング。

Thread.currentはスレッド間では状態を共有しないものの、同一スレッドの異なるリクエスト間では状態を共有してしまいます。

例えばアプリサーバのスレッドを1にして、以下のようなThread.currentのグローバル変数の値を増加させる処理を書いたとすると、Thread.current[:cnt]はリクエストがある度に増加してしまいます。

そういう意図の処理であれば良いですが、リクエストごとのグローバル変数を書きたい場合は意図に反した動きになります。

RequestStoreを使うとRackミドルウェアの仕組みを使ってThread.currentの値をリクエストごとにリセットするため、安全にThread.currentを利用することが出来ます。

コードを読むと、Railtieでミドルウェアを設定しており、gemを読み込んだだけでRackミドルウェアが差し込まれます。

差し込まれるRackミドルウェアはRequestStore.begin!→アプリケーションの処理→end!, clear!という流れになっています。

clear!ではThread.current[:request_store]を {} でリセットしており、begin!、end!はThread.current[:request_store_active]の状態を変えています。