3

私はこれを持っています:

use Plack::Builder;
my $config_app = sub {...};
my $app = sub {...}

builder {
    mount "/admin" => $config_app;
    mount "/"   => $app;
};

$config_app構成値をファイルに保存しapp.cfg$appそれをconfig-fileとしてロードします。すべてのリクエストで設定ファイルを読み取る必要はありません。アプリケーションの開始時にそれを読み、変更されたときにそれを再読する必要があります。

これを達成するための最良の方法は何ですか?

私の唯一のアイデアは次のとおりです。アプリは最後のconfig_read_timeを記憶し、すべてのリクエストでの変更時刻をチェックしapp.cfgます。ファイルが変更された場合は、再読み込みします。

ここにもっと良い解決策はありますか?(たとえば、$ config_appが新しい構成を保存したときなど、$config_appと$appの間のメッセージを意味しwill send some message to $app: re-read the configます。

4

2 に答える 2

6

$app内部で(内部リダイレクトのようなもの)を呼び出すことは不可能ではありません$config_appが、個人的には反対することをお勧めします。

別の単純な古いPerlクラス(MyApp :: ConfigFileなど)を作成し、シングルトンオブジェクトからメソッドを呼び出したり、シングルトンオブジェクトに対してメソッドを呼び出したりすると、はるかに簡単になり$appます$config_app。いずれにせよ、この手法は単一プロセスのWebサーバー環境でのみ機能することに注意してください。変更時刻を確認して再読み込みすると、StarmanWebサーバーなどの分岐した環境で機能します。

于 2011-05-20T01:09:29.237 に答える
5

構成ファイルを監視する方法はたくさんあります。

次のような構成チェックルーチンを記述します。

use constant MIN_CHECK_DELAY => 5;  #SECONDS
use constant CONFIG_FILE => '/etc/wtf.conf';

{
    my $last_changed = 0;
    my $last_check   = 0;

    sub load_config {

        return if $last_check + MIN_CHECK_DELAY <= time;

        return if (stat(CONFIG_FILE))[9] <= $last_check;

        # Do stuff here.

        return;
    }

}

注意する必要がある主なことは、ファイルが変更された秒の間に何度もリロードすることにならないことです。

ここで、新しいラウンドの構成をロードしたい場所で `load_config()を呼び出します。それは常に成功するので、便利な場所にそれを振りかけるよりも賢いことをテストしたりする必要はありません。アプリハンドラーの上部のように。

これは、実行中のプロセスのロギングを有効にしたり、モジュールのリロードを強制したりする場合に最適です。スケーリングがあなたを噛まないような用途は多くありません。

ご存知のとおり、これを提供するマシンがたくさんある場合、拡張性はありません。変更されたファイルをrsyncする必要があります。さらに悪いことに、それらをNFSマウントに配置する必要があります。

ここに根本的な概念があります:なぜデータベースを使用しないのですか?

最近、かっこいい子供たちがデータベースベースのWebアプリを試していると聞いていますが、実際にはかなりうまく機能しています。

真面目な話ですが、プログラミングとシステム構築の面白さは、設計上のトレードオフから選択することです。変更されたファイルを渡すことが素晴らしい成功であるというエッジケースがあるかもしれません、そして私の卑劣なデータベースコメントは全くの愚かさのために示されます。そのユースケースが何であるかはわかりませんが、存在する可能性があります。 あなたはあなたのユースケースを知っています。 試してみてください。少し愚かであることを恐れないでください。時々、本当にばかげた解決策のように見えるものが驚くほどエレガントであることが判明します。ただし、アイデアがばかげていることが判明した場合は、経験から学び、先に進んでください。

于 2011-05-20T01:16:02.650 に答える