> Что значит исключить проскальзывание цены и как это реализовать (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Автомакон
Стек: Go
> Пример ответа
Короткий ответ
Исключить проскальзывание цены - значит гарантировать, что сделка исполнится ровно по той цене, которую ожидал пользователь, без отклонений в худшую сторону. В контексте backend это обычно реализуется через механизм лимитных ордеров, проверку актуальности цены на момент исполнения, блокировку средств и атомарные операции в БД. Полностью исключить проскальзывание невозможно на волатильном рынке, но можно минимизировать через фиксацию цены на короткий интервал и отмену сделки при превышении допустимого отклонения.
Подробное объяснение
Проскальзывание (slippage) возникает, когда между моментом запроса цены и фактическим исполнением сделки рыночная цена меняется. Для backend-системы это означает, что пользователь видит одну цену, а ордер исполняется по другой. Исключить проскальзывание можно двумя подходами:
-
Лимитные ордера - сделка исполняется только по указанной цене или лучше. Если рынок ушёл, ордер не исполняется вовсе. Это жёсткое исключение, но может привести к неисполнению.
-
Протекция от проскальзывания - разрешено исполнение в пределах заданного процента или абсолютной величины от ожидаемой цены. Если отклонение превышает порог, сделка отменяется. Это гибкий подход, который используют биржи и DeFi-протоколы.
Реализация на backend включает:
- фиксацию цены на момент создания ордера (snapshot или ссылка на последний тик);
- проверку текущей цены в момент исполнения через торговый движок или внешний источник;
- атомарность - блокировка средств и исполнение должны быть в одной транзакции, чтобы не было гонок;
- таймауты - если цена не подтверждается за N миллисекунд, ордер отклоняется.
В Go это часто делается через паттерн "check-then-act" с использованием мьютексов или атомарных операций, а также через очереди сообщений для сериализации ордеров.
На практике
В реальной системе процесс выглядит так:
- Пользователь отправляет запрос на покупку по цене X.
- Backend проверяет текущую цену из кэша или торгового движка.
- Если цена отличается от X более чем на допустимый порог (например, 0.5%), запрос отклоняется.
- Если цена в пределах порога, средства блокируются, и ордер ставится в очередь исполнения.
- Исполнение происходит через атомарную операцию: списание средств и зачисление актива в одной транзакции БД.
- Если за время обработки цена ушла за порог, ордер отменяется, средства разблокируются.
Для высоконагруженных систем важно использовать in-memory кэш цен с коротким TTL и распределённую блокировку, чтобы избежать двойного исполнения.
Пример кода
GOtype Order struct {ID stringPrice float64Slippage float64 // допустимое отклонение в процентахAmount float64}func ExecuteOrder(ctx context.Context, order Order, currentPrice float64) error {maxPrice := order.Price * (1 + order.Slippage/100)minPrice := order.Price * (1 - order.Slippage/100)if currentPrice > maxPrice || currentPrice < minPrice {return ErrSlippageExceeded}// атомарная операция в БДreturn db.WithTx(ctx, func(tx *sql.Tx) error {// блокировка средствif err := lockFunds(tx, order); err != nil {return err}// исполнение сделкиreturn executeTrade(tx, order, currentPrice)})}
Как отвечать на собеседовании
Начни с чёткого определения проскальзывания и его причин. Затем раздели подходы: лимитные ордера и протекция с порогом. Подчеркни, что полное исключение невозможно, но можно гарантировать отмену при отклонении. Обязательно упомяни атомарность и гонки данных - это ключевой момент для backend. Если спросят про Go, расскажи про мьютексы, атомарные операции и транзакции. Приведи пример с порогом проскальзывания, как в коде выше. Не углубляйся в финансовую теорию, фокусируйся на инженерной стороне.
Что проверяет интервьюер
Интервьюер оценивает:
- понимание проблемы проскальзывания и её причин;
- умение различать лимитные ордера и протекцию;
- знание конкурентных паттернов в Go (атомарность, блокировки);
- способность проектировать надёжные операции с деньгами;
- понимание trade-off между гарантией цены и вероятностью исполнения.
Типичные ошибки
- Утверждение, что проскальзывание можно исключить полностью - это неверно, можно только ограничить.
- Игнорирование гонок данных при проверке цены и исполнении.
- Отсутствие упоминания атомарности транзакций.
- Смешивание понятий "лимитный ордер" и "протекция от проскальзывания".
- Предложение использовать только рыночные ордера без защиты - это прямой путь к проскальзыванию.
> Похожие задачи по backend
Где и как применялась Kafka
Почему нельзя было в момент сдачи платежки сразу прописывать текущий курс и передавать дальше
За счет чего достигается параллелизм и кооперативность в Go
В чем сложность работы с float в Go
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью