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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

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

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

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

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

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

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

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

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

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Как настроить таймауты для обработчиков Gin?

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

Настраивайте ReadTimeout/WriteTimeout на уровне http.Server; для per-handler таймаутов используйте context.WithTimeout, передавая его в c.Request.Context(); для принудительного прерывания хендлера — middleware с goroutine и select.

Уровень 1: Таймауты http.Server

Это базовая защита от медленных клиентов и зависших соединений:

srv := &http.Server{
	Addr:         ":8080",
	Handler:      router,
	ReadTimeout:  5 * time.Second,  // время на чтение всего запроса (заголовки + тело)
	WriteTimeout: 10 * time.Second, // время на запись ответа
	IdleTimeout:  120 * time.Second, // keep-alive соединения
	ReadHeaderTimeout: 2 * time.Second, // только заголовки
}

Важно: WriteTimeout отсчитывается от конца чтения запроса до конца записи ответа — он ограничивает всё время выполнения хендлера.

Таймауты для обработчиков Gin

Gin не имеет встроенного механизма таймаутов для хендлеров. Таймауты настраиваются на нескольких уровнях: TCP-соединение, HTTP-запрос и конкретный хендлер. Каждый уровень решает разные проблемы.

Уровень 2: context.WithTimeout в хендлере

Для ограничения времени конкретной операции (DB-запрос, HTTP-вызов) используйте контекст с дедлайном:

func getProductHandler(c *gin.Context) {
	// Даём 3 секунды на весь хендлер
	ctx, cancel := context.WithTimeout(c.Request.Context(), 3*time.Second)
	defer cancel()

	// Передаём контекст в DB-запрос
	var product Product
	err := db.WithContext(ctx).First(&product, c.Param("id")).Error
	if err != nil {
		if errors.Is(err, context.DeadlineExceeded) {
			c.JSON(http.StatusGatewayTimeout, gin.H{"error": "database timeout"})
			return
		}
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}
	c.JSON(http.StatusOK, product)
}

Уровень 3: Middleware для принудительного таймаута хендлера

Если хендлер не использует контекст (legacy код), можно принудительно прервать его через middleware с горутиной:

func TimeoutMiddleware(timeout time.Duration) gin.HandlerFunc {
	return func(c *gin.Context) {
		// Создаём контекст с таймаутом
		ctx, cancel := context.WithTimeout(c.Request.Context(), timeout)
		defer cancel()

		// Подменяем контекст запроса
		c.Request = c.Request.WithContext(ctx)

		// Канал для сигнала завершения хендлера
		finished := make(chan struct{}, 1)

		go func() {
			c.Next()
			finished <- struct{}{}
		}()

		select {
		case <-finished:
			// Хендлер завершился вовремя
		case <-ctx.Done():
			// Таймаут истёк
			c.AbortWithStatusJSON(http.StatusGatewayTimeout, gin.H{
				"error": "request timeout",
			})
		}
	}
}

// Регистрация:
router.Use(TimeoutMiddleware(5 * time.Second))

Таймауты для исходящих HTTP-запросов

Не забывайте про таймауты при вызове внешних сервисов — дефолтный http.Client не имеет таймаута:

httpClient := &http.Client{
	Timeout: 5 * time.Second,
	Transport: &http.Transport{
		DialContext: (&net.Dialer{
			Timeout:   2 * time.Second, // TCP connect
			KeepAlive: 30 * time.Second,
		}).DialContext,
		TLSHandshakeTimeout:   3 * time.Second,
		ResponseHeaderTimeout: 3 * time.Second,
	},
}

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

  • WriteTimeout меньше времени выполнения хендлера — если хендлер работает дольше WriteTimeout, соединение будет разорвано, но хендлер продолжит выполнение в фоне; используйте контекст для ранней отмены.
  • Middleware с горутиной — race condition — горутина хендлера может продолжить писать в c.Writer после того, как middleware написал 504; используйте c.Abort() и проверяйте c.IsAborted().
  • context.WithTimeout не прерывает блокирующие системные вызовы — если хендлер делает блокирующий вызов без контекста (например, time.Sleep), отмена контекста его не остановит.
  • Утечка горутин при таймауте — горутина хендлера продолжает работать после таймаута; убедитесь, что все операции принимают контекст и корректно на него реагируют.
  • ReadTimeout слишком мал для загрузки файлов — ReadTimeout включает время чтения тела; для эндпоинтов загрузки файлов используйте отдельный http.Server с большим таймаутом или сбрасывайте дедлайн через conn.SetDeadline.
  • Не передан контекст в database driver — таймаут сработает в вашем коде, но запрос к БД продолжит выполняться; всегда передавайте контекст через db.WithContext(ctx).
  • IdleTimeout vs ReadTimeout — IdleTimeout относится к keep-alive соединениям между запросами; без него зависшие keep-alive соединения накапливаются и исчерпывают файловые дескрипторы.

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

  • В каких backend-проектах Gin (Go framework) является сильным выбором, а где лучше выбрать более простой или другой стек?
  • Что такое система валидации Gin и как использовать struct tags для валидации входных данных?
  • Как писать unit-тесты для Gin-обработчиков с помощью httptest?
  • Как реализовать middleware аутентификации (JWT) в Gin?

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

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

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

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

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

Проверить себя по теме Gin →

Источники

  • https://gin-gonic.com/en/docs/server-config/context/
  • https://gin-gonic.com/en/docs/server-config/custom-http-config/
←Предыдущий вопросКаковы распространённые проблемы в продакшене при использовании Gin и как их избежать?Следующий вопрос→Как разделить состояние (например, соединение с базой данных) между обработчиками Gin?

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

Gincontext-propagationGINreliabilitysystem-design

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

  • Automation QA Engineer (Payments)