Что такое RPC
Что проверяют
Знаете ли вы, чем делают вызовы между сервисами в современном .NET, и отличаете ли наследие прежних поколений от того, что берут в новый сервис. Заодно смотрят, помните ли вы цену сетевого вызова.
Как отвечать
RPC это вызов метода чужого процесса как своего: код дёргает client.GetOrderAsync(request), а каркас сериализует аргументы, отправляет их по сети и разворачивает ответ.
Как это выглядит на платформе:
- gRPC основной вариант для нового кода: контракт в proto-файле, генерация клиента и сервера, транспорт поверх HTTP/2, потоки в обе стороны;
- WCF наследие систем с SOAP и net.tcp; для переноса на современную платформу есть CoreWCF, но новые сервисы на нём не начинают;
- SignalR тоже вызов методов по имени, но двусторонний и заточенный под подписки, а не под пару запрос-ответ;
- обычный HTTP API остаётся там, где клиент браузер или внешний партнёр.
Детали, которых ждут: GrpcChannel дорогой объект, его создают один раз и переиспользуют; отмена и срок ответа едут в CancellationToken и deadline; ошибки приходят как RpcException со StatusCode, и коды разбираются, а не просто пишутся в лог; сквозные задачи вроде логирования и авторизации закрываются перехватчиками.
Где спотыкаются
Создают канал на каждый вызов. Это заново соединение и рукопожатие TLS, а прежние каналы копятся; канал живёт долго и регистрируется в контейнере как singleton.
Зовут асинхронный клиент синхронно через .Result или .Wait(). В нагруженном сервисе это истощение пула потоков, а в приложениях с контекстом синхронизации ещё и взаимная блокировка.
Обещают gRPC прямо из браузера. Браузерный код не управляет кадрами HTTP/2 напрямую, поэтому нужен gRPC-Web и прокси на границе, либо отдельный HTTP API для публичного контура.