Что мне следует использовать: Starman или Starlet?

Tags:

Оригинальная запись в блоге Миягавы

По мотивам дискуссии в канале #plack в IRC мы создали эту не официальную документацию призванную рассказать об отличиях в 2х популярных Plack HTTP серверах: Starman и Starlet.

Кроме похожего названия эти сервера, так же делают одинаковые вещи: они обслуживают HTTP запросы в режиме pre-fork (создают несколько рабочих процессов для обслуживания входящих запросов).

Starman и Starlet отлично подходят для работы за реверс-прокси (например nginx или Apache mod_proxy).

Starman

Starman написан мной(Миягавой) на основе отдельного модуля Net::Server. Оригинальный код был утащен из HTTP сервера Catalist'а и модифицирован для соответствия спецификации на PSGI сервер.

Из-за использования Net::Server Starman имеет широкий набор возможностей по кастомизации. Например: ротация логов, управление процессами через сигналы, UNIX сокеты, прослушиваение нескольких хостов и прочее.

Свежие релизы так же имеют возможность прямой передачи параметров в Net::Server, что дает еще большую гибкость для бэкендов.

Starlet

Starlet написан Kazuho Oku - он известен как автор большого кол-ва ПО, включающего H2O и С-шную версию персера HTTP для Plack.

В отличии от Starman, Starlet использует собственную реализацию управления процессами и поддержки TCP сокетов. Во время написания Starman, я рассматривал Starlet как экспериментальный. Но учитывая репутацию его ПО и кол-во Plack серверов в его экосистеме, я могу сказать что Starlet вполне зрелое решение.

Kazeburo, другой активный контрибьютер Plack и Starlet, у себя в блоге (на японском) показывает что Starlet масштабируется лучше чем Starman при увеличенни числа рабочих процессов. При увеличении числа рабочих процессов выше 8, Starman имеет проблемы. Это поведение улучшает если убрать блокировку accept/serialization, но Starlet все равно выигрывает.

С другой стороны: Starlet не поддерживает UNIX сокеты и прослушивание нескольких хостов/портов.

Обновление без прерывания обслуживания все еще возможно при использовании Server::Starter перед Starlet.

Выводы

Starman это самостоятельный HTTP сервер с полным набором возможностей, многие из которых обеспечивает использование Net::Server.

Starlet проще и использует немного меньше памяти, хотя и не поддерживает все возможности которые могут быть вам нужны, а могут быть и не нужны.

Если вы хотите динамически контролировать число процессов, или хотите использовать UNIX сокеты, или хотите использовать фичу из Net::Server - используйте Starman.

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

Каждого из них рекомендуется использовать за реверс-прокси вроде nginx. Для обновления без простоев с использованием TCP-сокетов используйте Server::Starter или SO_REUSE_PORT.