互斥Rails的过程(Mutex for Rails Processes)

2019-07-19 01:25发布

当部署通过乘客或杂种的Rails你运行应用程序的多个实例。 什么是最好的做法或模式,建立共享资源互斥,如写入本地文件或远程文件。 我要确保两个进程不会同时写入同一资源。

Answer 1:

如果你只需要防止多个作家同时从一个文件时,您可以使用File#flock方法,从每个进程请求独占写锁:

fh = File.new("/some/file/path")
begin
  fh.flock(File::LOCK_EX)
  # ... write to the file here, or perform some other critical operation
ensure
  fh.flock(File::LOCK_UN)
end

注意:将解锁电话在ensure块是很重要的,以防止死锁,如果你已经锁定了该文件后,未捕获的异常被抛出。



Answer 2:

据我所知,在这样的环境中做到这一点的唯一方法是使用基于文件的信号 - 碰锁文件,做你的工作,删除锁文件。 让如果有对文件锁的进程失败。

你也可以有写入到被穿过文件的服务,使应用程序跟服务修改文件,而不是让他们直接修改该文件。



Answer 3:

你可以使用一个后台作业调度程序做实际工作,例如delayed_job的( http://github.com/tobi/delayed_job )。



文章来源: Mutex for Rails Processes