.Net GRPC, или мульти-стек в проекте
newsare.net
Продолжая делиться опытом про разработку сложных высоконагруженных систем, хочу написать про разработку второго голосового робота, которы.Net GRPC, или мульти-стек в проекте
Продолжая делиться опытом про разработку сложных высоконагруженных систем, хочу написать про разработку второго голосового робота, который стал крупным работающим проектом в масштабах страны.Начинали мы с нуля, с эскизов. Задача была реализовать систему, обладающую следующими функциональными и техническими требованиями:-поддержка разговора с абонентом в режиме реального времени-адаптация на высокую нагрузку + масштабируемость (тысячи одновременных звонков)-доп. фичи, в виде отправки расшифровки разговора абоненту, текстовые нотификации в телеграмм и прочее.В качестве основного технологического стека (именно под голосовую часть) была выбрана связка Asterisk + .Net (главным образом потому что у самого был такой опыт, те Asterisk не оспаривался а вот под стек для программного решения были споры), а для масштабируемости - микросервисная архитектура, в том числе со сложными сервисами-оркестраторами.Если кратко, описание решения выглядело примерно таким:-сервис управления состоянием звонка (Asterisk REST API + web-сокеты). Управление звонком и получение его стейта в режиме реального времени;-ряд сервисов по управлению непосредственно голосом: вывод TCP трафика, преобразование в GRPC, распознавание голоса, получение текстового ответа, синтезация ответа, отправка голоса обратно в канал (TCP). Итого, цепочка из ~ 7 сервисов с дуплексной передачей трафика;-ряд сервисов по сохранению результатов - параметров звонка, расшифровки, самой голосовой записи.Нас сильно подвела реализация .Net (6.0-7.0) GRPC, которая, как показала практика, не выдерживала нужных нам значений RPC. Если взять 1 звонок:-пакеты по 320 байт-каждые 20 мили секунд, или 50 раз в секунду (архитектура Asterisk)-дуплексная передача, итого Х2-работа сервиса в режиме прокси, еще Х2-500 одновременных звонков на 1 под в цепочкеИтого RPC = 5022* 500 = 10 тыс / сек , те кол-во сетевых операций чтения/записи GRPC пакетов..Net же показывал более-менее стабильные результаты до 50 звонков (те в 10 раз ниже ожидаемого). Далее начинались деградации (задержка времени между пакетами), которая накапливалась и доходила до неприличных 70 мсек (вместо 20). Читать далее Read more