2

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

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

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

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

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

+0

Сколько запросов будет выполняться одновременно? Или, сколько запросов в секунду вам нужно будет обслуживать и сколько времени они возьмут? – usr

+0

В самый загруженный период (продажа) типичная нагрузка будет равна 2700 уникальных запросов за 5 мин или около 500 в минуту. В любой момент во время этой продажи мы ожидаем 170 одновременных пользователей в Интернете. Что касается времени, которое они берут, то в основном это страница инвентаризации, где пользователи будут видеть самые обновленные ресурсы, поэтому его просто операция чтения базы данных над API, возвращенные записи будут в области 150 за звонок. Извините, если это не ответит на ваш вопрос. Спасибо –

ответ

1

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

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

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

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

.

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

//... 

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

Оба одинаково безопасны и эффективны. Не делайте ошибку, чтобы думать, что асинхронный ввод-вывод заставляет ваши IO стать быстрее.

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

+0

Спасибо за ваш ответ. Имеет смысл. У меня есть реализация автоматического выключателя поверх этого вызова API, тайм-аута и порога, которые мы настраиваем во время onload для разумного числа. Любые мысли о том, как обращаться с пользовательским интерфейсом, пока я жду запросов? Какую стратегию я мог бы использовать?Скажите, что пользователь применяет несколько фильтров на странице инвентаризации, а часть рабочего процесса заключается в том, что фильтры применяются к последнему набору данных. В этих сценариях, как я обрабатываю асинхронные вызовы? –

+0

Я не вижу конкретной проблемы, с которой вы сталкиваетесь. Почему пользовательский интерфейс требует специальной обработки в случае перегрузки? Показать ошибку. – usr

Смежные вопросы