perl - 舞者: how to share data and waiting response between 2 POST without blocking

标签 perl scalability high-availability dancer poe

我有一个服务器写在 在虚拟机上,这是工作流程:

  • 客户发布了一些 /post_wait 路由中的内容:POST 应该等待业务处理返回结果
  • 请求由另一个虚拟机处理(通信由 POE + IKC 处理)
  • 报告应通过 /report 路由返回给 REST 服务器通过 session ID 识别的客户

舞者代码:(这是我到目前为止尝试过的)

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;

问题是此代码挂起,因为我使父进程休眠。

也许我应该使用:

我的信息系统应该是可扩展的并且在 模式。

做我想做的事情的最佳实践是什么?

最佳答案

你需要某种视觉追踪。为此使用 Dancer::Session。

你需要做一些“异步”,可能是 fork()。

然后您可以通过调用来启动业务流程

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

进程被 fork 并且 pid 存储在 session 中。

然后你就可以打电话了

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

从 session 中获取 pid(如果有)并检查进程是否仍在运行。

关于perl - 舞者: how to share data and waiting response between 2 POST without blocking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14042330/

相关文章:

regex - 完成在两个文件中搜索并提取数据部分的脚本的想法

concurrency - 将无状态 session Bean 转换为 POJO 的可扩展性影响

c# - ASP.NET 应用程序可扩展性最佳实践指南

amazon-redshift - 实现 Redshift 的高可用性?

mysql复制错误:Slave I/O: error connecting to master

azure - 使用 Kubeadm 创建高可用性 Kubernetes 集群时出错

perl - 如何使用 fastcgi 和 perlbrew 为在 nginx 上运行的 Perl 催化剂应用程序创建初始化脚本

perl - 在使用 "strict refs"时不能将字符串用作 ARRAY 引用

mysql - 如何使用 perl dbi 和 mysql 压缩数据

scalability - 动态水平可扩展的键值存储