在documentation of ActiveSupport::CurrentAttributes中实现的Current类的属性是否可以在上一个请求完成之前被新请求覆盖?
如果rails服务器可以并行解析请求,则应该有一些强大的缓解机制,或者新请求可以覆盖Current类的状态。这会导致数据有缺陷。
例如,假设我们有以下控制器操作:
def process_data
processor = DataProcessor.new
if processor.call_long_data_processing
processor.log("#{Current.user} called data processing")
end
end
def irrelevant_action
render plain: 'hello'
end
如果用户调用慢process_data
操作,并且在完成操作之前,另一个用户调用将覆盖irrelevant_action
类属性的快速Current
。哪个会导致日志注册,第二个用户称为数据处理。
Puma支持某种并发性,其他Web服务器也可能支持。示例中描述的场景可以在现实生活中发生吗?如果不是为什么?
答案 0 :(得分:1)
ActiveSupport::CurrentAttributes
- 提供线程隔离属性单例的抽象超类。
这意味着不,其他请求不能影响当前请求的属性。
如果用户调用慢
process_data
操作,并且在完成操作之前,另一个用户会调用覆盖irrelevant_action
类属性的快Current
。
如果您有一个工作线程(或者所有工作人员都忙),快速操作将在队列中等待,直到有可用的工作人员为止。如果你有几个工作线程并且有一个空的线程,则该空闲线程会快速请求。同样,这不会干扰任何活动请求。