> Какие задачи решает бэк офис для банков (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

Короткий ответ

Бэк офис в банке решает задачи автоматизации внутренних операционных процессов: обработка транзакций, расчёты, клиентское обслуживание, комплаенс, отчётность и управление рисками. Это система-трудяга, которая обеспечивает надёжность, прослеживаемость и скорость выполнения операций, в отличие от фронта, который отвечает за взаимодействие с пользователем. Для backend-разработчика это работа с высоконагруженными системами, очередями, распределёнными транзакциями и строгими требованиями к консистентности данных.

Подробное объяснение

Бэк офис - это ядро банковской ИТ-инфраструктуры. Он решает следующие классы задач:

  • Обработка транзакций: проведение платежей, переводов, зачислений, списаний. Здесь критичны атомарность, идемпотентность и гарантии доставки.
  • Расчёты и клиринг: взаимодействие с платёжными системами (SWIFT, SEPA, национальные системы), сверка данных, обработка возвратов и отказов.
  • Учёт и балансы: ведение счетов, начисление процентов, комиссий, резервирование средств. Требуется строгая консистентность и аудит.
  • Комплаенс и AML: мониторинг подозрительных операций, проверка клиентов (KYC), санкционные фильтры, формирование отчётов для регулятора.
  • Клиентское обслуживание: обработка заявок, документооборот, интеграция с CRM, управление жизненным циклом продуктов (кредиты, депозиты).
  • Отчётность: генерация ежедневных, ежеквартальных отчётов для ЦБ, налоговой, акционеров. Часто это batch-процессы с большими объёмами данных.
  • Управление рисками: лимиты, скоринг, мониторинг задолженностей, расчёт резервов.

С архитектурной точки зрения бэк офис - это набор сервисов, работающих с очередями (Kafka, RabbitMQ), базами данных (PostgreSQL, Oracle, ClickHouse), и часто с распределёнными транзакциями через Saga или outbox-паттерн. Ключевые требования: надёжность (no data loss), воспроизводимость, идемпотентность обработчиков, мониторинг и алертинг.

На практике

В Go бэк офис обычно строится как набор микросервисов, каждый из которых отвечает за свою доменную область: payments, accounts, compliance, reporting. Типичный стек: Go + PostgreSQL + Kafka + Redis + gRPC/REST. Основные практические задачи:

  • Проектирование обработчиков событий: consumer-группы в Kafka, обработка retry и dead letter queues.
  • Работа с транзакциями: использование паттерна outbox для гарантированной публикации событий, Saga для распределённых операций.
  • Идемпотентность: ключи идемпотентности в запросах, уникальные индексы в БД, проверка дубликатов.
  • Балансировка нагрузки и партиционирование: шардирование данных по клиентам или счетам.
  • Мониторинг: метрики в Prometheus, трейсинг через OpenTelemetry, алерты на задержки и ошибки.
  • Тестирование: интеграционные тесты с testcontainers, контрактные тесты между сервисами.

Например, обработка платёжного поручения может выглядеть так: сервис получает запрос, валидирует, сохраняет в БД с outbox-событием, публикует в Kafka, затем другой сервис выполняет расчёт и обновляет баланс. Всё это должно быть устойчиво к сбоям и повторным обработкам.

Пример кода

Пример обработчика события из Kafka с идемпотентностью и outbox-паттерном на Go:

GO
type PaymentHandler struct {
db *sql.DB
producer *kafka.Producer
}
func (h *PaymentHandler) Process(ctx context.Context, msg []byte) error {
var payment Payment
if err := json.Unmarshal(msg, &payment); err != nil {
return fmt.Errorf("unmarshal: %w", err)
}
// Идемпотентность: проверяем, не обработано ли уже событие
var processed bool
err := h.db.QueryRowContext(ctx,
"SELECT EXISTS(SELECT 1 FROM processed_events WHERE event_id = $1)",
payment.EventID).Scan(&processed)
if err != nil {
return fmt.Errorf("check processed: %w", err)
}
if processed {
return nil // уже обработано, пропускаем
}
// Начинаем транзакцию
tx, err := h.db.BeginTx(ctx, nil)
if err != nil {
return err
}
defer tx.Rollback()
// Обновляем баланс счёта
_, err = tx.ExecContext(ctx,
`UPDATE accounts SET balance = balance - $1 WHERE id = $2 AND balance >= $1`,
payment.Amount, payment.AccountID)
if err != nil {
return fmt.Errorf("update balance: %w", err)
}
// Помечаем событие как обработанное
_, err = tx.ExecContext(ctx,
"INSERT INTO processed_events (event_id) VALUES ($1) ON CONFLICT DO NOTHING",
payment.EventID)
if err != nil {
return err
}
// Публикуем событие в outbox для дальнейшей обработки
_, err = tx.ExecContext(ctx,
"INSERT INTO outbox (topic, payload) VALUES ($1, $2)",
"payment.processed", msg)
if err != nil {
return err
}
if err := tx.Commit(); err != nil {
return err
}
return nil
}

Как отвечать на собеседовании

Начните с краткого определения роли бэк офиса, затем перечислите основные функциональные блоки. Подчеркните, что это не просто "внутренняя админка", а критически важная система с высокими требованиями к надёжности. Приведите пример из практики: как вы решали задачу идемпотентности или обработки дубликатов. Упомяните, что в Go бэк офис часто строится на event-driven архитектуре с Kafka, и что важно уметь проектировать отказоустойчивые обработчики. Если спросят про конкретные технологии, говорите про PostgreSQL, Redis, gRPC, Prometheus. Не углубляйтесь в детали фронтенда - это не ваша зона. Покажите, что понимаете бизнес-контекст: комплаенс, риски, отчётность - это не просто технические задачи, а регуляторные требования.

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

Интервьюер оценивает:

  • Понимание доменной области: знаете ли вы, чем бэк офис отличается от фронта и middle office.
  • Архитектурное мышление: как вы проектируете обработку событий, обеспечиваете консистентность, обрабатываете сбои.
  • Практический опыт: сталкивались ли с реальными задачами - дубликаты, потеря сообщений, распределённые транзакции.
  • Знание Go-специфики: работа с горутинами, каналами, конкурентность, обработка ошибок.
  • Умение говорить о trade-off: например, почему выбрали outbox вместо двухфазного коммита, или почему Kafka, а не RabbitMQ.
  • Навыки проектирования БД: индексы, уникальные ограничения, шардирование.

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

  • Сводить бэк офис к "просто админке" или "внутреннему сайту" - это показывает непонимание домена.
  • Игнорировать идемпотентность и обработку дубликатов - это ключевая тема, о ней нужно говорить обязательно.
  • Утверждать, что можно использовать синхронные вызовы между сервисами без очередей - в банковском бэк офисе это редко допустимо.
  • Не упоминать комплаенс и регуляторику - это важная часть, которую часто забывают.
  • Путать бэк офис с бэкендом для мобильного приложения - это разные вещи, хотя технически пересекаются.
  • Предлагать решения без учёта требований к аудиту и прослеживаемости - все операции должны быть воспроизводимы.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью