Я работаю немного 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 серверов, отправляющих свою базу данных пользователей (учетные записи пользователей). и когда множество клиентов отправляют эту пользовательскую базу данных одновременно, я вижу, что веб-служба получает половину данных и отвечает «тайм-аут» после нескольких учетных записей (возможно, потому, что он каким-то образом перегружен)
спасибо снова