Даже из столь абстрактного описания логики игры можно сделать выводы о том, что архитектура приложения должна представлять собой несколько компонентов, взаимодействующих между собой в сети. Вот основные характеристики задачи, которые являются аргументами в пользу сетевого решения:
у приложения несколько пользователей, работающих с общими данными (игровым полем), т. е. в задаче требуется многопользовательский доступ к общим данным;
всю задачу можно разделить на относительно независимые подзадачи (ход игрока, решение о принятии или непринятии хода, ведение счета очков т. п.), которые могут выполняться параллельно или последовательно (по очереди);
каждая из выделенных подзадач — это отдельный компонент приложения;
каждый компонент может выполняться на отдельном вычислительном узле в сети, при этом некоторые компоненты могут быть объединены на одном узле сети, т. е. приложение может быть распределено по узлам сети.
Таким образом, наше приложение имеет
многокомпонентную,
или так называемую
многоуровневую
архитектуру. Для таких задач типичным решением бывает обычно
двух-
или
трехуровневая
архитектура, когда приложение состоит из двух или трех типов взаимодействующих компонентов, среди которых выделяются: "обслуживающие" и "потребляющие" компоненты (серверы и клиенты). Серверный компонент может обслуживать от одного до нескольких клиентов одновременно. При необходимости вводят третий тип компонента — "промежуточный" серверный компонент между клиентским компонентом и основным серверным компонентом, чтобы разгрузить слишком нагруженный логикой обработки данных основной серверный компонент.
Замечание
Большее количество уровней встречается реже, обычно в области специализированных сетевых и коммуникационных задач.
Описанную архитектуру называют
клиент-серверной.
Наше приложение имеет такую архитектуру. Его разделение на компоненты выглядит следующим образом:
Серверный компонент — игровое поле, которое является общим ресурсом приложения, вместе