Новое: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 источников: карьерные страницы компаний и джоб-борды.

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

Как прокидывать request id/correlation id через middleware?

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

Request ID генерируется middleware (встроенным или своим), кладётся в echo.Context через c.Set и в заголовок ответа X-Request-ID, затем прокидывается в context.Context для использования в сервисах и логере.

1. Встроенный middleware RequestID

package main

import (
	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
)

func main() {
	e := echo.New()

	e.Use(middleware.RequestIDWithConfig(middleware.RequestIDConfig{
		Generator: func() string {
			return "req-" + echo.MustGetRequestID()
		},
		RequestIDHandler: func(c echo.Context, id string) {
			// Дополнительная обработка после генерации
			c.Set("requestID", id)
		},
		TargetHeader: echo.HeaderXRequestID, // "X-Request-ID"
	}))

	e.Logger.Fatal(e.Start(":8080"))
}

Request ID / Correlation ID в Echo

Request ID нужен для сквозной трассировки запроса через все слои: middleware, хендлер, сервис, репозиторий, внешние вызовы. Стандартная схема: middleware генерирует (или берёт из заголовка) ID, кладёт его в echo.Context и в context.Context, а логер достаёт его из контекста при каждой записи.

2. Кастомный middleware с прокидыванием в context.Context

package middleware

import (
	"context"

	"github.com/google/uuid"
	"github.com/labstack/echo/v4"
)

type contextKey string

const RequestIDKey contextKey = "requestID"

func RequestID() echo.MiddlewareFunc {
	return func(next echo.HandlerFunc) echo.HandlerFunc {
		return func(c echo.Context) error {
			// Берём из входящего заголовка или генерируем новый
			id := c.Request().Header.Get(echo.HeaderXRequestID)
			if id == "" {
				id = uuid.New().String()
			}

			// Кладём в echo.Context для хендлеров
			c.Set(string(RequestIDKey), id)

			// Кладём в context.Context для сервисов
			req := c.Request().WithContext(
				context.WithValue(c.Request().Context(), RequestIDKey, id),
			)
			c.SetRequest(req)

			// Прокидываем в ответ
			c.Response().Header().Set(echo.HeaderXRequestID, id)

			return next(c)
		}
	}
}

// Хелпер для извлечения из context.Context
func GetRequestID(ctx context.Context) string {
	if id, ok := ctx.Value(RequestIDKey).(string); ok {
		return id
	}
	return ""
}

3. Интеграция со структурированным логером (zerolog)

package main

import (
	"github.com/rs/zerolog"
	"github.com/rs/zerolog/log"
	"myapp/middleware"
)

func someService(ctx context.Context) {
	requestID := middleware.GetRequestID(ctx)
	log.Ctx(ctx).Info().
		Str("request_id", requestID).
		Msg("processing request")
}

// Или настроить zerolog так, чтобы request_id автоматически
// добавлялся из контекста через zerolog.Ctx(ctx)
func setupLogger(ctx context.Context, requestID string) context.Context {
	logger := zerolog.Ctx(ctx).With().
		Str("request_id", requestID).
		Logger()
	return logger.WithContext(ctx)
}

4. Прокидывание в исходящие HTTP-запросы

func callExternalAPI(ctx context.Context, url string) (*http.Response, error) {
	req, _ := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
	req.Header.Set("X-Request-ID", middleware.GetRequestID(ctx))
	req.Header.Set("X-Correlation-ID", middleware.GetRequestID(ctx))
	return http.DefaultClient.Do(req)
}

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

  • Брать ID только из входящего заголовка без генерации запасного — при его отсутствии строка окажется пустой во всех логах.
  • Доверять значению X-Request-ID от клиента без валидации — возможно внедрение произвольных строк в логи (log injection).
  • Класть ID только в echo.Context, но не в context.Context — сервисный слой, не знающий об Echo, не сможет его получить.
  • Не добавлять ID в заголовок ответа — клиент не сможет сопоставить ошибку с конкретным запросом в логах.
  • Использовать math/rand вместо crypto/rand или UUID — коллизии при высокой нагрузке.
  • Не прокидывать ID во внешние HTTP-вызовы — трассировка обрывается на границе сервиса.
  • Регистрировать middleware RequestID после Logger — логер запишет запрос без ID, если стоит раньше в цепочке.

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

  • В каких backend-проектах Echo (Go framework) является сильным выбором, а где лучше выбрать более простой или другой стек?
  • Как реализовать middleware JWT-аутентификации в Echo?
  • Как Echo обрабатывает CORS и как его настроить?
  • Как настроить TLS/HTTPS в Echo?

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

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

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

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

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

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

Источники

  • https://echo.labstack.com/docs
  • https://echo.labstack.com/docs/routing

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

Echoechoecho-productionrisk-analysistechnical-depth