Определение синхронного и асинхронного в веб-приложениях

Вопрос:

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

Почему?

Важное различие:

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

Мотивация:

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

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

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

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

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

Ответ 1

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

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

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

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

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

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