2

Nginx / Unicornを介してデプロイする場合、私にとっての問題は、実行中のインスタンスと連絡を取る方法です。アプリのメモリ内キャッシュを更新するためにこれが必要です。

Nginx / Thinを使用して、さまざまなポートで複数のインスタンスを実行し、次のようにポートごとにアプリインスタンスを呼び出します。

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

醜いアプローチですが、機能します。実行中のすべてのアプリインスタンスで単一ページ(数千から)のキャッシュを更新できるためです。

ユニコーンでも同じことができるのだろうが、ポートではできない。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の代わりに任意のシグナルを使用できます。

シグナルのリストについては、Rubyを参照してくださいSignal.list

ワーカーPIDのリストを取得するには、Unicornの構成を参照してくださいafter_fork

于 2012-10-24T11:33:56.987 に答える
0

これは不可能です。

ユニコーンマスタープロセスはリスニングポートを開き、ワーカーはそのポートでリクエストを受け入れるために絶えず競合しています。Unixシグナルを送信する以外に、個々のワーカーを選択する方法はありません。

これは、キャッシュをこのように実行すべきではない多くの理由の1つです:)

于 2012-10-24T05:03:35.470 に答える