问题是这样的,在项目中有一个方法我使用了单例来动态的写入读取数据,在使用 Unicorn 部署的时候,当 worker_processes 数目大于 1 时,即多个 Unicorn 进程,因为进程之间内存不共享,当对该值进行写入操作之后,写入操作只在处理此次请求的进程中生效,而其他进程中的数据仍然为写入操作之前的旧值。 为了确保 Unicorn 多进程下数据的一致性,目前想到的解决方案是:
但是以上两种都没有很好的解决问题,想麻烦问下各位 Unicorn 或者 Ruby 可否进行进程之间的通信,解决单例类在多进程中不一致的问题。
附 Unicorn 配置信息:
worker_processes 2
working_directory "/var/lib/jenkins/workspace/XXX/"
listen "/var/tmp/.XXX.sock", :backlog => 512
listen 3002, :tcp_nopush => true
timeout 180
pid "/var/tmp/XXX.pid"
stderr_path "/var/tmp/XXX.stderr.log"
stdout_path "/var/tmp/XXX.stdout.log"
preload_app true
GC.respond_to?(:copy_on_write_friendly=) and
GC.copy_on_write_friendly = true
check_client_connection false
before_fork do |server, worker|
ENV["LOG_LEVEL"]="debug"
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end