Как сервер приложения 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 заблокировал новые запросы на соединение, если длительный блок кода в обратном вызове нового обработчика соединения. Мой следующий подход будет разделять долгосрочную функциональность на новый порожденный процесс оболочки и использовать БД для отслеживания прогресса, к которому затем можно будет обращаться по мере необходимости на сервере без длительной блокировки.

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

Другие вопросы по тегам