Rails Thread.current 变量是否与单个用户请求隔离



我正在使用Thread.current来存储当前用户ID,以便我可以看到谁对我们的数据库进行了各种更新。但是,在生产中使用一些后,它返回的其他用户 ID 比可能更新此数据的用户 ID 要多。 在本地和较少使用的 QA 实例上,保存的用户 ID 是合适的。

我们正在使用 Rails 5.1,Ruby 2.5.1 和 Puma。 RAILS_MAX_THREADS=1,但我们确实有RAILS_POOL_SIZE=5。 任何想法可能导致此问题或如何解决? 具体来说,单个 Thread.current 变量的持续时间是否比单个用户请求的持续时间长?

为什么Thread.current仅限于请求?

同一线程用于多个请求。

线程不会在请求结束时被终止,它们只是从队列中获取下一个请求(或等待请求到达队列(。

如果您使用 Timeout 中间件,情况会有所不同,因为超时实际上使用线程来计算时间的流逝(并停止处理(......但是,为每个请求创建新线程会带来性能成本。

旁注

根据您的数据库使用情况(阻塞 IO(,RAILS_MAX_THREADS可能需要明显提高。您拥有的数据库调用/数据越多,线程在数据库 IO 上阻塞(基本上是休眠(上花费的时间就越多。

通过将线程池限制为单个线程,您可以显著限制请求并发性。CPU 可能在等待数据库返回数据时处理其他请求。

最新更新