Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

MediaWiki

Глава 12 из книги "Архитектура приложений с открытым исходным кодом", том 2.
Оригинал: MediaWiki
Автор: Sumana Harihareswara, Guillaume Paumier
Перевод: А.Панин

12.4. Запросы, кэширование и доставка данных

Процесс выполнения веб-запроса

Файл index.php является основной точкой входа приложения MediaWiki и принимает большинство запросов, обрабатываемых серверами приложения (т.е., запросов, не обрабатываемых инфраструктурой кэширования, о которой написано ниже). Исполняемый код из файла index.php производит все проверки безопасности данных, загружает стандартные параметры настройки из файла includes/DefaultSettings.php, устанавливает параметры настройки с помощью файла исходного кода includes/Setup.php, после чего применяет параметры настройки вебсайта, заданные в файле LocalSettings.php. После этого создается объект MediaWiki ($mediawiki), а также объект Title ($wgtitle), в зависимости от параметров, задающих заголовок и действие в рамках запроса.

Файл index.php может принимать множество описывающих действие параметров в рамках запроса с использованием URL; стандартным параметром является параметр view, с помощью которого производится обычный вывод содержимого статьи. Например, запрос https://en.wikipedia.org/w/index.php?title=Apple&action=view выводит содержимое статьи с названием "Apple" из англоязычной энциклопедии Wikipedia. (Запросы просмотра статей обычно упрощаются с помощью механизма перезаписи URL, а в данном случае строка URL примет следующий вид: https://en.wikipedia.org/wiki/Apple.) Другими часто используемыми параметрами являются edit (применяемый для открытия статьи с целью редактирования), submit (для предварительного просмотра или сохранения статьи), history (для показа истории редактирования статьи) и watch (для добавления статьи в пользовательский список наблюдения). Административные действия выполняются с помощью параметров delete (для удаления статьи) и protect (для запрета редактирования статьи).

Функция MediaWiki::performRequest() вызывается впоследствии для выполнения наибольшего количества работы, связанной с обработкой запроса в форме URL. Она проверяет наличие некорректных заголовков, ограничений чтения, локальных перенаправлений и циклов перенаправлений, а также устанавливает, направлен ли запрос на показ обычной или специальной страницы.

Запросы обычных страниц осуществляются с помощью вызовов функции MediaWiki::initializeArticle() для создания объекта статьи Article для страницы ($wgArticle), после чего вызывается функция MediaWiki::preformAction(), которая выполняет "стандартные" действия. Как только выполнение действия завершается, функция MediaWiki::finalCleanup() завершает выполнение запроса, принудительно выполняя транзакции на уровне базы данных, выводя HTML-документ и запуская отложенные обновления данных из очереди задач. Функция MediaWiki::restInPeace() осуществляет выполнение отложенных обновлений данных и корректно завершает выполнение задачи.

Если запрашиваемая страница является специальной страницей (т.е., не обычной страницей wiki с содержимым, а такой специальной страницей с подробностями о функционировании программного обеспечения, как страница статистики Statistics), вместо функции initializeArticle() вызывается функция SpecialPageFactory::executePath(); впоследствии выполняется соответствующий сценарий PHP. Специальные страницы позволяют выполнять все типы нестандартных задач, при этом каждая страница имеет специфическую цель, обычно не зависящую от любой из статей, а также содержимого этой статьи. Специальные страницы, среди прочего, позволяют знакомиться с различными типами отчетов (списками недавних обновлений, журналами событий, страницами без категорий) а также работать с инструментами администрирования wiki (блокировать пользователей, изменять права пользователей). Их принцип работы зависит от их функций.

Многие функции содержат код профилирования, который делает возможным отслеживание хода исполнения функций для отладки в случае включения профилирования. Профилирование осуществляется с помощью вызовов функций wfProfileIn и wfProfileOut, которые включают и отключают функцию профилирования соответственно; обе функции принимают в качестве параметра имя функции. На сайтах организации Wikimedia с целью сохранения производительности профилирование производится только с использованием некоторого процента всех запросов. Приложение MediaWiki отправляет UDP-пакеты центральному серверу, который накапливает их и формирует данные профилирования на их основе.

Кэширование

Приложение MediaWiki оптимизировано с целью повышения производительности, так как оно играет ключевую роль в функционировании вебсайтов организации Wikimedia, а также из-за того, что оно является частью большой функционирующей экосистемы, которая повлияла на его архитектуру. Инфраструктура кэширования данных организации Wikimedia (разделенная на уровни) наложила ограничения на возможности приложения MediaWiki; разработчики пытались устранить проблемы, не стараясь подстроиться под принцип работы в значительной степени оптимизированной инфраструктуры кэширования организации Wikimedia, сформированной вокруг приложения MediaWiki, а делая приложение MediaWiki более гибким таким образом, чтобы оно могло работать в рамках этой инфраструктуры без ущерба требуемым возможностям производительности и кэширования. Например, по умолчанию приложение MediaWiki выводит IP-адрес пользователя в правом верхнем углу страницы (для языков с написанием слева направо) в качестве напоминания о том, как как пользователи идентифицируются программным обеспечением в период работы с системой. Переменная конфигурации $wgShowIPHeader позволяет системному администратору отключить эту возможность, делая тем самым содержимое страницы независимым от пользователя: все анонимные посетители смогут получать одну и ту же версию каждой страницы.

