Новое: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-GoSeniorПроектирование систем

Как сопоставить gRPC status codes с HTTP status codes при использовании gateway?

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

gRPC статусы маппируются в HTTP по стандартной таблице: NOT_FOUND=404, UNAUTHENTICATED=401, PERMISSION_DENIED=403, UNAVAILABLE=503, RESOURCE_EXHAUSTED=429. grpc-gateway применяет маппинг автоматически через runtime.HTTPStatusFromCode.

Реализация через grpc-gateway

grpc-gateway автоматически применяет этот маппинг, но его можно переопределить через кастомный ServeMuxOption:

import (
	"net/http"
	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

func customErrorHandler(
	ctx context.Context,
	mux *runtime.ServeMux,
	marshaler runtime.Marshaler,
	w http.ResponseWriter,
	r *http.Request,
	err error,
) {
	st := status.Convert(err)

	httpCode := runtime.HTTPStatusFromCode(st.Code())

	// Кастомизация: FAILED_PRECONDITION -> 422 Unprocessable Entity
	if st.Code() == codes.FailedPrecondition {
		httpCode = http.StatusUnprocessableEntity
	}

	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(httpCode)

	body, _ := marshaler.Marshal(map[string]interface{}{
		"code":    st.Code().String(),
		"message": st.Message(),
		"details": st.Details(),
	})
	w.Write(body)
}

mux := runtime.NewServeMux(
	runtime.WithErrorHandler(customErrorHandler),
)

Маппинг gRPC Status Codes в HTTP Status Codes

При использовании gRPC-Gateway или любого другого HTTP-to-gRPC транслятора необходимо корректно преобразовывать gRPC-коды ошибок в HTTP-статусы. Google определил официальную таблицу соответствия, которую реализует пакет google.golang.org/grpc/codes.

Официальная таблица маппинга

  • OK (0) → 200 OK
  • CANCELLED (1) → 499 Client Closed Request
  • UNKNOWN (2) → 500 Internal Server Error
  • INVALID_ARGUMENT (3) → 400 Bad Request
  • DEADLINE_EXCEEDED (4) → 504 Gateway Timeout
  • NOT_FOUND (5) → 404 Not Found
  • ALREADY_EXISTS (6) → 409 Conflict
  • PERMISSION_DENIED (7) → 403 Forbidden
  • RESOURCE_EXHAUSTED (8) → 429 Too Many Requests
  • FAILED_PRECONDITION (9) → 400 Bad Request
  • ABORTED (10) → 409 Conflict
  • OUT_OF_RANGE (11) → 400 Bad Request
  • UNIMPLEMENTED (12) → 501 Not Implemented
  • INTERNAL (13) → 500 Internal Server Error
  • UNAVAILABLE (14) → 503 Service Unavailable
  • DATA_LOSS (15) → 500 Internal Server Error
  • UNAUTHENTICATED (16) → 401 Unauthorized

Использование runtime.HTTPStatusFromCode

import "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"

// Получение HTTP-кода из gRPC-кода
httpStatus := runtime.HTTPStatusFromCode(codes.NotFound) // 404
httpStatus = runtime.HTTPStatusFromCode(codes.Unauthenticated) // 401
httpStatus = runtime.HTTPStatusFromCode(codes.ResourceExhausted) // 429

Передача деталей ошибки через status.Details

import (
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
	"google.golang.org/genproto/googleapis/rpc/errdetails"
)

func (s *server) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.User, error) {
	st := status.New(codes.AlreadyExists, "user already exists")
	st, _ = st.WithDetails(&errdetails.ErrorInfo{
		Reason: "USER_ALREADY_EXISTS",
		Domain: "myservice.example.com",
	})
	return nil, st.Err()
}
// HTTP: 409 Conflict + JSON с details

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

  • CANCELLED маппируется в 499 — нестандартный код nginx; некоторые клиенты его не понимают. Рассмотрите переопределение на 400 или 503.
  • FAILED_PRECONDITION и OUT_OF_RANGE оба маппируются в 400 — это семантически разные ошибки; часто нужно переопределять на 422.
  • Не используйте INTERNAL для валидационных ошибок — клиент получит 500 и не поймёт, что запрос неверный.
  • grpc-gateway по умолчанию не включает details в JSON-ответ без кастомного marshaler — добавьте явно.
  • HTTP/1.1 клиенты не получают gRPC-трейлеры с кодами ошибок — весь маппинг должен идти через HTTP status code.
  • Код UNAUTHENTICATED → 401, а не 403 (403 = PERMISSION_DENIED) — частая путаница при проектировании API.
  • При использовании Envoy как gateway маппинг может отличаться от grpc-gateway — сверяйтесь с документацией конкретного proxy.
  • DEADLINE_EXCEEDED → 504, но если timeout истёк на стороне клиента до получения ответа — клиент видит network error, а не 504.

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

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

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

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

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

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

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

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

Источники

  • https://grpc.io/docs/guides/status-codes/
  • https://grpc.io/blog/coreos

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

gRPC-Goapi-designsystem-designtransport