Почему интеграция с агрегатором курсов срывает выдачу
Расхождение курса возникает на стыке двух разных представлений о цене. Агрегатор опрашивает источники со своей частотой и кэширует ответ на витрине, а обменник в момент исполнения пересчитывает курс по своему стакану. Между показом и подтверждением проходит от секунды до нескольких, и в волатильном рынке этого достаточно, чтобы расхождение курса вылезло за допустимый порог. Пользователь видит одну цифру, по факту соглашается на другую — и заявка либо отклоняется, либо уходит в поддержку.
Отклонённые заявки редко бывают следствием одной причины. Обычно это набор: лимит по резерву у партнёра, непройденная проверка, ограничение по региону и разные коды ошибок, которые агрегатор не разбирает. Он отдаёт общее «недоступно» на витрину, а клиент уходит к следующему обменнику, хотя сделка была технически возможна.
Задвоенные заявки — отдельный класс. При обрыве соединения клиент или сам агрегатор повторяет запрос, а если у пары нет согласованного ключа идемпотентности, одна операция превращается в две. Если обменник исполняет обе — получаем двойную сделку и разбирательство вместо обмена.
Пиковая нагрузка вскрывает всё сразу. Всплеск при резком движении рынка даёт десятки запросов в секунду, лимиты партнёра срабатывают, часть ответов приходит с таймаутом. Заявки зависают в неизвестном статусе, и никто не может сказать, исполнена она или нет. Разбираем, как это закрывается.
Что меняется в обменнике после подключения потока
Обновление курса перестаёт быть ручной операцией: агрегатор отдаёт поток по подписке, и витрина получает значение в пределах секунд после публикации у источника. Между ними — нормализация (агрегаторы считают курс по-разному: с комиссией сети, направлением сделки, минимальной суммой) и дельта-фильтр, который не дёргает витрину на шумовых колебаниях. Значение проходит проверку на разрыв: если курс ушёл за границу отклонения, публикации нет, а в мониторинг уходит событие.
Конверсия заявок растёт не от «лучшего курса», а от его согласованности. Клиент видит цифру, она фиксируется на время оформления и попадает в расчёт без расхождений — именно разница между витриной и фактическим исполнением давала основную долю брошенных форм. Автоматическое закрытие заявок держится на статусной модели: создание, резерв, оплата, подтверждение в сети, выдача. События от провайдера и узла обрабатываются идемпотентно, поэтому повтор не создаёт вторую заявку, а в ручной разбор уходят только случаи с несошедшейся суммой или молчанием источника.
Устойчивость к нагрузке — это предсказуемая деградация, а не «сервер мощнее». Заявки идут через очередь, лимиты по аккаунту и направлению проверяются на входе, а при недоступности агрегатора витрина работает по последнему валидному курсу с явным признаком устаревания. Пик трафика приводит к замедлению обработки, а не к двойным списаниям и потерянным заявкам.
После подключения смотрим на четыре величины: задержку от публикации курса до витрины, долю заявок, закрытых без оператора, долю брошенных форм и число отказов из-за расхождения курса. Это и есть измеримый сдвиг, который видно при сравнении до и после.
Способы подключения: от готового модуля до своего шлюза
У обменника есть три принципиально разных пути в агрегаторы курсов, и выбирают между ними не по популярности решения, а по объёму заявок и по тому, кто отвечает за расхождение котировок. Ниже — сравнение вариантов подключения с их ограничениями, чтобы схема совпадала с нагрузкой, а не наоборот.
Ключевое отличие схем в том, где живёт логика сопоставления курса и статуса заявки. В готовом модуле её держит площадка, в собственном шлюзе — вы, а у посредника по ликвидности она размазана между сторонами. От этого зависит, как быстро вы увидите расхождение и сможете ли откатить ошибочную котировку.
| Вариант | Когда подходит | Ограничения схемы |
|---|---|---|
| Готовый модуль агрегатора | Небольшой и средний поток заявок, нужен быстрый старт без своей инфраструктуры | Логика курса и повторов запросов чужая: правила обновления задаёт площадка, тонкая настройка статусов недоступна |
| Собственный шлюз к API площадок | Плотный поток и несколько агрегаторов сразу, нужен единый журнал заявок и идемпотентная обработка | Требует своей очереди, контроля частоты запросов и дежурства на расхождениях |
| Посредник по ликвидности | Нужен доступ к глубине рынка и быстрое расширение списка площадок | Лишнее звено в цепочке: дольше подтверждение, сложнее разобрать инцидент по конкретной сделке |
| Прямые договорённости с площадкой | Крупный объём и жёсткие требования к марже | Долгие переговоры и отдельная интеграция под каждого партнёра |
Ограничения схемы проявляются не на старте, а на пике нагрузки: когда площадка меняет формат ответа, часть заявок зависает в промежуточном статусе. Поэтому вариант подключения фиксируем до разработки — по числу площадок, ожидаемому потоку и тому, кто дежурит на расхождениях курса.
Этапы интеграции: от схемы обмена до передачи
Интеграция с агрегатором курсов — это не «подключить API и отдать курс». Агрегатор приводит поток, и расхождение между курсом на его витрине и фактическими условиями сделки в обменнике сразу бьёт по конверсии. Поэтому этапы интеграции выстроены так, что каждый заканчивается проверяемым результатом, а не отчётом.
- Аудит схемы обмена. Разбираем источники курса, приоритет между ними, ручные правки, округление и спред. На выходе — карта потока и список расхождений с фактическими условиями сделки.
- Проектирование схемы. Выбираем модель: опрос по расписанию или передача по событию. Задаём порядок источников, поведение при недоступности одного из них и правило, по которому курс считается устаревшим.
- Настройка и тестовый контур. Поднимаем изолированный контур с тестовой средой агрегатора: маппинг полей, обработка ошибок и лимитов, дедупликация повторов, журнал ответов для сверки.
- Нагрузочная проверка. Прогоняем профиль трафика агрегатора с всплесками и смотрим поведение при задержках: отдаём последний подтверждённый курс или помечаем его как неактуальный.
- Приёмочные сценарии. Сверяем курс по всем парам с эталоном, проверяем частичную недоступность источника и откат на прежнюю схему обмена.
- Переключение потока. Переводим трафик долями, сравнивая долю отказов и конверсию на новом и старом канале. Полное переключение — после сходимости метрик.
- Приёмка работ и передача. Отдаём схему, регламент дежурства и метрики, фиксируем, что считаем инцидентом и в каком порядке реагируем.
До переключения потока ни один этап не считается завершённым «на глаз»: у каждого есть критерий, по которому мы вместе принимаем результат.
Схемы обмена, доступы и регламенты передачи
Интеграция считается сданной не тогда, когда курсы приходят, а когда заказчик может менять состав источников, не читая исходный код. Поэтому к концу работ у вас остаётся комплект артефактов — его мы разбираем на приёмке вместе с вашими инженерами, а не отдаём архивом «на память».
- Передача настроек. Рабочие конфигурации маппинга: какие поля ответа агрегатора идут в курс, порог расхождения между источниками, таймауты и число повторов запроса. К каждому параметру — комментарий, что изменится в поведении, если его сдвинуть.
- Схема потоков. Путь запроса от клиента до фиксации курса: где кэш и сколько он живёт, где очередь, в какой момент подключается резервный источник и когда выдача блокируется. С точками отказа и тем, как каждая отрабатывает.
- Правила доступа. Роли и области видимости: кто правит список источников и приоритет между ними, кто меняет пороги, кто видит только журнал. Ключи агрегаторов — в секрет-хранилище, с ротацией и без вывода в логи.
- Документация. Описание полей и форматов ответа, справочник кодов ошибок по каждому источнику, порядок подключения нового агрегатора — от тестового ключа до включения в боевой отбор.
- Регламент на сбой. Что делает система и что делают люди при недоступности источника, при расхождении курсов выше порога, при всплеске отказов. С порядком переключения, оповещения и обратного включения.
- Журнал разбора. Трассировка по каждому отклонённому курсу: какой источник ответил, за какое время и по какому правилу значение не прошло. Без этого инцидент превращается в переписку с агрегатором.
- Тестовый контур. Записанные ответы источников и сценарии сбоев, чтобы новые правила отбора проверялись до боевого трафика.
Пакет обновляем при каждом изменении правил — иначе документация расходится с поведением системы уже через месяц.
Кейс: как обменник перестал терять заявки из потока
Обменник получал заявки из трёх агрегаторов курсов, и каждая проходила через оператора: сверка курса, ручной перенос реквизитов, подтверждение сделки. На пике это 40+ заявок в час, и при отклонении курса на доли процента часть заявок уходила по старой цене или терялась в переписке — до 12% обращений в сутки. Время реакции на изменение курса доходило до 15 минут, за смену оператор делал около 60 ручных правок.
Мы подключили обменник к BestChange и остальным агрегаторам напрямую: единый сервис курсов собирает ставки, нормализует их и отдаёт в агрегатор, а входящая заявка создаётся автоматически с проверкой по внешнему идентификатору — дубли из разных источников не превращаются в две сделки. Ответ агрегатора может прийти с задержкой, поэтому заявка ставится в очередь, а курс фиксируется на момент подтверждения, а не на момент отправки.
Метрики до и после
Доля потерянных заявок — с 12% до 1,5%. Время реакции на изменение курса — с 15 минут до 20 секунд. Ручных правок за смену — с 60 до 4, и остались только спорные случаи и крупные суммы. На том же потоке посетителей оборот вырос примерно на треть: часть заявок просто перестала уходить мимо.
Отдельно закрыли рассинхрон: журнал расхождений по курсам и оповещение дежурного при отклонении выше порога. Кейс интеграции показал, что узкое место было не в привлечении трафика, а в ручном звене между агрегатором и ядром обменника.
Чем прямое подключение отличается от работы через посредника?
Разница в том, кто владеет потоком цен. При прямом подключении обменник сам обращается к источникам и собирает свою таблицу курсов, а при работе через посредника получает уже готовое число — пересчитанное, с зашитой чужой маржой и без доступа к исходным данным.
Контроль курса — первое расхождение. На прямом подключении спред, шаг округления и правила реакции на волатильность задаёт сам обменник: можно сжать маржу на популярном направлении и поднять там, где поток тонкий. Посредник такие настройки не отдаёт, он присылает одно значение, и всё, что между источником и этим значением, остаётся закрытым.
Скорость обновления зависит от того, сколько слоёв стоит между источником и витриной. Прямое подключение доносит изменение курса за один шаг, у посредника добавляется промежуточное звено и собственный буфер — на резком движении рынка расчёт на стороне клиента отстаёт, и заявка уходит по цене, которой уже нет.
Прозрачность отказов устроена похоже. При прямом подключении видно, какой источник не ответил, сколько раз и с какой задержкой, — сбой локализуется и закрывается точечно. Через посредника приходит ошибка верхнего уровня, и непонятно, проблема у него или у контрагента: диагностика растягивается, а клиент видит зависший расчёт.
Главная цена работы через посредника — зависимость от партнёра. Он меняет лимиты, состав направлений и правила округления в одностороннем порядке, а подключение может отвалиться без предупреждения. Поэтому на практике чаще берут гибрид: ключевые направления ведут напрямую, а редкие закрывают агрегатором как подстраховкой.
Частые вопросы по подключению и потоку заявок
Подключение к агрегаторам курсов почти всегда поднимает одни и те же сомнения — про посредника, скачки курса и судьбу уже идущего потока. Ниже — ответы по существу, без общих формулировок.
Мы работаем через посредника — переход будет болезненным?
Разрывать схему не нужно: прямое подключение поднимаем параллельно, и какое-то время оба канала работают одновременно. Сверяем курсы, лимиты и статусы заявок, а посредника отключаем только после совпадения данных — направление перестаёт терять на его наценке и на задержке в передаче курса.
Что происходит с заявками при резких скачках курса?
Курс агрегатора живёт ограниченное время, поэтому заявка фиксирует значение на момент подтверждения, а не на момент запроса. При движении рынка срабатывает порог отклонения: сделка не закрывается по устаревшей цене, а пересчитывается или возвращается клиенту.
Сколько занимает подключение и что с текущими заявками?
Типовой срок — от двух до четырёх недель: доступы и сопоставление валютных пар, затем тестовый контур и вывод в рабочий поток. Действующий канал всё это время принимает заявки как обычно, история и статусы остаются на месте, а новый контур вводим долей трафика.
Как отсекается мусорный поток?
На входе — правила по сумме, валютной паре и частоте обращений, на выходе — сверка с репутационными метками площадки. Заявка, не прошедшая порог, не доходит до оператора, и доля отменённых сделок падает в разы.
Обсудим задачу и вернёмся с оценкой и планом
Чтобы вернуться с оценкой работ и планом подключения, а не с общими формулировками, нам нужна картина вашей текущей схемы обмена с агрегаторами курсов. Чем точнее исходные данные, тем меньше допущений в смете и тем предсказуемее первый релиз.
- Какие агрегаторы курсов уже подключены и по какой модели: переход по ссылке, получение курса через программный интерфейс, прямая передача заявок. Отметьте, где упираетесь в ограничения по частоте обращений.
- Формат обмена: как приходят курсы, лимиты и направления, как часто обновляется кэш и что происходит на стороне обменника при рассинхроне данных с источником.
- Объёмы потока: сколько направлений и валютных пар в работе, сколько запросов в минуту приходит в пике, какую долю составляют отказы на текущих связках.
- Как считается конверсия: в какой точке фиксируется переход к вам и на каком шаге теряется основная часть потока.
- Правила пересчёта: округление курса, комиссии, минимальные и максимальные суммы, порядок учёта при резком движении рынка.
- Доступы и тестовые окружения агрегаторов, лимиты на запросы, порядок согласования выкатки на боевой контур.
- Ответственные с обеих сторон и допустимое окно простоя при переключении трафика.
С этим набором наши инженеры собирают схему обмена, отмечают узкие места и определяют, что закрывается штатными средствами агрегатора, а что требует отдельного слоя. Опишите задачу в удобном виде — вернёмся с оценкой работ, планом подключения по этапам и списком рисков, которые стоит снять до старта.







