Как сервер обрабатывает запросы веб-служб от нескольких клиентов

Я только что завершила Android приложение, которое использует веб-сервисы для подключения к удаленной базе данных. Я работал на localhost.

теперь я планирую разместить свои веб-службы на сервере. Предположим, у меня есть приложение для Android, установленное на любом количестве различных клиентских смартфонов. Каждый пользователь смартфона одновременно вызывает веб-службу.

теперь, как сервер обрабатывает эти запросы? Выполняет ли он один поток на запрос? Я хочу знать о сервере обработка в деталях. Учитывая, что все телефоны используют GPRS, будет ли какая-либо задержка в такой ситуации?

кстати, все мои веб-службы основаны на SOAP, и сервер, который я планирую использовать позже, будет SQL Server. Я использовал .NET framework для создания веб-служб.

3 ответов


его для общей концепции, а не для конкретного Android

обычно каждый из пользователей отправляет HTTP-запрос для страницы. Сервер получает запросы и делегирует их различным работникам (процессам или потокам).

в зависимости от заданного URL-адреса, сервер считывает файл и отправляет его обратно пользователю. Если файл является динамическим файлом, таким как файл PHP, файл выполняется до его отправки обратно пользователю.

Как только запрошенный файл был отправили обратно, сервер обычно закрывает соединение через несколько секунд.

посмотреть Как Работают Веб-Серверы

EDIT:

для HTTP использует TCP, который является протоколом на основе соединения. То есть клиенты устанавливают TCP-соединение во время связи с сервером.

нескольким клиентам разрешено одновременно подключаться к одному порту назначения на одном компьютере назначения. Сервер просто открывается несколько одновременных подключений.

Apache (и большинство других HTTP-серверов) имеют многопроцессорный модуль (MPM). Это отвечает за выделение потоков/процессов Apache для обработки соединений. Затем эти процессы или потоки могут работать параллельно на своем собственном соединении, не блокируя друг друга. MPM Apache также имеет тенденцию держать открытыми "запасные" потоки или процессы, даже если соединения не открыты, что помогает ускорить последующие запросы.

Примечание:

одной из наиболее распространенных проблем с многопоточностью является "состояние гонки"-- где вы два запроса делают то же самое ("гонки", чтобы сделать то же самое), если это один ресурс, один из них собирается выиграть. Если они оба вставляют запись в базу данных, они не могут получить один и тот же идентификатор-один из них выиграет. Поэтому вам нужно быть осторожным при написании кода, чтобы понять, что другие запросы продолжаются В то же время время и может изменять вашу базу данных, записывать файлы или изменять глобалы.


сервер будет поддерживать пул потоков для прослушивания входящих запросов. После получения запроса поток обработает запрос и вернет ответ. Если все запросы получены одновременно и их меньше максимального количества потоков в пуле, все они будут службами параллельно (хотя фактическая обработка будет чередоваться на основе количества ядер/процессоров). Если Запросов больше, чем потоков, запрос будет помещен в очередь (ожидание соединение), пока не освободится поток или не истечет время ожидания запроса клиента.

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


ваш вопрос на самом деле не связан с Android, но с мобильной разработкой с веб-бэкэндом.

Я не знаю, как использовать .NET для разработки серверных приложений, но если вы возьмете пример Apache/PHP/MySQL, каждый запрос запускается в отдельном потоке.

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

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

надеюсь, что это поможет !