Асинхронное и горизонтальное масштабирование
Я работаю на клиенте.net, который использует API REST (JSON). Клиент - это веб-приложение с большим трафиком и значительным взаимодействием с пользователем.
Когда я пишу обертки вокруг внешнего REST API, я пытаюсь решить,
Если я должен сделать все вызовы, сделанные для асинхронного API? Это будет весь путь от пользовательского интерфейса до API, как описано здесь http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html. Это поможет мне в достижении желаемой производительности, но мне нужно будет найти способ обработки пользовательского интерфейса, когда задачи ожидают завершения
Или это перебор? И я просто использую синхронизирующий / последовательный код? Я все еще могу получить (некоторую) производительность путем горизонтального масштабирования приложения?
Мне интересно понять, каков предпочтительный способ вызова внешнего REST API от клиента (если есть) и как обрабатывается пользовательский интерфейс в тех случаях, когда люди используют асинхронный режим?
1 ответ
Таким образом, у вас есть около 10 запросов в секунду в период занятости. Это само по себе не требует асинхронного ввода-вывода. Предполагая 1 сек на запрос, это 10 потоков. 10 потоков - это ничто.
Однако есть один особый случай: что, если вызываемый вами серверный сервис иногда занимает много времени (ошибка, перегрузка, перестроение индекса, ...)? Если для ответа или тайм-аута требуется 30 секунд, это означает, что 300 запросов находятся в полете. Это слишком много для настроек пула потоков по умолчанию. Это эффективно закроет все приложение при исчерпании пула, пока запросы не будут очищены.
Вы можете сделать две вещи:
- Используйте асинхронный ввод-вывод для всех действий большого объема.
- Сократите время ожидания и установите прерыватель нагрузки для количества запросов в полете. Пример:
,
SemaphoreSlim sem = new SS(50); //max 50 in-flight
//...
if (!sem.WaitOne(TimeSpan.Zero))
throw new Exception("Load limit exceeded");
Оба одинаково безопасны и хорошо работают. Не думайте, что асинхронный ввод-вывод приводит к ускорению ваших операций ввода-вывода.
Семафорное решение требует меньше архитектурных изменений, но требует разрешения для отбрасывания запросов. Эти запросы не были бы выполнены в любом случае с высокой вероятностью.