Как сервер приложения PSGI с множеством одновременных подключений
Как приложение PSGI может обслуживаться многими параллельными соединениями? Я пробовал веб-серверы на основе событий и предварительной обработки, но число одновременных подключений, по-видимому, ограничено количеством рабочих процессов. Я слышал, что, например, Node.js масштабируется до нескольких тысяч параллельных соединений, можете ли вы добиться аналогичного в Perl?
Вот пример приложения, которое держит соединение открытым бесконечно. Суть не в том, чтобы иметь бесконечные соединения, а в том, чтобы соединения оставались открытыми достаточно долго, чтобы выйти за пределы:
my $app = sub {
my $env = shift;
return sub {
my $responder = shift;
my $writer = $responder->(['200', ['Content-Type' => 'text/plain' ]]);
my $counter=0;
while (1);
$writer->write(++$counter."\n");
sleep 1; # or non-blocking sleep such as Coro::AnyEvent::sleep
}
$writer->close;
};
};
2 ответа
Я не думаю, что у вас должны быть бесконечные циклы внутри приложений, я думаю, что вы должны только установить повторяющийся таймер, и в этом таймере уведомлять / сообщать / писать... Смотрите Plack::App::WebSocket - Сервер WebSocket как приложение PSGI и Re^4: вывод в реальном времени из Mojolicious WebSockets?
Хотя я еще не пробовал его, я столкнулся с этим вопросом, когда искал решение проблемы, с которой сталкивался сервер сокетов для отчета о ходе выполнения и т.д. длительных заданий. Первоначально я думал о подходе, аналогичном ParallelUserAgent, за исключением использования в качестве сервера, а не клиента. Возвращаясь к проблеме через несколько дней после того, как понял, что http://Net::WebSocket::Server заблокировал новые запросы на соединение, если длительный блок кода в обратном вызове нового обработчика соединения. Мой следующий подход будет разделять долгосрочную функциональность на новый порожденный процесс оболочки и использовать БД для отслеживания прогресса, к которому затем можно будет обращаться по мере необходимости на сервере без длительной блокировки.
Думал, что бросил бы свой подход в случае, если это поможет любому идущему подобным путем.