2

で記述されたサーバーがあります。これがワークフローです。

  • 顧客はルートにいくつかの json を POSTし/post_wait: POST はビジネス処理が結果を返すのを待つ必要があります
  • リクエストは別の VM によって処理されます (通信はPOE + IKCによって処理されます)
  • レポートは、サーバー/reportによってセッション ID で識別された顧客へのルートによって返される必要があります。REST

DANCER CODE : (それは私がこれまでに試したことです)

package var;
use Data::Dumper;
use Dancer ':syntax';
use JSON::XS;

my $session = {};

# curl -H 'Content-Type: application/json' -X POST -d '{"id":22}' http://127.0.0.1:3000/post_wait
post '/post_wait' => sub {
    my $json = request->body;
    my $h = decode_json $json;
    my $id = $h->{id};
    until (exists $session->{$id}->{report}) {
        sleep 1;
        print STDERR ".";
    }

    return Dumper $session;
};

# curl -H 'Content-Type: application/json' -X POST -d '{"foobar":"xxxx"}' http://127.0.0.1:3000/report
post '/report' => sub {
    my $json = request->body;
    my $h = decode_json $json;
    my $id = $h->{id};
    $session->{$id}->{report} = $h;
    return "OK\n";
};

true;

問題は、親プロセスをスリープ状態にしているため、このコードがハングすることです。

多分私は使用する必要があります:

私の情報システムはスケーラブルで、モードである必要があります。

私がやりたいことをするためのベストプラクティスは何ですか?

4

1 に答える 1

2

ある種のシーズトラッキングが必要です。そのために Dancer::Session を使用します。

そして、いくつかの「非同期」を行う必要があります。おそらく fork() です。

次に、呼び出してビジネス プロセスを開始できます。

# curl -H 'Content-Type: application/json' -X POST -d '{"id":22}' http://127.0.0.1:3000/post_wait

プロセスがフォークされ、pid がセッションに保存されます。

その後、あなたは呼び出すことができます

# curl -H 'Content-Type: application/json' -X POST -d '{"foobar":"xxxx"}' http://127.0.0.1:3000/report

セッションから pid を取得し (存在する場合)、プロセスがまだ実行されているかどうかを確認します。

于 2013-02-05T13:15:36.973 に答える