如何更新所有Unicorn实例?

时间:2012-10-24 04:04:40

标签: ruby unicorn

在通过Nginx / Unicorn进行部署时,我遇到的问题是如何与运行的实例取得联系。我需要这个来更新应用程序的内存缓存。

使用Nginx / Thin,我在各种端口上运行多个实例并按端口调用app实例,例如:

#!/bin/bash
curl :2000/update_cache/page_id
curl :2001/update_cache/page_id
etc.

丑陋的方法但它确实有效,因为我可以在所有正在运行的应用实例上更新单个页面的缓存(数千个)。

我想知道我怎么能用Unicorn做同样的事情,但不能用端口做。 Unicorn是否提供了正在运行的实例的列表,或者某种方式与它们进行交互?

内存缓存的问题是,在某些实例上更新它时,通常不会在其他实例上更新,因此我会遇到内容差异,因为有些用户看到更新的内容,而其他用户仍然使用旧内容。

如何更新所有Unicorn实例的缓存?

2 个答案:

答案 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之外,没有办法选择个别工人。

这是为什么不应该像这样进行缓存的众多原因之一:)