расчетная программа которая получая данные из очереди выполняет расчеты. Однопоточная и одновременно не может выполнить несколько расчетов. Есть веб сервис которая принимает запросы и добавляет в очередь. Как только программа выполнить расчет обратно в очередь отправляет результаты. В такой схеме можно запустить куча расчетных программ и таким образом можно обеспечить "параллельную обработку запросов". На стороне веба стоит SignalR и вся схема работает. Но тут клиент требует чтобы был rest и получить ответ одним запросом. Как это можно сделать?
ну тоже самое что у тебя если малой кровью но внезапно твой реквест начинает ждать шину на наличие ответа после засылки данных.
спасибо но не могли бы подробнее объяснить? я не понял.
В контроллере, который обрабатывает приём запроса, положить работу в очередь и затем повиснуть на каком-нибудь SemaphoreSlim, который логически будет привязан к этой работе. Когда работа будет завершена сделать семафору Release, чтобы "поток" (в кавычках, потому что я очень не рекомендую тут отказываться от async/await) контроллера мог продолжить, вытащить результат и отправить его клиенту. Аккуратно с таймаутами - если выполнение затянется слишком надолго, то браузер и/или сервер могут прервать запрос и возвращать результат будет уже некому
с таймаутом думаю если ответ придется долго ждать то можно отправить 102. спасибо!
Я бы посмотрел в сторону TaskCompletionSource. Имхо, это логичнее, да и должно быть производительнее, чем на блокировке висеть
если у тебя есть стастика ответа то можно держать в разумных пределах. а так побольше косумеров и понеслась
Ну, общий концепт я донёс =) А у SemamphoreSlim есть асинхронные Wait, так что там не совсем блокировка
по этому и спрашиваю! насколько "разумно" это сделать. при увеличении количества запросов последним клиентам придется долго ждать.
Меня больше смущает, что что-то не может быть сделано параллельно. Почему? На это есть объективные непреодолимые причины кроме "лень делать синзронизацию на уязвимых местах"?
я тебе и ответил что малой кровью так на текущую инфраструктуру...можно конечно кардинально менять код но тут надо больше инфы
вы имеете в виду в расчетной программе? у меня нет исходников и программа достаточно сложная чтобы сделать свою. там куча логики всякого.
Сейчас посмотрел, там lock под капотом используется для возврата таски)
Позвать программу несколько раз? Просто всё одноядерное БУДЕТ потом узким местом в производительности на сколько-нибудь значительной нагрузке.
Обсуждают сегодня