我在虚拟机上有一个用perl dancer编写的休息服务器,这是工作流程:
- 客户在路由中发布一些json内容
/post_wait
:POST 应该等待业务处理返回结果 - 请求由另一个 VM 处理(通信由POE + IKC处理)
- 报告应通过路由返回给服务器
/report
使用会话 ID 标识的客户REST
舞者代码:(这就是我到目前为止所尝试的)
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()
?- 线程?(我觉得不是)
我的信息系统应该是可扩展的并处于高可用性模式。
做我想做的事的最佳做法是什么?