Deadlines, отмена, статусы ошибок, interceptors, metadata
↑ 5.2 gRPC · ← Предыдущая · → Следующая
Зачем это на собесе
Про надёжность вызовов: тайм-ауты по цепочке, коды ошибок и сквозные заголовки.
Объяснение
Deadline — абсолютный момент времени, к которому вызов должен завершиться. Он передаётся по цепочке сервисов (в заголовке grpc-timeout), поэтому вся цепочка знает оставшееся время.
await client.GetOrderAsync(req, deadline: DateTime.UtcNow.AddSeconds(2));
// на сервере ctx.Deadline и ctx.CancellationToken; при вызове дальше передавайте ctx.CancellationToken| Status code | Когда |
|---|---|
| OK | успех |
| InvalidArgument | плохой запрос |
| NotFound / AlreadyExists | ресурс |
| PermissionDenied / Unauthenticated | доступ |
| DeadlineExceeded | вышел срок |
| Unavailable | сервис недоступен (можно ретраить) |
| Internal / Unknown | ошибка сервера |
| ResourceExhausted | лимиты |
Interceptors
Аналог middleware для gRPC:
public class LoggingInterceptor(ILogger<LoggingInterceptor> log) : Interceptor
{
public override async Task<TRes> UnaryServerHandler<TReq, TRes>(TReq req, ServerCallContext ctx, UnaryServerMethod<TReq, TRes> next)
{
try { return await next(req, ctx); }
catch (Exception ex) { log.LogError(ex, "{Method} failed", ctx.Method); throw; }
}
}Metadata
Заголовки вызова: Authorization, X-Correlation-Id, trace context. Читаются через ctx.RequestHeaders, отправляются через Metadata.
Ретраи настраиваются в ServiceConfig (RetryPolicy с кодами и бэкоффом) или через resilience handler.
Нюансы и подводные камни
- Без deadline вызов может висеть вечно: задавайте всегда.
- Ретраить можно только идемпотентные вызовы и коды
Unavailable. - Не передавайте внутренние детали исключений клиенту.
- Метаданные — строки в нижнем регистре; бинарные ключи заканчиваются на
-bin.
Практика
- Задайте deadline на клиенте и проверьте
DeadlineExceededна медленном сервисе. - Напишите interceptor, преобразующий доменные исключения в статусы.
- Пробросьте
X-Correlation-Idчерез metadata.
Вопросы с ответами
Что такое deadline?
Абсолютный срок завершения вызова; передаётся по цепочке, чтобы вложенные вызовы не превышали общий бюджет времени.
Что ретраить?
Идемпотентные операции при
Unavailable;InvalidArgument,NotFound— нет.