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

时间:2019-05-31 03:20:23

标签: multithreading ruby-on-rails-5 puma

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

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

1 个答案:

答案 0 :(得分:1)

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

同一线程用于多个请求。

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

如果您使用Timeout中间件,则将有所不同,因为超时实际上使用线程来计数时间的流逝(并停止处理)...但是,根据请求创建新线程会增加性能成本。

侧注

根据您的数据库使用情况(阻塞IO),RAILS_MAX_THREADS可能需要更高。您拥有的数据库调用/数据越多,线程用于阻塞数据库IO(基本上处于睡眠状态)的时间就越多。

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