Асинхронное и горизонтальное масштабирование

Я работаю на клиенте.net, который использует API REST (JSON). Клиент - это веб-приложение с большим трафиком и значительным взаимодействием с пользователем.

Когда я пишу обертки вокруг внешнего REST API, я пытаюсь решить,

  1. Если я должен сделать все вызовы, сделанные для асинхронного API? Это будет весь путь от пользовательского интерфейса до API, как описано здесь http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html. Это поможет мне в достижении желаемой производительности, но мне нужно будет найти способ обработки пользовательского интерфейса, когда задачи ожидают завершения

  2. Или это перебор? И я просто использую синхронизирующий / последовательный код? Я все еще могу получить (некоторую) производительность путем горизонтального масштабирования приложения?

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

1 ответ

Решение

Таким образом, у вас есть около 10 запросов в секунду в период занятости. Это само по себе не требует асинхронного ввода-вывода. Предполагая 1 сек на запрос, это 10 потоков. 10 потоков - это ничто.

Однако есть один особый случай: что, если вызываемый вами серверный сервис иногда занимает много времени (ошибка, перегрузка, перестроение индекса, ...)? Если для ответа или тайм-аута требуется 30 секунд, это означает, что 300 запросов находятся в полете. Это слишком много для настроек пула потоков по умолчанию. Это эффективно закроет все приложение при исчерпании пула, пока запросы не будут очищены.

Вы можете сделать две вещи:

  1. Используйте асинхронный ввод-вывод для всех действий большого объема.
  2. Сократите время ожидания и установите прерыватель нагрузки для количества запросов в полете. Пример:

,

SemaphoreSlim sem = new SS(50); //max 50 in-flight

//...

if (!sem.WaitOne(TimeSpan.Zero))
 throw new Exception("Load limit exceeded");

Оба одинаково безопасны и хорошо работают. Не думайте, что асинхронный ввод-вывод приводит к ускорению ваших операций ввода-вывода.

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

Другие вопросы по тегам