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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python16 417
  • Облачные технологии13 174
  • QA вакансии3 433
  • Backend вакансии2 035
  • Инженер данных1 666
  • Продакт-менеджер1 162

Разработка

  • Android1 816
  • iOS1 666
  • AI вакансии937
  • Fullstack вакансии892
  • Frontend вакансии717
  • Mobile вакансии38

По стеку

  • Go8 561
  • Java6 090
  • Node.js1 889
  • Kotlin1 554
  • .NET1 545
  • Rust1 432
  • PHP640
  • C#562
  • C++498

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

  • Kubernetes7 303
  • DevOps вакансии5 594
  • Linux-инфраструктура5 291
  • Terraform / IaC4 014
  • CI/CD2 557
  • Мониторинг и Observability1 735
  • SRE548
  • Кибербезопасность398

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

  • Data Scientist1 033
  • Бизнес-аналитик868
  • Аналитик данных829
  • Системный аналитик134

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

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

По регионам

  • Вакансии в США44 779
  • Вакансии в Европе21 327
  • Вакансии в Канаде4 450
  • Работа в России3 877

По формату

  • Удалённые вакансии73 902
  • Релокация в США44 794
  • Гибридная работа11 412
  • Офисная работа6 956

По уровню

  • Senior вакансии41 197
  • Middle вакансии20 361
  • Junior вакансии6 638

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

Все компании
  • Wise194 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab136 вакансий
  • Celonis45 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

Как реализовать graceful shutdown gRPC-сервера на Go?

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

Вызовите GracefulStop() после получения SIGTERM — метод дожидается завершения активных RPC. Добавьте таймаут с fallback на Stop() и переводите health-статус в NOT_SERVING до начала shutdown.

Базовая реализация

package main

import (
	"context"
	"log"
	"net"
	"os"
	"os/signal"
	"syscall"
	"time"

	"google.golang.org/grpc"
	pb "example.com/myservice"
)

func main() {
	lis, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	srv := grpc.NewServer()
	pb.RegisterMyServiceServer(srv, &myServiceImpl{})

	// Запуск в фоне
	go func() {
		if err := srv.Serve(lis); err != nil {
			log.Printf("server stopped: %v", err)
		}
	}()

	// Ожидание SIGINT / SIGTERM
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit
	log.Println("shutdown signal received")

	// GracefulStop ждёт завершения активных RPC
	doneCh := make(chan struct{})
	go func() {
		srv.GracefulStop()
		close(doneCh)
	}()

	// Таймаут на graceful shutdown
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	select {
	case <-doneCh:
		log.Println("graceful shutdown complete")
	case <-ctx.Done():
		log.Println("shutdown timeout, forcing stop")
		srv.Stop()
	}
}

Graceful Shutdown gRPC-сервера на Go

Graceful shutdown означает: сервер перестаёт принимать новые соединения и запросы, дожидается завершения уже активных RPC-вызовов и только после этого освобождает ресурсы. В gRPC-Go это реализуется методом GracefulStop().

Разница между GracefulStop и Stop

  • GracefulStop() — закрывает listener, ждёт завершения всех активных RPC, затем закрывает соединения.
  • Stop() — немедленно закрывает все соединения, прерывает активные RPC с кодом Unavailable.

Обработка streaming RPC при shutdown

Долгоживущие стримы могут заблокировать GracefulStop() на неопределённое время. Правильный подход — слушать закрытие контекста стрима внутри хендлера:

func (s *myServiceImpl) StreamData(
	req *pb.Request,
	stream pb.MyService_StreamDataServer,
) error {
	for {
		select {
		case <-stream.Context().Done():
			// Клиент отменил или сервер завершает работу
			return stream.Context().Err()
		case data := <-s.dataCh:
			if err := stream.Send(data); err != nil {
				return err
			}
		}
	}
}

Интеграция с health checking во время shutdown

До вызова GracefulStop() следует перевести health-статус в NOT_SERVING, чтобы load balancer прекратил слать трафик:

import "google.golang.org/grpc/health"
import "google.golang.org/grpc/health/grpc_health_v1"

healthSrv := health.NewServer()
grpc_health_v1.RegisterHealthServer(srv, healthSrv)
healthSrv.SetServingStatus("", grpc_health_v1.HealthCheckResponse_SERVING)

// При shutdown:
healthSrv.SetServingStatus("", grpc_health_v1.HealthCheckResponse_NOT_SERVING)
time.Sleep(5 * time.Second) // ждём, пока LB увидит статус
srv.GracefulStop()

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

  • GracefulStop() блокируется навсегда, если хотя бы один streaming RPC не завершается — обязательно нужен таймаут с fallback на Stop().
  • Без перевода health-статуса в NOT_SERVING перед shutdown load balancer продолжает слать трафик ещё несколько секунд после начала остановки.
  • signal.Notify требует буферизованного канала (размер >= 1), иначе сигнал может быть потерян.
  • Если хендлеры не проверяют ctx.Done(), они не узнают о shutdown и продолжают работу.
  • Множественный вызов GracefulStop() или Stop() не является thread-safe — вызывайте только один раз из одной горутины.
  • В Kubernetes SIGTERM приходит, но pod продолжает получать трафик ещё несколько секунд — добавляйте preStop sleep в lifecycle hook.
  • Не закрытый вручную listener до GracefulStop() не является проблемой — GracefulStop() закрывает его сам.

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

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

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

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

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

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

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

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

Источники

  • https://grpc.io/docs/guides/server-graceful-stop/
  • https://pkg.go.dev/google.golang.org/grpc
←Предыдущий вопросКак обрабатывать большие payload в gRPC и каковы ограничения на размер сообщений?Следующий вопрос→Как реализовать health checking в gRPC с использованием стандартного протокола проверки работоспособности?

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

gRPC-GoCodingoperationsreliability

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

  • Automation QA Engineer (Payments)