Алгоритмы и задачи проектирования серверного программного обеспечения

Опубликовано в Технологии > Серверные технологии

8.1. Введение

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

8.2. Концептуальный алгоритм сервера

По сути, каждый сервер функционирует в соответствии со следующим простым алгоритмом: в нем создается сокет и выполняется привязка сокета к общепринятому порту, через который должны приниматься запросы. Затем сервер входит в бесконечный цикл, в котором он принимает очередной запрос, поступающий от клиента, обрабатывает этот запрос, формирует ответ и отправляет его клиенту.

К сожалению, этот несложный концептуальный алгоритм может непосредственно применяться для создания только самых простейших служб. Чтобы понять, с чем это связано, рассмотрим, например, службу передачи файлов, которой для выполнения запроса может потребоваться значительное время. Предположим, что первый клиент, обратившийся к серверу, затребовал передачу гигантского файла (например, 200 мегабайт), а второй клиент передал запрос на получение очень небольшого файла (например, 20 байт). Если сервер должен полностью закончить передачу первого файла, прежде чем приступить к передаче второго, то второму клиенту придется ждать получения своего небольшого файла неоправданно долгое время. Поскольку второй клиент запрашивает такой малый объем информации, он рассчитывает на то, что ответ сервера поступит немедленно. И действительно, большинство серверов быстро выполняют небольшие запросы, поскольку обладают способностью обрабатывать все запросы параллельно.

8.3. Сравнение параллельных и последовательных серверов

Мы используем термин последовательный сервер для описания сервера, выполняющего обработку одного запроса за другим, а термин параллельный сервер — для описания сервера, который обрабатывает сразу несколько запросов. По существу, в большинстве серверов не нужно применять какие-либо дополнительные средства для того, чтобы обеспечить одновременную обработку нескольких запросов. В них применяется так называемая параллельная обработка, обычно основанная на использовании нескольких потоков выполнения, при которой каждый поток обрабатывает отдельный запрос. Как будет показано ниже, вполне возможны и другие реализации параллельной работы; выбор конкретного метода зависит от прикладного протокола. В частности, если сервер выполняет небольшой объем обработки по сравнению с объемом выполняемых операций ввода/вывода, существует возможность реализовать такой сервер в виде единого потока выполнения, в котором используется асинхронный ввод/вывод для обеспечения одновременного применения нескольких каналов связи. При этом создается впечатление, что сервер обменивается данными сразу с несколькими клиентами одновременно.

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

Как правило, в отличие от последовательных серверов, при проектировании и разработке параллельных серверов приходится решать более трудные задачи, созданный в результате код намного сложнее, а его сопровождение требует больше усилий. Однако большинство программистов выбирают параллельные версии сервера, поскольку последовательные вызывают неоправданные задержки в работе распределенных приложений и могут создавать узкие места, снижающие производительность и негативно влияющие на работу многих клиентских приложений.

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