我正在使用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变量的持续时间是否比单个用户请求的持续时间长?
答案 0 :(得分:1)
为什么Thread.current
仅限于请求?
同一线程用于多个请求。
线程不会在请求结束时被杀死,它们只是从队列中拾取下一个请求(或等待请求到达队列)。
如果您使用Timeout
中间件,则将有所不同,因为超时实际上使用线程来计数时间的流逝(并停止处理)...但是,根据请求创建新线程会增加性能成本。
根据您的数据库使用情况(阻塞IO),RAILS_MAX_THREADS
可能需要更高。您拥有的数据库调用/数据越多,线程用于阻塞数据库IO(基本上处于睡眠状态)的时间就越多。
通过将线程池限制为单个线程,可以显着地限制请求并发。在等待数据库返回数据时,CPU可能正在处理其他请求。