Deadlines, отмена, статусы ошибок, interceptors, metadata

↑ 5.2 gRPC · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Про надёжность вызовов: тайм-ауты по цепочке, коды ошибок и сквозные заголовки.

Объяснение

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.

Практика

  1. Задайте deadline на клиенте и проверьте DeadlineExceeded на медленном сервисе.
  2. Напишите interceptor, преобразующий доменные исключения в статусы.
  3. Пробросьте X-Correlation-Id через metadata.

Вопросы с ответами

Связанные темы