2

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

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

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

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

我想知道如何对 Unicorn 做同样的事情,但不是通过端口。Unicorn 是否提供了正在运行的实例列表或某种与它们交互的方式?

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

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

4

2 回答 2

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。

有关信号列表,请参阅 RubySignal.list

要获取工人 PID 列表,请参阅 Unicorn 的after_fork配置。

于 2012-10-24T11:33:56.987 回答
0

这是不可能的。

独角兽主进程打开监听端口,工作人员不断竞争接受该端口上的请求。除了向他们发送 Unix 信号之外,没有办法选择单个工人。

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

于 2012-10-24T05:03:35.470 回答