在通过Nginx / Unicorn进行部署时,我遇到的问题是如何与运行的实例取得联系。我需要这个来更新应用程序的内存缓存。
使用Nginx / Thin,我在各种端口上运行多个实例并按端口调用app实例,例如:
#!/bin/bash
curl :2000/update_cache/page_id
curl :2001/update_cache/page_id
etc.
丑陋的方法但它确实有效,因为我可以在所有正在运行的应用实例上更新单个页面的缓存(数千个)。
我想知道我怎么能用Unicorn做同样的事情,但不能用端口做。 Unicorn是否提供了正在运行的实例的列表,或者某种方式与它们进行交互?
内存缓存的问题是,在某些实例上更新它时,通常不会在其他实例上更新,因此我会遇到内容差异,因为有些用户看到更新的内容,而其他用户仍然使用旧内容。
如何更新所有Unicorn实例的缓存?
答案 0 :(得分:3)
好吧,你能得到工人PID列表吗?
如果是这样,您可以通过发送信号来管理它们。
Ruby可以很好地处理Unix信号,你只需要捕获它们并执行所需的内部操作。
一个简单的概念证明:
Signal.trap 'INFO' do
puts "Updating %s" % Process.pid
# clear cache ...
end
现在,如果你有工人PID,你只需:
#!/bin/bash
for pid in $pids; do
kill -s INFO $pid
done
您可以使用任何信号而不是INFO。
有关信号列表,请参阅Ruby Signal.list
要获取工作人员PID列表,请参阅Unicorn的after_fork
配置。
答案 1 :(得分:0)
这是不可能的。
unicorn主进程打开侦听端口,工作人员不断竞争接受该端口上的请求。除了sending them Unix signals之外,没有办法选择个别工人。
这是为什么不应该像这样进行缓存的众多原因之一:)