Перед проектированием очередного приложения или сервиса вам необходимо определиться с его архитектурным стилем, который должен соответствовать основным вариантам использования, ограничениям и нефункциональным требованиям. В мировой практике накопилась неплохая классификация, которую я хочу здесь привести. Под архитектурным стилем будем понимать некоторое высокоуровневое представление о крупных компонентах приложения или системы и взаимосвязях между ними. Цель идентификации архитектурного стиля - дать представление об общей организации и принципах работы приложения, а также реализация основных нефункциональных требований.
- Пакетная обработка данных
- Каждый из компонентов генерирует некий результат работы, который передается на последующую обработку другим компонентам решения
- Примеры: старые приложения, транзакционная обработка в финансовых приложениях.
- Объектно-ориентированный стиль
- Все компоненты решения представляют собой объекты, которые могут взаимодействовать друг с другом и размещаться в различных участках сети организации.
- Преимущества: удобное объектное представление компонентов системы, инкапсуляция деталей реализации объектов внутри каждого объекта.
- Организация по слоям
- Функциональность и структура приложения разложена по слоям, у каждого слоя есть своя зона ответственности и API, через который осуществляется взаимодействие. Каждый слой полностью инкапсулирует некоторую подсистему, доступ верхних слоев к нижележащим подсистемам осуществляется исключительно через API.
- Преимущества: хороший уровень абстракции, различные реализации слоев, унификация доступа через API.
- Примеры: операционные системы, виртуальные машины.
- Клиент-сервер
- Общая функциональность приложения вынесена на единый сервер, множество клиентов знают о способе подключения к серверу и используют общие ресурсы или алгоритмы.
- Преимущества: клиенты могут использовать мощности и ресурсы сервера, требуется обновление и обслуживание только одного центрального компонента.
- Примеры: приложения использующие RDBMS
- Конвейерная обработка данных (pipe and filters)
- Вся функциональность решения разделена между несколькими компонентами, обрабатывающими общий поток данных: трубы (pipes) перенаправляют потоки данных, выполняют роль коннекторов, фильтры (filters) преобразуют поток данных.
- Преимущества: повторное использование компонентов и изменение функциональности простой перекомпоновкой.
- Примеры: UNIX shell и большинство программ для UNIX, например, файл загружается с FTP и перенаправляется в архиватор, в итоге получаем загрузку файла с FTP сразу в архив.
- Системы основанные на правилах
- Приложение состоит из пользовательского интерфейса, подсистемы принятия решений и базы знаний с фактами и правилами
- Преимущества: помимо решения специфических задач, подобные системы поддаются легкому изменению поведения путем добавления или изменения фактов и правил.
- Публикация и подписка
- Одни компоненты приложения позволяют подписываться на свои события, другие - подписываются на эти события и выполняют необходимые действия.
- Преимущества: низкая связность компонентов приложения, хорошие возможности по масштабированию решения.
- Основанные на обмене сообщениями
- Взаимодействие между компонентами осуществляется исключительно посредством обмена сообщениями, отправляемыми в общую шину. Компоненты приложения не обязаны явно указывать адресатов, это ответственность шины.
- Преимущества: крайне низкая связность компонентов приложения, высокие показатели масштабируемости, соблюдение контрактов.
- Примеры: service oriented architecture (SOA)
- Одноранговые компоненты (peer-to-peer)
- Каждый компонент приложения выполняет общие функции и может передавать свое состояние другим компонентам. Полностью децентрализованное решение.
- Преимущества: высоконадежное решение в смысле бесперебойной работы, хорошо масштабируется, высокая степень утилизации ресурсов.
- Примеры: распределенные файловые хранилища
- Интерпретаторы
- Поведение приложения описано на некотором языке программирования, поведение программы интерпретируется во время исполнения.
- Преимущества: простая и быстрая модификация поведения, описание поведения через исходный код программы.
- Распределенные вычисления
- Компоненты приложения умеют распределять между собой общую вычислительную задачу и обмениваться промежуточными результатами.
- Преимущества: низкая стоимость владения решением, реализующим сложную вычислительную задачу.
- Примеры: расшифровка геномов, поиск внеземных цивилизаций.
Конечно, это довольно условная классификация и вы можете предложить свои варианты, оставив их к комментариях. Чаще всего крупные приложения реализуют смешанный (гетерогенный) архитектурный стиль.
|