在上一个请求完成之前,新的请求是否可以覆盖当前类?

时间:2018-02-17 10:27:28

标签: ruby-on-rails ruby

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服务器也可能支持。示例中描述的场景可以在现实生活中发生吗?如果不是为什么?

1 个答案:

答案 0 :(得分:1)

  

ActiveSupport::CurrentAttributes - 提供线程隔离属性单例的抽象超类。

这意味着不,其他请求不能影响当前请求的属性。

  

如果用户调用慢process_data操作,并且在完成操作之前,另一个用户会调用覆盖irrelevant_action类属性的快Current

如果您有一个工作线程(或者所有工作人员都忙),快速操作将在队列中等待,直到有可用的工作人员为止。如果你有几个工作线程并且有一个空的线程,则该空闲线程会快速请求。同样,这不会干扰任何活动请求。