Определение синхронного и асинхронного в веб-приложениях - PullRequest
11 голосов
/ 12 мая 2011

Вопрос:

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

Почему?

Важное отличие:

Я работаю над API веб-службы.Он вызывается не браузерами (которые зависают при загрузке), а расширенными клиентами (которые в любом случае вызывают удаленные службы асинхронно) и сценариями (которые могут выполнять одну и ту же асинхронную уловку)

Мотивация:

Я хотел бы знать, потому что я пытаюсь принять решение относительно того, когда запрос должен быть сделан асинхронным, какова точка отсечения?Я работаю над веб-интерфейсом API, у которого есть запросы, которые занимают от 0,001 до 400 секунд (и везде между ними) в зависимости от запроса (не от параметров, а от фактического метода, который они вызывают).

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

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

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

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

1 Ответ

17 голосов
/ 12 мая 2011

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

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

Асинхронные запросы - это способ масштабирования до тысяч одновременно работающих пользователей.

, но это усложняет работу, выполняемую клиентами API

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

WebService.Call("someMethod" (data) -> {
   // do something when data returns.
});
...