Диссертация (1090660), страница 26
Текст из файла (страница 26)
В конечном итоге выбран язык программирования C++. Проведено тестирование динамических Web-платформ CGI и FastCGI наряду с интерпретируемым языком PHP и статической страницей HTML, взятой в качестве эталона. Проводились тесты выводастатического (прогревочные тесты динамических платформ) и динамического содержимого. Лучшие показатели работы на высоких нагрузках [96] показала платформаFastCGI. Однако CGI как наиболее распространенная и надежная платформа, являющаяся в некотором смысле родственником FastCGI, была также поддержана в рамкахразрабатываемого проекта, несмотря на низкую эффективность.149Детально рассмотрена архитектура интерпретатора в базовой сборке.
Проведенсравнительный анализ библиотек для каждого из компонентов программного комплекса. Были разработаны следующие библиотеки: анализатор HTTP, обработчик сессий, считыватель файла настроек и некоторые другие. Ко всем остальным библиотекам в той или иной степени предъявлялся ряд следующих требований: высокая производительность, полностью открытая лицензия, хороший уровень документирования,поддержка сообществом разработчиков, низкий порог вхождения.Несмотря на невысокие показатели, в качестве синтаксического анализатора XMLбыла выбрана библиотека libxml2 с оговоркой, что в будущем, в процессе дополнительной оптимизации, в программный комплекс будет встроена поддержка более производительной потокоориентированной библиотеки expat.
В проекте на данном этапеиспользуется libxml2 как наиболее эффективное решение в отношении разработки, нетребующее непропорционально больших трудозатрат.Как безусловный лидер в своей области по производительности и по функционалусреди шаблонизаторов был выбран CTPP2, используемый в проекте «Рамблер-Почта»компании «Рамблер». Данный шаблонизатор, написанный на C++, показал наивысшую производительность, он имеет весь базовый функционал для гибкого созданияшаблонов, а также возможность их компиляции как на лету, так и на этапе разработкипроекта.Описанная в работе архитектура системы, а также сравнительный анализ ее компонентов образовали комплексное инженерное решение в сфере систем высокой доступности, реализованное в проекте BlockSet.
Множество этих решений были провереныгодами практической эксплуатации в широко известных проектах сети Интернет инашли свое применение в настоящей работе как в первозданном, так и в измененномвиде с учетом специфики и потребностей проекта.В рамках реализации программного комплекса синхронизатора был решен рядпроектнотехнологических задач: разработана технология взаимодействия с внешними процессами интерпретатора, выбран оптимальный алгоритм перестроения структуры БД, решены проблемы потерь данных при изменении архитектуры, разработанаэффективная методика разделения затратных алгоритмов во времени.В результате проделанной работы можно говорить о нахождении оптимальногорешения для реализации модуля валидации и преобразования данных, выполненномв виде «абстрактной фабрики».
Были выявлены явные преимущества фабрики приреализации, затронуты проблемные моменты и их решения. Создание единого интерфейса доступа к конкретным реализациям позволяет вести разделенную разработку150каждого типа и их отдельное тестирование. Кроме того, единообразное использование класса независимо от переданного типа блока дает универсальный интерфейс дляработы с модулем.151fork()НачалоНетВнутри дочернего процесса?КонецДаДаНетЗагрузить вседокументы BML израбочей директории вструктуру “B”Количество файлов совпадаетс сохранёнными в массиве?Обновить массив,сохранив в него новыйсписок файлов сдатами и CRC32ДаНетДочерний процессвыполняется?ДаНетВсе даты и контрольныесуммы файлов совпадают ссохраненными в массиве?fork()НетДаВнутри дочернегопроцесса?НетДаДочерний процессзавершился с кодом 0?Перестроениеструктуры базыданныхПоменять местами структуры“A” и “B”ДаЗавершение дочернегопроцессаНетУбрать у всех сущностейпостфикс $modified.Дублирующим старымсущностям присвоитьпостфикс $deletedСуществует новое входящееподключение?Добавить в массивобработчиков новоеподключение, сохранитьвремя подключенияВзять указатель наследующеесоединение измассиваНетУдалить подключениеиз массиваДаНаступил таймаутподключения?ДаОбработать соединение,вернуть данные из структуры“A”, сбросить таймаутНетУдалось считать данныеиз полученного соединения иструктура “A” не пустая?Рисунок 4.8.
Общий алгоритм работы синхронизатора152НачалоЧтение следующегоэлемента из структурымоделиДаНетДостигнут конец структуры?Проверкаспецифическихсвойств объектаВсем незадействованнымтаблицам и полямприсвоить постфикс$deletedКонецДаНетСуществует ли в БДобъект,соответствующий атрибутуname у элемента?ДаПродублировать объект,согласно новому имени,указанному в атрибутеname и с постфиксом$modifiedНетСуществует ли в БДобъект, соответствующийатрибуту oldname уэлемента?ДаУбрать у объектапостфикс $deleted,добавить постфикс$modifiedСуществует лиобъект соответствующийатрибуту name у элементаи с постфиксом$deleted в БД?НетСоздание объектаРисунок 4.9.
Алгоритм перестроения структуры базы данных153120Время выполнения всехзапросов, мкс128 Б100512 Б1 Кб805 Кб6010 Кб402001050100300500Количество клиентовРисунок 4.10. Результаты тестирования неблокирующих сокетовНеблокирующий сокетДанные BSONПроцессFastCGIДокументв браузереклиентаПроцессFastCGIДокументв браузереклиентаПроцессFastCGIДокументв браузереклиентаНеблокирующий сокетПроцесссинхронизатораДанные BSONНеблокирующий сокетДанные BSONРисунок 4.11. Сетевое взаимодействие синхронизатора154Проверка специфичныхсвойств объектаБлокНаборОбъект является блоком илинабором?ДаНетДаНетАтрибут relation=“multi” исвязующая таблицаотсутствует?НетТип блока в структуресоответствует типу поля в БД?ДаПростая связь.
Вторичныйключ есть?Создать связующуютаблицу с постфиксом$modifiedНетДаПриведение разрешеносогласно конфигурации?Перенести ключи изпредыдущих связейПроизвести приведениетипаСоздать вторичный ключс постфиксом $modified уведомого набораКонец проверкиспецифичных свойствобъектаЗаписатьпредупреждение вжурнал ошибокРисунок 4.12. Специфика работы с отдельным объектом155Рисунок 4.13. Мастер создания нового проектаРисунок 4.14. Редактор набора156Рисунок 4.15.
Редактор блока157Рисунок 4.16. Редактор локации158sectionscatnamedescriptioncatsortcaticonsiconprivateflagglobalpermissionsmesspermissionsvisibilitymoderpermissionstopicssubjectmessagepubdatepubipeditdateeditipclosedimportantpoll_questionpollspoll_answersanswer_textanswer_votemessiconsiconanswersmessagepubdatepubipeditdateeditipРисунок 4.17. Редактор прав доступа159ЗаключениеИтогом диссертационной работы стал программный комплекс, являющийся инструментарием разработки динамических Web-узлов и приложений, что показано вследующих результатах:1. Разработан метод декларативного программирования Web-приложений на серверной стороне, а также его фундаментальные элементы и их взаимодействие.Доказана целесообразность применения декларативной методики и разработкипредметно-специфичного языка.
Предложены базовые сущности языка: модель,локация, набор, блок. Обозначены принципы взаимодействия между сущностями. Показаны принципы полиморфизма отдельных блоков в зависимости от своих типов [91, 93, 94, 97, 99].2. Метод комплексной оценки инструментов императивной и декларативной разработки динамических Web-узлов. Построена оценочная модель программного кода в целом и разрабатываемого языка программирования в частности. Приводится обзор критериев оценки. Упоминаются достоинства и недостатки существующих оценочных методов. Применяется метод анализа иерархий для определениянаиболее важных критериев. С помощью метрик Холстеда осуществляется сравнение между языками BML и PHP [95, 113].3.
Унифицированный метод разграничения прав доступа к данным. Предложен алгоритм комплексного распространения прав доступа на наборы и блоки. Применено наследование прав доступа и расставлен приоритет для групп. Предложенмеханизм авторизации пользователей [85, 90, 94].4. Унифицированный алгоритм приёма пользовательских данных с учётом их характерных особенностей. Предложен алгоритм приёма пользовательских данныхв зависимости от их характера: идемпотентные или модифицирующие. В данном160алгоритме показано, как именно обрабатываются неизменяемые данные, а такжекак производится приём данных модифицирующего запроса [79].5.
Декларативный язык программирования BML на основе формализованных методов. В нём определен порядок записи базовых сущностей методики BlockSetв исходном коде языка BML. Представлен обзор свойств и их значений для основных сущностей: модели, локации, блока и набора. Проведён подробный обзортипов блоков и их функциональных характеристик. Разработан перечень данных,передаваемых из интерпретатора в шаблонизатор [86, 91, 93].6. Алгоритм выбора релевантного объекта, идентифицируемого шаблоном. Представлен алгоритм поиска мощности множества у регулярного выражения с целью поиска оптимального шаблона и расстановки приоритетов у локаций. Рассмотрен способ преобразования регулярного выражения в конечные автоматы.Для вычисления мощности множества и устранения неопределённостей предлагается ряд методов: упрощение регулярного выражения, алгоритм вычисления впересекаемых множествах [92, 102].7.
Архитектура программного комплекса интерпретатора языка BML. Показанатехнологическая сторона построения интерпретатора языка BML. Проведён обзор динамических платформ, а также их нагрузочное тестирование. Показанасхема взаимодействия компонентов интерпретатора между собой. Представлены сравнительные характеристики синтаксических анализаторов XML. Детальнорассмотрена архитектура фабрики, задействованная в интерпретаторе при обработке логики работы блоков. Выбран шаблонизатор и показан алгоритм взаимодействия с ним. Обособлено внедрение в проект синхронизатора, показаныалгоритмы его работы с BML-документами, показан обзор методов межпроцессного взаимодействия [78, 89, 98, 100, 118].8. Нагрузочное тестирование компонентов интерпретатора. Проведено нагрузочноетестирование динамических платформ с целью выявления наиболее оптимальной и выбрана платформа FastCGI.