Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 467новых вакансий за сутки·93 721вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 267
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 129
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 865
  • iOS1 698
  • Fullstack вакансии989
  • AI вакансии949
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 660
  • Java6 550
  • Node.js2 020
  • .NET1 722
  • Kotlin1 619
  • Rust1 455
  • C#711
  • PHP683
  • C++572

DevOps и инфраструктура

  • Kubernetes7 769
  • DevOps вакансии6 056
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 250
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 141
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

Другие направления

  • Проджект-менеджер616
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 281
  • Вакансии в Европе23 875
  • Вакансии в Канаде4 475
  • Работа в России3 922

По формату

  • Удалённые вакансии75 035
  • Релокация в США44 281
  • Гибридная работа12 401
  • Офисная работа7 079

По уровню

  • Senior вакансии42 679
  • Middle вакансии20 894
  • Junior вакансии6 722

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме gRPC-GoВсе вопросы
gRPC-GoMiddleКодинг

Как работает propagation дедлайнов и таймаутов в gRPC-Go с помощью context?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

В gRPC-Go дедлайны передаются через context.WithDeadline/WithTimeout; фреймворк автоматически транслирует оставшееся время в HTTP/2-заголовок grpc-timeout, а все downstream-вызовы наследуют тот же ctx.

Propagation через цепочку сервисов

Ключевое правило: каждый промежуточный сервис обязан передавать полученный ctx в downstream-вызовы — и в другие RPC, и в запросы к базе данных. Если вместо этого создать новый независимый таймаут, сквозной бюджет теряется: downstream продолжает работу после того, как исходный клиент уже получил DEADLINE_EXCEEDED и ушёл.

// client.go
func callChain(addr string) error {
    // Полный бюджет на всю цепочку — 500 мс
    ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
    defer cancel()

    conn, _ := grpc.NewClient(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
    defer conn.Close()

    client := pb.NewUserServiceClient(conn)
    resp, err := client.GetUser(ctx, &pb.GetUserRequest{Id: "42"})
    if err != nil {
        // codes.DeadlineExceeded, если время вышло на любом hop
        return fmt.Errorf("GetUser: %w", err)
    }
    fmt.Println(resp.Name)
    return nil
}

// server.go — handler передаёт ctx дальше, не создаёт новый
func (s *server) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.User, error) {
    // ctx уже содержит дедлайн, переданный клиентом
    row, err := s.db.QueryContext(ctx, "SELECT name FROM users WHERE id = $1", req.Id)
    if err != nil {
        return nil, status.Errorf(codes.Internal, "db: %v", err)
    }
    defer row.Close()
    // ...
    return &pb.User{Name: name}, nil
}

Как context переносит дедлайн в gRPC-Go

В gRPC-Go каждый RPC-вызов принимает context.Context в качестве первого аргумента. Если в контексте есть дедлайн (установленный через context.WithDeadline или context.WithTimeout), транспортный уровень gRPC-Go автоматически вычисляет оставшееся время и передаёт его серверу в HTTP/2-псевдозаголовке grpc-timeout. Сервер восстанавливает дедлайн в собственном контексте запроса, и к моменту, когда handler начинает работу, ctx.Deadline() уже содержит корректное значение.

Разница между Deadline и Timeout

context.WithDeadline задаёт абсолютный момент времени (time.Time), context.WithTimeout — относительную длительность, которая внутри тоже превращается в time.Time. gRPC-Go всегда работает с абсолютным дедлайном: при передаче вниз по цепочке вызовов он вычитает уже потраченное время и отправляет оставшееся. Это гарантирует сквозной end-to-end budget.

Обработка ошибок дедлайна

Когда контекст истекает, gRPC-Go возвращает статус codes.DeadlineExceeded. Проверять его следует через пакет google.golang.org/grpc/status:

import (
    "google.golang.org/grpc/codes"
    "google.golang.org/grpc/status"
)

if st, ok := status.FromError(err); ok {
    if st.Code() == codes.DeadlineExceeded {
        log.Println("deadline exceeded, fast-fail")
    }
}

Отмена на стороне сервера

Если клиент закрывает соединение до завершения RPC, сервер получает сигнал через ctx.Done(). Handler должен периодически проверять канал и завершать работу, чтобы не тратить ресурсы на уже ненужный запрос:

select {
case <-ctx.Done():
    return nil, status.FromContextError(ctx.Err()).Err()
default:
}

Подводные камни

  • Создание нового context.WithTimeout на каждом hop вместо передачи исходного ctx — downstream может продолжать работу после того, как клиент уже получил ошибку.
  • Использование context.Background() для запросов к БД внутри handler — SQL-запросы не отменяются при дедлайне RPC, соединения зависают.
  • Игнорирование ctx.Done() в длинных циклах обработки — сервер продолжает работу после отмены клиентом, впустую тратя CPU и память.
  • Слишком короткий глобальный таймаут без учёта latency сети — частые DeadlineExceeded при нормальной нагрузке.
  • Отсутствие метрик по grpc_server_handling_seconds — невозможно понять, где именно бюджет тратится быстрее всего.
  • Путаница между codes.DeadlineExceeded и codes.Canceled: первый означает истёкший таймаут, второй — явную отмену клиентом; retry-стратегии для них разные.
  • Не установленный grpc.WithKeepaliveParams на клиенте — при долгих idle-соединениях HTTP/2-поток молча закрывается, и дедлайн срабатывает неожиданно.

Частые вопросы на собеседовании

  • Как работает аутентификация в gRPC? Как реализовать TLS и mutual TLS (mTLS)?
  • Как реализовать token-based аутентификацию (JWT) в gRPC с помощью metadata?
  • Как реализовать gRPC-сервер на Go?
  • Каковы четыре типа паттернов взаимодействия gRPC? Объясните unary, server streaming, client streaming и bidirectional streaming.

Типичные ошибки

  • Давать ответ про deadlines и timeouts через context в gRPC-Go только на уровне определения, не показывая поведение в реальном приложении.
  • Игнорировать границы ответственности вокруг темы «deadlines и timeouts через context в gRPC-Go»: кто отменяет работу, кто владеет ресурсом и где формируется ответ клиенту.
  • Не связывать deadlines и timeouts через context в gRPC-Go с observability, тестированием или безопасностью, когда это влияет на продакшен-поведение.

Что проверяет интервьюер

  • Точно объясняет, что именно делает deadlines и timeouts через context в gRPC-Go и где это используется в Go-коде.
  • Связывает deadlines и timeouts через context в gRPC-Go с корректным lifecycle запроса, отменой, конкурентностью или конфигурацией сервера там, где это уместно.
  • Не изобретает API и опирается на реальные контракты официальной документации.

Как вы знаете этот вопрос?

Проверить себя по теме gRPC-Go →

Источники

  • https://grpc.io/docs/guides/deadlines/
  • https://grpc.io/docs/languages/go/generated-code/
←Предыдущий вопросВ каких проектах gRPC-Go оправдан, а где он становится источником лишней сложности?Следующий вопрос→Как определить gRPC-сервис в файле `.proto`?

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

gRPC-GoCodingcontext-propagationreliability

Вакансии с этим навыком

  • Automation QA Engineer (Payments)