Блог Конфуция
Главное — не дублировать 22.01.2009

Издалека

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

У нас есть исходник нжинкса, который, строго говоря, доступен только для чтения. Но это не беда, так как Игорь выбрал для нжинкса микроядерную архитектуру, которая ведет к постоянному развитию API. Таким образом практически вся функциональность нжинкса разделена между модулями. Эван Миллер сравнивает нжинкс с Бэтменом, а модули нжинкса с поясом Бэтмена, в котором всегда все есть.

Так, например, все фильтры являются самостоятельными модулями. Есть относительно простые модули, например, ngx_http_addition_filter_module, сложные, как ngx_http_gzip_filter_module и модули сравнимые по сложности со всем нжинксом, это, конечно, ngx_http_ssi_filter_module.

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

Что надо знать, перед тем, как встаивать скриптовый движок? В принципе, ничего кроме того, какие именно задачи вы хотите перенести на скрипты. Если это ресурсоемкие вычисления, или работа с большим количеством логики поверх сложных абстракций, или большие и очень большие куски бизнес-логики, или еще что-то большущее, то скриптовый движок тут не поможет. Яваскрипт не сможет показать себя с хорошей стороны. Все функции, которые так или иначе связаны со скриптами, будут потихоньку начинать тупить. Приложение за счет гибкости языка разрастется очень быстро, и управлять им станет заметно сложнее, чем казалось вначале. Для больших проектов лучше подходят строгие и очень строгие языки, такие как Java, С++ или С. Они станут мешать вам сразу после начала работы, и вы привыкнете к этому. А яваскрипт (а так же руби, питон, перл и другие) не станут этого делать, и после будет очень обидно получать синяки и шишки работая с уже полюбившемся инструментом. Для быстрого нжинкса важно, чтобы яваскрипт тоже оставался быстрым и легким. Не мне вас учить выбирать технологи, но предупрежден — значит вооружен!

К делу

Итак, выберем конкретные задачи, применительно к нжинксу.

  • Для начала было бы неплохо генерить простые ответы на простые запросы. Без парсинга данных форм, принятия файлов, и уж тем более без запуска CGI-скриптов или обращений к базе. Здесь SpiderMonkey нас сам и ограничит, так как модулей промышленного качества для него очень мало, и вся доступная функциональность будет предоставлена нжинксом.
  • На второе подойдет работа с локальными файлами, чтобы иметь возможность что-нибудь сохранить. Правда, это не очень здорово, так как асинхронно работать с диском сложно. Гугловский браузер Chrome, например выносит весь файловый ввод/вывод в отдельный поток, чтобы интерфейс не тупил, и все обращения к диску работают через него.
  • В качестве компота, будут подзапросы. Собственно говоря, это самый оптимальный способ получать содержимое файлов, так как нжинкс умеет кешировать дескрипторы файлов и читает их максимально быстро. Все это не надо изобретать для использования внутри яваскрипта, а достаточно сделать обертку для функций нжинска.
  • Для обеспечения связи с внешним миром, пришлось еще учить SpiderMonkey читать переменные окружения. Это оказалось очень просто, так как решение идет вместе с исходниками яваскриптового интерпретатора.
Для начала этого вполне достаточно. Основная идея ясна — не дублировать функционал нжинска, а наоборот, описать его в терминах яваскрипта.

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

Теги:
  • сервер
  • javascript
  • nginx
  • spidermonkey
Очень жду ваших комментариев на почту или на гитхаб.