Первый уровень кэширования (используемый на сайтах организации Wikimedia) состоит из прокси-серверов обратного кэширования (Squid), которые перехватывают и выполняют большинство запросов до момента их обработки с помощью серверов приложения MediaWiki. Серверы Squid содержат статические версии полностью сформированных страниц, пригодных для чтения пользователями, не совершившими вход в систему. Приложение MediaWiki изначально поддерживает механизмы взаимодействия с серверами Squid и Varnish, а также интегрирует их в систему уровня кэширования для выполнения таких действий, как, например, отправка уведомления им о необходимости удаления страницы из кэша после ее изменения. Для пользователей, совершивших вход в систему, а также других запросов, которые не могут обрабатываться с помощью серверов Squid, кэширующие серверы пересылают запросы напрямую веб-серверу (Apache).

Второй уровень кэширования реализуется в ходе создания и формирования страницы приложением MediaWiki из множества объектов, многие из которых могут кэшироваться для сокращения количества последующих вызовов. Эти объекты включают в себя интерфейс страницы (боковую панель, меню, текст пользовательского интерфейса) и ее содержимое, сформированное в ходе разбора текстовых данных с разметкой wiki (wikitext). Система кэширования объектов в оперативной памяти была доступна в приложении MediaWiki начиная с версии 1.1 (выпущенной в 2003 году) и очень важна для предотвращения повторных разборов больших и сложных страниц.

Данные сессии при входе в систему также могут сохраняться с помощью системы Memcached, что позволяет организовать прозрачную работу механизма сессий в окружении, состоящем из множества серверов с системой балансировки нагрузки (инфраструктура организации Wikimedia формировалась с расчетом на использование системы балансировки нагрузки LVS совместно с PyBal).

Начиная с версии 1.16 приложение MediaWiki использует отдельный кэш объектов для хранения локализованных строк пользовательского интерфейса; этот кэш был добавлен после выявления того, что большое количество объектов, сохраняемых с помощью системы Memcached, представляет собой локализованные с учетом используемого языка сообщения пользовательского интерфейса. Система кэширования реализует возможность быстрого получения отдельных сообщений из баз данных констант (constant databases - CDB), т.е., файлов, содержащих пары ключ-значение. Базы данных констант позволяют снизить затраты памяти и время запуска системы в стандартных условиях; они также используются для функционирования кэшей уровня wiki.

Последний уровень кэширования представлен системой кэширования байткода PHP, обычно активируемой для ускорения приложений на языке PHP. Компиляция может быть длительной; для преодоления необходимости компиляции сценариев PHP в байткод каждый раз при их запуске может быть использован ускоритель PHP, позволяющий хранить скомпилированный байткод и выполнять его непосредственно без компиляции. Приложение MediaWiki будет "просто работать" совместно с многими ускорителями, такими, как APC, PHP accelerator и eAccelerator.

Ввиду большой нагрузки на инфраструктуру организации Wikimedia, приложение MediaWiki было оптимизировано для работы с завершенной многослойной распределенной инфраструктурой кэширования данных. Несмотря на это, приложение также предоставляет возможность использования дополнительной упрощенной системы кэширования, использующей файловую систему для хранения полностью сформированных выводимых страниц аналогично кэширующему серверу Squid. Также абстрактный уровень кэширования объектов приложения MediaWiki позволяет хранить объекты в нескольких местах, включая файловую систему, базу данных или кэш байткода.

Модуль ResourceLoader

Как и в случае многих других веб-приложений, интерфейс приложения MediaWiki становился более быстрым и отзывчивым в течение многих лет, причем в большей степени это стало возможным благодаря использованию языка JavaScript. Улучшение пользовательских качеств приложения было начато в 2008 году вместе с разработкой системы для расширенной работы с мультимедийными файлами (т.е., системы для реализации таких функций, как редактирование видеофайлов с помощью веб-приложения), создававшейся для улучшения производительности удаленного пользовательского интерфейса.

Для оптимизации процесса доставки данных сценариев на языке JavaScript и стилей CSS был разработан модуль ResourceLoader, оптимизирующий процесс доставки данных JS и CSS. Начатая в 2009 году разработка была завершена в 2011 году и стала основной функцией приложения MediaWiki начиная с версии 1.17. Модуль ResourceLoader осуществляет доставку данных JS и CSS по требованию, таким образом экономя время, затрачиваемое на загрузку и разбор данных в случаях отсутствия необходимости в этих операциях, например, при использовании устаревших браузеров. Также данный модуль позволяет уменьшить объем кода, сгруппировать ресурсы для уменьшения количества запросов и, кроме того, вставлять изображения с помощью строк URI для данных. (Для получения более подробной информации о модуле ResourceLoader следует обратиться к официальной документации и выступлению Trevor Parscal и Roan Kattouw с названием "Low Hanging Fruit vs. Micro-optimization: Creative Techniques for Loading Web Pages Faster" на конференции OSCON 2011.)


Далее: Языки