Perl WebService увеличивает максимальное количество соединений, используя HTTP :: Server :: Simple :: CGI - PullRequest
1 голос
/ 02 марта 2020

Я работаю немного Perl Веб-сервис, основываясь на примере, который я нашел на этой странице: https://www.perlmonks.org/?node_id=1078567 (первый пример)

Однако, когда много клиентов вызываем его сразу, похоже, что запросы внезапно перестают работать, и на сервере, на котором запущен веб-сервис, осталось много tcp-соединений TIME_WAIT, как будто веб-сервис не смог обработать такое количество соединений одновременно.

есть ли параметр в этом модуле или другой, который я мог бы использовать, чтобы расширить это? или способ поставить какую-то очередь для входящих запросов?

некоторые части моего кода, чтобы помочь:

{
 package TACWebService;

 use HTTP::Server::Simple::CGI;
 use base qw(HTTP::Server::Simple::CGI);
 use Cwd 'abs_path';
 use POSIX;
 use DBI;
 use warnings;

 .........

     my %dispatch = (
     '/insertunix'    => \&resp_insertunix,
     '/insertwin'     => \&resp_insertwin,
     '/getpwdate'     => \&resp_getpwdate,
 );

 # ---------------------------------------------------------------------
 # Requests Handling
 # ---------------------------------------------------------------------
 sub handle_request {
     my $self = shift;
     my $cgi  = shift;

     my $path = $cgi->path_info();
     my $handler = $dispatch{$path};

     if (ref($handler) eq "CODE") {
         print "HTTP/1.0 200 OK\r\n";
         $handler->($cgi);

     } else {
         print "HTTP/1.0 404 Not found\r\n";
         print $cgi->header,
               $cgi->start_html('Not found'),
               $cgi->h1('Not found'),
               $cgi->end_html;
     }
 }

sub resp_insertwin {
     my $cgi  = shift;   # CGI.pm object
     return if !ref $cgi;

     ....

     } else {
             print $cgi->header("text/plain"), "INSERT"; 
         }


 .....

 # ---------------------------------------------------------------------
 # WebService Start in background
 # ---------------------------------------------------------------------
 my $pid = TACWebService->new($TACWebService::conf{tac_ws_port})->background();
 print "Use 'kill $pid' to stop TAC WebService.\n";

сами клиенты используют LWP :: UserAgent вот так :

my $ua       = LWP::UserAgent->new();
$ua->timeout($timeout);
my $response = $ua->post($TAC_Url,
   [
        'args' => $here,
   ]

   if (!$response->is_success) {
    print "Timeout while connecting to $TAC_Url\n";
} else {
    my $content  = $response->as_string();
    print $content if (grep(/INSERT_/,$content));
}

описать точную проблему было бы сложно. Вкратце: клиенты - это Unix серверов, отправляющих свою базу данных пользователей (учетные записи пользователей). и когда множество клиентов отправляют эту пользовательскую базу данных одновременно, я вижу, что веб-служба получает половину данных и отвечает «тайм-аут» после нескольких учетных записей (возможно, потому, что он каким-то образом перегружен)

спасибо снова

1 Ответ

1 голос
/ 06 марта 2020

Проблема в том, что клиент долго ждет ответа сервера. Чтобы решить эту проблему, вы должны запустить сервер несколько раз. Самым простым решением этого является добавление

sub net_server { 'Net::Server::PreFork' }

в ваш пакет TACWebService, а HTTP :: Server :: Simple :: CGI сделает всю остальную магию.

Или вы можете используйте вместо этого HTTP :: Server :: Simple :: CGI :: PreFork. См. https://metacpan.org/pod/HTTP :: Сервер :: Простой :: CGI :: PreFork

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...