Снижение комиссии и задержек: кеширование курсов и роутинг платежей
Полный текст статьи
1) Цель: платить быстрее и дешевле, не теряя контроль над риском
Скорость: меньше «холодных» ожиданий (3-DS, батчи банка, подтверждения сети).
Стоимость: минимизировать комиссию PSP/банка/сети и спрэд конверсии.
Надёжность: zero-loss инварианты: один дебет/кредит, предсказуемый курс.
Комплаенс: региональные правила, санк-скрининг, RG/AML до отправки.
2) Сервис курсов (FX) с кешированием: как устроить правильно
2.1 Источники и калибровка
Прайс-фиды: провайдеры ликвидности/FX-API/котировки PSP/касс.
Нормализация: единый формат `pair/base/quote/scale`, mid-rate + маржа (`markup_bps`), время получения `as_of`.
Калибровка на PSP: часть PSP возвращает «эффективный курс» в ответе; храните rate cards per метод/PSP/гео.
2.2 Кеш и TTL
Горячий кеш (Redis) на частые пары (EUR↔USD, EUR↔GBP, USD↔BRL и т. п.).
TTL по волатильности: G10 — 30–120 c, EM — 10–30 c; стейблы — 60–300 c (по провайдеру).
Grace window: допуск использования «протухшего» курса N секунд для завершения уже начатых интентов.
2.3 Защита от скольжения (slippage)
Клиенту выдаётся временная котировка с `expires_at` и допускаемым drift (например, ±20 bps).
При исполнении:- если рынок ушёл в пределах drift → применяем «забронированный» курс;
- если ушёл дальше → re-quote (повторное подтверждение) или «best-effort» по политике бренда.
- Для выводов — budgeted FX: лимит расходов на конверсию, транзакция отклоняется при превышении.
2.4 Идемпотентность и атомарность
Все FX-операции имеют `X-Idempotency-Key`, связанный с суммой/парой/типом операции.
Запись в Ledger и фиксация курса — одна сагa: `quote.lock → debit/credit → quote.release`.
Курсы в денежных записях хранятся как minor units + scale, без плавающей точки.
2.5 API (эталон)
Получить котировку (кэшируемую)
GET /v1/fx/quote?base=EUR"e=USD&side=buy&amount_minor=100000
→ 200 {
"pair":"EUR/USD","rate":"1.08123","markup_bps":15,  "expires_at":"2025-10-23T12:00:15Z","quote_id":"q_abc"
}Забронировать курс и списать
POST /v1/fx/execute
Headers: X-Idempotency-Key: fx_exec_001
{
"quote_id":"q_abc","amount_minor":100000,"pair":"EUR/USD"
}
→ 200 {"status":"filled","avg_rate":"1.08125","fx_entry_id":"fx_77"}3) Роутинг платежей: выбрать самый быстрый и дешёвый путь
3.1 Факторы маршрутизации
Гео/валюта/метод: карта/SEPA/SWIFT/ewallet/крипто.
Комиссии: фикс + % + FX-markup, скрытые сборы PSP/банка.
SLA: p95 `submit→settled`, success-rate, отказ по кодам.
Cut-off и окна расчётов: банки (SEPA T+0/T+1), крипто-сети (нагрузка/газ), выходные.
Риски: санкции/AML/velocity-лимиты/chargeback-профиль.
Доступность: статус каналов/PSP, лимиты мерчанта, казначейские остатки.
3.2 Каскады и bandit-стратегии
Deterministic rules для «жёстких» требований (юрисдикции, лицензии, сумма).
Сверху — ε-greedy / UCB для выбора между несколькими подходящими PSP: минимизируем `cost_per_success` и задержку.
Warm-up на новые каналы с пониженным трафиком + быстрая остановка при деградации.
3.3 «Умные» ретраи
Повторяем только retryable-коды (timeouts, transient, bank offline).
Hedged-requests (редко, осторожно): параллельный запуск на 2 PSP с отменой проигравшего — для VIP/критичных сумм, если юридически допустимо.
Всегда с идемпотентными токенами PSP, чтобы избежать двойного списания.
3.4 Учёт расписаний
Календарь cut-off (SEPA, SWIFT, локальные схемы), «праздники» по странам.
Scheduler: если до cut-off осталось < X минут — направить в мгновенный канал (ewallet/крипто/instant SEPA), иначе — ставить в очередь T+1.
3.5 Крипто-роутинг
Выбор сети по `fee_per_byte/throughput/ETA`, белые списки адресов и дорожные правила (Travel Rule между VASP).
Dynamic gas: расчёт maxFee/maxPriority, пауза низкоприоритетных выводов при газ-шипках.
3.6 API (эталон)
Подбор маршрута
POST /v1/payments/route
{
"amount":{"minor_units":5000,"currency":"EUR"},  "method":"card","geo":"DE","direction":"payout"
}
→ 200 {
"route_id":"rt_001",  "candidates":[
{"psp":"A","eta_sec":420,"cost_minor":85,"success_rate":0.91},   {"psp":"B","eta_sec":360,"cost_minor":120,"success_rate":0.96}
],  "recommend":"B"
}Исполнение (с идемпотентностью)
POST /v1/payments/submit
Headers: X-Idempotency-Key: pay_001
{ "route_id":"rt_001","psp":"B", "fx_quote_id":"q_abc" }
→ 202 {"payment_id":"pm_777","status":"SUBMITTED"}4) Неттинг, батчинг и on-us оптимизации
On-us (внутри экосистемы): взаиморасчёт без внешнего PSP → нулевая комиссия, мгновенный SLA.
Неттинг: суммировать мелкие кэшауты в один внешний перевод (банки/крипто) с детальной проводкой в Ledger.
Батчинг: SEPA-файлы, крипто-батчи (UTXO consolidation/стейблкоиновый батч) — снижают стоимость за счёт оптового газа/комиссий.
5) Телеметрия и SLO, ориентированные на стоимость и скорость
SLI/SLO:- p95 `route→submit` внутренний < 150–300 мс, p95 `submit→settled` по каналу: карты/ewallet 5–30 мин; SEPA T+0/T+1; крипто ≤ 10 мин, p95 `FX quote→execute` < 1 с, доля «re-quote» ≤ 2–5% (зависит от рынка), «потерянных/дублированных» = 0.
- Cost KPIs: `cost_per_success`, «спрэд на 1000 ед.», fee-burn по сети/PSP, FX-PnL.
- Алерты: всплеск re-quote, деградация success-rate/ETA у конкретного PSP/сети, рост cost_per_success, увеличенный `IDEMPOTENCY_MISMATCH`.
6) Наблюдаемость и аудит
Структурированные логи JSON: `trace_id`, `route_id`, `payment_id`, `psp_ref`, `fx_quote_id`, коды ошибок.
OpenTelemetry: спаны `route.select → fx.quote → wallet.debit → psp.submit → webhook.settled`.
WORM-аудит: изменения маржи FX, правил роутинга, приоритетов, cut-off календаря.
7) Казначейство и остатки
Резервы per канал/PSP/сеть, автоматический ребаланс с учётом прогнозов трафика.
Политики минимальных остатков и стоп-режим «no new payouts» при недофинансировании.
Хедж: авто-своп стейблов/фиата по плану, чтобы фиксировать спрэд.
8) Reconciliation (сверки) и отчёты
FX-реестр: quote_id ↔ execute_id ↔ платеж ↔ проводки Ledger.
Ежедневные отчёты PSP/банков/сети ↔ Ledger: категории `match/timing/missing/amount_mismatch`.
Отдельный отчёт FX-PnL: реализованный спрэд, стоимость котировок, re-quote-потери.
9) Архитектурные блоки (микросервисы)
fx-service: сбор фидов, кэш, слippage-политики, API quote/execute.
router-service: правила, bandit-логика, календарь cut-off, состояние каналов.
treasury-service: остатки, ребаланс, бюджеты.
payments-orchestrator: саги, идемпотентность, вебхуки, DLQ.
Везде — outbox/CDC, partition-keys по `tenant/brand/region`.
10) Чек-листы
Платформа/оператор
- FX-кэш с TTL по волатильности, slippage-политика, quote.lock/execute.
- Идемпотентность на `fx.execute` и `payments.submit`.
- Роутинг с детерминированными правилами + bandit поверх.
- Календарь cut-off и расписания сетей; scheduler для T+0/T+1.
- Телеметрия: SLO по ETA/успешности/стоимости; дашборд FX-PnL.
- WORM-аудит изменения маржи/правил/календарей.
- Неттинг/батчинг включены; on-us оптимизации.
- DR/хаос-учения: падение PSP, газ-шипка, скачок волатильности.
Интеграции/PSP/провайдеры FX
- Возвращают эффективный курс/fee в ответе; стабильные idempotency-токены.
- Подписанные вебхуки (HMAC/EdDSA), ретраи до 2xx, дедуп по `event_id`.
- Репорты T+1 для сверок, целостность (хеш/PGP).
11) Красные флаги (анти-паттерны)
Конверсия по «рыночному» курсу без фиксации `quote_id` и срока действия.
Отсутствие slippage-ограничений → негативный сюрприз игроку.
Роутинг «жёстко вшит» в код без телеметрии и A/B.
Ретраи на те же PSP-коды, что не ретраятся (например, hard decline).
Игнор cut-off/календарей → систематические задержки T+1+.
Неттинг/батчинг отключены при высоких комиссиях.
Вебхуки без подписи/окна валидности → реплеи.
Нет outbox/CDC → «потерянные» события и расхождения в отчётах.
12) Вывод
Снижение комиссий и задержек — это не «магический» один переключатель, а система решений: кэшируемые и управляемые курсы с защитой от скольжения, умный роутинг с каскадами и bandit-логикой, учёт расписаний и остатков, плюс неттинг и батчинг. Добавьте идемпотентность, outbox/CDC, SLO-телеметрию и WORM-аудит — и ваши платежи начинают идти быстрее, дешевле и один раз, оставаясь прозрачными для игрока, финансов и регулятора.
