如何构建Perl套接字服务器?

时间:2016-01-15 05:12:37

标签: json perl sockets server multiprocessing

我在这个问题上找到了一些稀疏资源,但我希望将Perl服务器构建为一个"微服务"。更具体地说,是一种SOA格式的LAMPhp / Perl / MariaDB中的Web应用程序。

为后端构建高效的Perl服务器的最佳方法是什么? Web层为特定的"服务"打开一个PHP流TCP套接字到特定的Perl服务器。 (高级服务)。该服务器必须为许多Web服务器提供服务。请求异步。然后,该服务直接连接到MySQL以获取答案(简单情况),或者必须进行一些计算工作以生成答案。

我天真的实施是单任务:

use IO::Socket::INET;
use Data::Dumper;
use JSON::XS qw(encode_json decode_json);

$| = 1;

my $socket = new IO::Socket::INET (
    LocalHost => '0.0.0.0',
    LocalPort => '7000',
    Proto => 'tcp',
    Listen => 5,
    Reuse => 1
);

while(1) {
        my $client_socket = $socket->accept();
        my $client_address = $client_socket->peerhost();
        my $client_port = $client_socket->peerport();
        my $client_json = "";
        $client_socket->recv($client_json, 1024);
        my $client_data = decode_json $client_json;
        %response = %{process_request($client_data)};
        $reply_json = encode_json(\%response);
        $client_socket->send($reply_json);
        shutdown($client_socket, 1);
}

因此,这显然存在问题,因为它是文档中的复制粘贴示例。它一次一个地处理单个套接字/请求。

我的问题是:" Perl构建服务器的最佳做法是什么,而不是有效地复用和处理许多传入请求#34;

我对此事的想法是建立一个选择'或者' epoll'通过Thread :: Queue分离到一小部分工作线程的主进程。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我会考虑使用像Mojolicious这样的完整框架,或舞者,或像Net :: Server这样的包。引用它的perldoc:

   "Net::Server" is an extensible, generic Perl server engine.

   "Net::Server" attempts to be a generic server as in "Net::Daemon" and "NetServer::Generic".  It includes with it the ability to run as an
   inetd process ("Net::Server::INET"), a single connection server ("Net::Server" or "Net::Server::Single"), a forking server
   ("Net::Server::Fork"), a preforking server which maintains a constant number of preforked children ("Net::Server::PreForkSimple"), or as a
   managed preforking server which maintains the number of children based on server load ("Net::Server::PreFork").  In all but the inetd type,
   the server provides the ability to connect to one or to multiple server ports.

HTH

相关问题