2012-10-24 86 views
2

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

nginx的/瘦,我上运行的各种端口的多个实例,并通过端口调用应用程序实例,如:

#!/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 

您可以使用任何信号,而不是信息。

有关的信号列表,请参阅红宝石Signal.list

为了让工人PID的列表,请参阅独角兽的after_fork配置。

+0

doh,it是如此杀死明显:)谢谢,试图 –

+0

就是这样!留下来!我现在有一个完全控制的独角兽应用程序! :) –

0

这是不可能的。

独角兽主进程打开侦听端口,工作人员经常竞争接受该端口上的请求。除sending them Unix signals以外,没有办法选择单个工人。

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

+0

disapointed :(必须只在没有内部缓存的项目上使用Unicorn –

+0

或者在缓存键中包含应用程序版本号或其他任意可变的标记,以便您可以随意增加它,从而有效地使以前的缓存失效。 –

相关问题