Rails - 避免同时执行控制器操作

时间:2018-02-05 13:38:47

标签: ruby-on-rails simultaneous-calls

class ExampleController < ApplicationController

  def getAPI
      #retrieve and process data from API
  end

end

如何避免控制器操作同时执行?类变量会起作用吗?

class ExampleController < ApplicationController
  @@in_progress = false

  def getAPI
      render and return if @@in_progress
      @@in_progress = true
      #retrieve and process data from API
      @@in_progress = false
  end

end

类变量是否持久,即使应用程序以多个进程运行,例如乘客。这根本不是一个好主意吗?

如果多个用户请求相同的控制器操作,或者仅避免同时执行一个用户,这是否有效?

1 个答案:

答案 0 :(得分:0)

您必须使用正确的工具来解决此问题,具体取决于许多因素。

  • 您的代码是在单个多线程进程上运行的吗?然后互斥可能会有所帮助
  • 由于数据库操作,您的控制器操作是否不能同时运行?然后带锁的交易可能是您的解决方案
  • 您的代码是在多个进程上运行,也可能是在同一时间运行在不同的服务器上?然后应考虑外部锁定(例如:https://redis.io/topics/distlock

编辑:请不要实现自己的互斥机制(@@in_progress)。有些工具可以原子地处理这些东西,而且经过了充分的测试。

Edit2:如果您的控制器操作是等待来自API的同步响应,则这是一个异步运行的作业。考虑使用像Sidekiq这样的工具。