在Rails中执行分布式互斥锁的正确方法是什么?

时间:2016-06-03 19:44:41

标签: mysql ruby-on-rails concurrency mutex distributed

我正在构建一个需要应用程序级锁定功能的功能。

该功能如下:

  • 用户登录网站
  • 他们点击了一个按钮,启动了一堆API请求(这是一个长期运行的同步过程)
  • 流程结束,一切顺利

问题是,任何时候都只能运行此进程的一个实例。任何形式的双重提交都会导致重大问题。

我目前的策略是实现以下逻辑:

  • 我会在表格上放置一个布尔字段,指示长时间运行的进程当前是否处于活动状态
  • 当用户首次提交动作时,我将使用锁更新该布尔值:
pc = ProcessControl.first
pc.with_lock do  
  if pc.process_is_running?
    return # abort
  else
    pc.process_is_running = true
    pc.save!
  end
end
LongRunningProcess.start!
  • 然后,漫长的过程将会运行,最后,我会将标志翻回假。

所以我的问题是:这会在分布式环境中运行吗?我有多个应用程序服务器,我想确保一旦长时间运行的进程在其中一个应用程序服务器上运行,任何在同一时间启动长时间运行进程的请求都将显示pc.process_is_running?和它应该返回false,防止双重提交。

我已经发现一些资源已经表明还有其他方法可以进行分布式锁定,我希望上面这个(可能是天真的?)方法能够正常工作。

资源我看过:

0 个答案:

没有答案