> Расскажи про последнее место работы, задачи и архитектуру (Go)
Уровень: middle · Роль: backend · Категория: Технические вопросы
Компании: BetBoom
Стек: Go
> Пример ответа
Короткий ответ
Последнее место - backend-разработка на Go в сервисе доставки. Отвечал за API-слой, интеграции с внешними системами и фоновые обработчики. Архитектура - монолит с чётким разделением на модули, PostgreSQL как основная БД, Redis для кэша и очередей, Kafka для событий. Основная задача - поддержка и развитие функциональности заказов, включая расчёт стоимости, статусы и интеграцию с партнёрами.
Подробное объяснение
Сервис обрабатывал заказы: создание, изменение, отмену, расчёт доставки. Монолит на Go, разбит на модули по доменным областям: заказы, доставка, платежи, пользователи. Каждый модуль имел свой слой handler → service → repository. HTTP-запросы обрабатывались через net/http с собственным middleware для логирования, auth и recovery. Фоновая логика - worker'ы на Kafka consumer group, которые обрабатывали события типа order_created, payment_confirmed.
Основные компоненты:
- API Gateway (nginx) → Go-сервис
- PostgreSQL - основное хранилище, миграции через golang-migrate
- Redis - кэш справочников и rate limiting
- Kafka - событийная шина для внутренних и внешних интеграций
- Prometheus + Grafana - метрики, Jaeger - трейсинг
Моя зона ответственности - модуль заказов и интеграция с партнёрскими API доставки. Типичная задача: добавить новый статус заказа, который выставляется после подтверждения курьером. Это затрагивало модель данных, обработчик события, обновление API-ответа и тесты.
На практике
В работе использовал стандартный подход: handler принимает запрос, валидирует, вызывает service, который содержит бизнес-логику и работает с repository. Транзакции - только на уровне repository, чтобы избежать вложенных транзакций. Для внешних вызовов - retry с exponential backoff и circuit breaker через go-resiliency.
Пример реальной задачи: нужно было добавить поддержку промокодов в расчёт стоимости. Реализация:
- новая таблица
promocodesи связь с заказом - сервисный метод
CalculatePriceпринимает промокод, проверяет его в Redis (кэш), при отсутствии - запрос в БД - событие
promocode_appliedотправляется в Kafka для аудита
Тесты - unit на service с mock repository, интеграционные на handler с testcontainers (PostgreSQL). Покрытие ключевых сценариев - около 80%.
Пример кода
GOtype OrderService struct {repo OrderRepositorycache *redis.Clientkafka KafkaProducer}func (s *OrderService) CalculatePrice(ctx context.Context, orderID string, promo string) (int, error) {order, err := s.repo.GetByID(ctx, orderID)if err != nil {return 0, fmt.Errorf("get order: %w", err)}discount := 0if promo != "" {discount, err = s.getPromoDiscount(ctx, promo)if err != nil {return 0, fmt.Errorf("get promo discount: %w", err)}}price := order.BasePrice - discountif price < 0 {price = 0}if err := s.kafka.Publish(ctx, "promocode_applied", map[string]string{"order_id": orderID,"promo": promo,}); err != nil {// не фатально, логируем}return price, nil}func (s *OrderService) getPromoDiscount(ctx context.Context, promo string) (int, error) {if val, err := s.cache.Get(ctx, "promo:"+promo).Int(); err == nil {return val, nil}// fallback в БДreturn s.repo.GetPromoDiscount(ctx, promo)}
Как отвечать на собеседовании
Структурируй ответ: сначала общий контекст (что за сервис, какая роль), потом архитектура (компоненты, связи), затем конкретные задачи и твой вклад. Упоминай trade-off: почему монолит, а не микросервисы - для этого масштаба и команды это было оправдано. Покажи, что понимаешь, как твой код влияет на систему в целом: например, добавление статуса заказа затрагивает не только БД, но и события, API-контракт, тесты.
Если спрашивают про конкретную архитектуру - не уходи в детали реализации, сначала опиши схему, потом пример. Используй термины: domain layer, repository pattern, event-driven, idempotency. Подчеркни, что умеешь работать с распределёнными системами: Kafka, retry, dead letter queue.
Что проверяет интервьюер
- Умение структурированно описать систему, а не перечислять технологии
- Понимание слоёв и ответственности: handler, service, repository
- Знание паттернов: repository, middleware, event-driven
- Практический опыт с Go: работа с ошибками, контекстом, конкурентностью
- Умение обосновать архитектурные решения: почему монолит, почему Kafka, а не RabbitMQ
- Насколько глубоко ты понимаешь жизненный цикл запроса и данных
Типичные ошибки
- Перечисление технологий без связи с задачами: "использовал Go, PostgreSQL, Redis" - без объяснения зачем
- Слишком высокоуровневый ответ: "делал микросервисы" - без деталей, что именно делал
- Уход в нерелевантные детали: расписывать настройку nginx, когда спрашивают про бизнес-логику
- Не упоминать про тесты, ошибки, мониторинг - это показывает незрелость
- Путаница в терминах: называть handler "контроллером", или путать event-driven с message queue
- Не упоминать trade-off: если всё идеально - это подозрительно, интервьюер ждёт, что ты знаешь ограничения своего решения
> Похожие задачи по backend
Кто принимал решения по архитектуре сервиса лояльности
Как устроена разработка сервисов: существующие или с нуля
Сколько разработчиков в команде, на каких языках они работают и как устроена команда
Как обнаруживать и реагировать на проблемы с отменой брони
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью