VM にperlダンサーで記述されたレストサーバーがあります。これがワークフローです。
- 顧客はルートにいくつかの 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;
問題は、親プロセスをスリープ状態にしているため、このコードがハングすることです。
多分私は使用する必要があります:
- それをPOE-Component-Server-RESTで書き換えますか?
- Dancer::Plugin::Asyncモジュール ? しかし、これを使用しないようにすることはできますか? (いくつかの技術的な制限があります)...
- サブプロセスとして別のスクリプト?
- デキューに使用するredisキューのようなデータベース
BLPOP
? (それにはいくつかのサブプロセスコードが必要です) - ダンサー::セッション?
fork()
?- スレッド ? (いやだな)
私の情報システムはスケーラブルで、高可用性モードである必要があります。
私がやりたいことをするためのベストプラクティスは何ですか?