2012-10-24 51 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

或者在緩存鍵中包含應用程序版本號或其他任意可變的標記,以便您可以隨意增加它,從而有效地使以前的緩存失效。 –

相關問題