Как я могу улучшить работу Moose в неустойчивых процессах CGI?

Moose - фантастическая объектная структура. Беда в том, что вместе с ее зависимостями она очень большая. Наше профилирование показывает, что на нашей платформе просто загрузка Moose будет нести 5-6 секундные накладные расходы на непостоянные сценарии приложений CGI. Это просто неприемлемо для этих одноразовых приложений.

В отличие от этого, когда мы используем постоянную систему процессов (например, FCGI), эта служебная нагрузка запуска исключается (или, скорее, только понесена один раз), и все хорошо. Проблема заключается в том, что мы не можем гарантировать, что весь наш код всегда будет работать под постоянным процессом.

Мы исследовали с помощью Mouse в качестве ограниченной замены замены для Moose, но, как выясняется (как указано в этот ответ), что не является жизнеспособным вариантом. Любые библиотеки, которые мы пишем для работы с Moose, не будут работать с Mouse тонкими, но важными способами. И мы действительно не хотим разветвлять все наши модули, чтобы мы могли поддерживать как Moose в постоянной среде, так и Mouse для "vanilla" CGI.

Учитывая это, мы имеем следующие варианты:

  • Создайте собственные модули для работы с Moose или Mouse, если это необходимо. (Тьфу!)
  • Разрабатывайте только модули для FCGI/Moose. Не поддерживайте "vanilla" CGI. Если нам приходится писать сценарии, которые не являются постоянными, они не смогут использовать наши внутренние модули.
  • Не используйте Moose или Mouse, но некоторые другие объекты.

Какой вариант лучше? Сейчас мы наклоняемся к 2, и мы просто высасываем его, если нам нужно что-то запустить как ванильный CGI. Как насчет других структур? Есть ли что-нибудь более легкое, над которым мы должны смотреть?

Ответ 1

Моим преимуществом было бы отказаться от поддержки CGI ванили. В наши дни хостинг FCGI действительно дешев, и нет оснований потворствовать ванильному CGI (IMO), потому что он просто подкрепляет мнение о том, что Perl работает медленно. Но если вы не можете этого избежать, вы можете использовать что-то вроде Object::Tiny. Но если вам нужны Роли, ограничения, мета-программирование и все другие прекрасные возможности, которые предоставляет Лось, вам не повезло, если вы не сбросите ванильный CGI.

Ответ 2

Вы можете написать серверное приложение на заднем плане, используя Moose, а затем написать очень маленькие, простые CGI-скрипты, которые запрашивают обратный конец.

+-------+    +--------------+
| Small |===>|  Persistent  |
|  CGI  |<===| Moose Server |
+-------+  ^  +--------------+
           |
         Socket
       Connection

Это более или менее то, что делает FCGI, поэтому имеет смысл использовать FCGI.

С другой стороны, могут быть реальные преимущества при использовании сервера back-cgi, который может иметь ЛЮБОЙ абстрактный интерфейс при необходимости.

Например, если вы используете сокеты TCP (или UDP), тогда у вас может быть приложение собственного рабочего стола, которое будет иметь тот же конец, что и ваш CGI.

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

Ответ 3

Мое предложение - пойти с опцией №2, а затем помочь нам реорганизовать Moose, чтобы CGI стал жизнеспособным. В настоящее время fREW работает над набором тестов Moose, чтобы включить проект MooseX:: Antlers, который должен уменьшить большую часть служебных данных, что означает, что Moose непригоден для среды CGI.

Мэтт Траут (mst), человек, который сейчас стоит за MooseX:: Antlers, выразил желание иметь возможность запускать приложения в среде CGI, если это необходимо. Я бы посоветовал теперь придерживаться FCGI и приставать к нему за тем, что вы можете сделать, чтобы помочь!

Ответ 4

Существует еще один вариант - PPerl.

Я никогда не использовал его, но он определенно выглядит интересным. И тот, кто его написал (Matt Sergeant aka baud) - это дает вам практически гарантию хорошего качества кода.

Ответ 5

Джонатан Роквей написал о APP:: Peristent (что, как ни странно, не в CPAN) несколько месяцев назад. Я не использовал его, но, основываясь на его вышеописанном сообщении в блоге, он выглядит достаточно прозрачной архитектурой сервер-клиент, чтобы вы могли обернуть фактическую обработку вашего CGI.

Ответ 6

Основная идея App::Persistent, pperl, SpeedyCGI, и, возможно, некоторые другие - это то, что процесс компиляции вашей программы Perl в байтовый код выполняется один раз, а некоторые после этого используется кэширование. Поскольку у Moose, как говорят, есть довольно штраф за компиляцию, я сначала попробую этот подход.

Я успешно использовал pperl для рисования больших MRTG графиков в древней системе около 2001 года. Программа Perl была выполнена для каждого графика, который был довольно накладным - это, вероятно, сопоставимо с вашим сценарием CGI.