КВОРУМ
Київ · Франкфурт · Варшава — активно/активно

Рішення за 18 мілісекунд.
Навіть коли половина платформи лежить.

«Кворум» — шар ухвалення рішень для платіжних систем: антифрод, поведінковий скоринг і динамічні ліміти. Ми проєктуємо не «точність моделі на валідації», а поведінку системи в найгірший день кварталу — коли відвалився регіон, фічестор віддає застарілі ознаки, а трафік утричі вищий за прогноз.

Кластер рішень · прод кворум 3/3
Київ · kyiv-a лідер
Франкфурт · fra-1 синхронна репліка 4,1 мс
Варшава · waw-2 арбітр + холодна копія 38 мс
Затримка p99 · 24 год 18,1мс
30 мс 10 мс
18,1 мсp99 повного циклу рішення, включно з ознаками
RPO 0жодної підтвердженої транзакції не втрачено
41 смедіанний RTO при втраті регіону-лідера
4,2 млнрішень на добу на піковому тижні
99,995 %доступність за 12 місяців (26 хв простою)
01 / Каскад

Каскад деградації: відповідь є завжди

Модель може бути повільною, ознаки — застарілими, GPU — зайнятим. Але платіжний термінал не вміє чекати: через 60 мс емітент отримає таймаут, і транзакція зірветься. Тому рішення ухвалює не одна модель, а три рівні з жорсткими бюджетами часу. Кожен наступний — простіший, швидший і гірший за якістю; перехід між ними автоматичний і непомітний для клієнта.

L1

Ансамбль повного контексту

Градієнтний бустинг на 340 ознаках + послідовнісна модель на історії транзакцій пристрою + графові сигнали по мережі отримувачів. Найвища якість, найбільша залежність від інфраструктури.

12 мсбюджет · 99,2 % трафіку
Таймаут, деградація фічестора або 5xx — переходимо нижче
L2

Дистильована модель на кеші ознак

Компактна модель (INT8, ~9 МБ), навчена відтворювати рішення L1. Живе в пам'яті кожного вузла, читає лише «теплі» ознаки з локального кешу. Втрата AUC проти L1 — 0,017.

3 мсбюджет · 0,7 % трафіку
Вузол ізольований від усіх сховищ — лишається останній рівень
L3

Детермінована скорингова карта

Правила, підписані ризик-комітетом: ліміти за сумою, країною, MCC і віком картки. Без мережі, без залежностей, без ML. Свідомо консервативна: краще зайвий раз попросити 3-D Secure, ніж пропустити шахрая.

0,2 мсбюджет · 0,1 % трафіку

Що з цього випливає для бізнесу. Немає стану «система недоступна» — є лише поступова втрата якості, яку видно на дашборді як зростання частки L2/L3. Ми продаємо не модель, а гарантію відповіді в межах бюджету.

02 / Реплікація

Кворум замість «основного сервера»

Найдорожчі інциденти у фінтеху — не падіння, а розʼїзд даних: два вузли вважають себе головними й обидва списують кошти. Ми прибрали саме поняття «основного сервера»: запис вважається підтвердженим лише тоді, коли його зафіксували щонайменше двоє з трьох учасників кворуму.

Реплікація журналу через Raft

Вибори лідера з випадковим таймаутом 150–300 мс, журнал транзакцій із монотонними індексами. Втрата будь-якого одного регіону не зупиняє запис; втрата двох переводить систему в режим «лише читання» — свідомо, замість ризику розʼїзду.

raftquorum 2/3fencing token

Ідемпотентність кожної операції

Клієнт надсилає ключ ідемпотентності; ми зберігаємо результат першої обробки на 72 години. Повтор після мережевого таймауту поверне ту саму відповідь, а не другий платіж. Це робить безпечним агресивний ретрай на боці клієнта.

idempotency-keyexactly-once ефект

Подвійний запис і звірка

Реєстр побудований за принципом подвійного запису: кожна проводка має дебет і кредит, сума за добу має сходитися в нуль. Автоматична звірка о 03:00 порівнює наш реєстр із випискою банку-партнера; розбіжність понад 0,01 UAH піднімає інцидент.

double-entryT+1 звірка

Запобіжники й ізоляція навантаження

Кожна зовнішня залежність — за запобіжником: 20 помилок поспіль розмикають ланцюг на 30 секунд, трафік іде в каскад. Пули з'єднань розділені за типом операції, щоб звіти не з'їдали ресурси авторизацій.

circuit breakerbulkheadbackpressure
03 / Моделі

Що насправді визначає затримку

У проді час рішення майже ніколи не «з'їдає» сама нейромережа. Його з'їдають ознаки: скільки звернень до сховища потрібно, щоб зібрати вектор, і чи коректні ці ознаки в часі. Ось як розкладається наш бюджет у 18,1 мс на рівні p99.

p506,2 мс
p9011,4 мс
p9513,8 мс
p9918,1 мс
p99,934,6 мс
010203040 мс

Фічестор із коректністю в часі

Навчальна вибірка збирається тим самим кодом, що й онлайн-вектор, із прив'язкою до моменту події. Це прибирає витік з майбутнього — класичну причину моделі, яка «показувала AUC 0,94 на бектесті й 0,71 у проді».

point-in-time joinодна кодова база

Квантизація й пакетування

Моделі експортуються в ONNX і квантизуються до INT8: утричі менше пам'яті, вдвічі швидший інференс, втрата якості в межах шуму. Мікропакетування вікном 2 мс вирівнює навантаження на пікових хвилинах.

ONNXINT8micro-batching

Ансамбль різної природи

Бустинг ловить табличні закономірності, послідовнісна модель — ритм поведінки пристрою, графова — зв'язки між отримувачами й дропами. Помилки в них різні, тому агрегація дає приріст, якого не дає стек однотипних моделей.

GBDTsequencegraph

Асиметрична ціна помилки

Пропущений шахрайський платіж коштує в середньому 4 700 грн, хибне відхилення чесного — близько 180 грн втраченої маржі плюс ризик відтоку. Поріг рішення рухається за цією економікою, а не за F1-мірою.

cost-sensitiveкалібрування
04 / Релізи

Дрейф, тінь і канарка

Модель у фінтеху псується не тому, що її погано навчили, а тому, що змінюється світ: нова схема шахрайства, сезон, курс, новий партнер із іншим профілем платежів. Тому кожна версія проходить однаковий шлях, а рішення про відкат ухвалює автоматика, а не нарада.

Тіньовий режим

Нова версія два тижні отримує 100 % реального трафіку, але її відповіді нікуди не йдуть — лише пишуться в лог і порівнюються з чинною. Шукаємо не середню якість, а розбіжності: де саме й на яких сегментах моделі не згодні.

Канарковий викат 1 → 5 → 25 %

Кожна сходинка тримається, доки не набереться статистично значуща вибірка за трьома метриками: частка відхилень, скарги в підтримку, рівень чарджбеків. Погіршення будь-якої — автоматичний відкат за 90 секунд.

Виявлення дрейфу

Щогодини рахуємо PSI по кожній ознаці та розподіл вихідних оцінок. PSI понад 0,25 на ознаці з високою важливістю — алерт черговому; різкий зсув у розподілі оцінок — привід перевірити не модель, а джерело даних.

Зворотний зв'язок із затримкою

Чарджбек приходить через 30–120 днів після транзакції. Тому перенавчання працює на двох горизонтах: швидкий контур на підтверджених скаргах і повільний — на фінальній розмітці, коли вона визріла.

05 / Пояснення

Пояснюване рішення, а не «чорна скринька»

Клієнт має право знати, чому йому відмовили, а регулятор — перевірити, що рішення не було дискримінаційним. Автоматизоване рішення без можливості пояснення — це не технічна елегантність, а юридичний ризик.

Причина в людських словах

До кожного відхилення додається три головні чинники впливу, перекладені зрозумілою мовою: «нетипова для вас країна операції», «четверта спроба за 10 хвилин». Оператор підтримки бачить те саме, що й алгоритм.

Незмінний аудиторський слід

Зберігаємо версію моделі, знімок вектора ознак і поріг на момент рішення. Через рік можна відтворити рішення побайтово — це вимога і до спорів із клієнтом, і до перевірки.

Паспорт моделі

Для кожної версії — документ із даними навчання, відомими обмеженнями, метриками за сегментами та переліком ознак, які заборонено використовувати прямо чи опосередковано.

Людина в контурі

Рішення з високою ціною помилки не виконуються автоматично: вони потрапляють у чергу ризик-аналітика з таймером. Модель тут — не суддя, а пріоритезатор черги.

Відповідність вимогам: PCI DSS 4.0, вимоги НБУ щодо захисту інформації в платіжних системах, GDPR (зокрема ст. 22 — автоматизоване ухвалення рішень), ISO 20022 в обміні повідомленнями.

06 / SLO

Бюджет помилок замість обіцянок

SLO у нас має наслідки: поки бюджет помилок не вичерпано — команда котить фічі; щойно вичерпано — усі релізи, крім виправлень надійності, зупиняються до кінця вікна. Дані за поточний 30-денний період.

ПоказникЦільФакт 30 днівБюджетСтан
Доступність API авторизації99,99 %99,995 %спожито 48 %у нормі
Затримка рішення, p99≤ 20 мс18,1 мсспожито 31 %у нормі
Частка рішень рівня L3≤ 0,20 %0,11 %спожито 27 %у нормі
Свіжість ознак (вік p95)≤ 90 с104 сспожито 86 %під наглядом
Час відновлення регіону (RTO)≤ 60 с41 сспожито 12 %у нормі
Розбіжність у добовій звірці0,00 UAH0,00 UAHу нормі
07 / Навчання

Ми ламаємо прод за розкладом

Резервування, яке не перевіряли, — це припущення. Щодругої середи о 14:00 ми свідомо виводимо з ладу компонент у проді на реальному трафіку. Нижче — хронологія останнього навчання: відключення регіону-лідера 27 серпня.

T+0 с

Мережеву звʼязність kyiv-a обірвано

Черговий інженер не попереджений — перевіряємо реакцію, а не сценарій. Клієнтський трафік у цей момент: 3 100 запитів/с.

T+9 с

Вузли зафіксували втрату лідера

Три пропущені heartbeat поспіль. Записи не приймаються — 11 секунд система свідомо недоступна на запис, замість ризику подвійного списання.

T+20 с

Обрано нового лідера — fra-1

Вибори за один раунд; журнал уже був синхронний, тож догін не знадобився. Fencing-токен інкрементовано, старий лідер більше не зможе писати навіть після повернення.

T+41 с

Прийом запису відновлено

Частка рішень рівня L2 піднялася до 4,3 % на дві хвилини — локальні кеші ознак у Франкфурті прогрівалися. Жодної підтвердженої транзакції не втрачено (RPO = 0).

T+11 хв

Що зламалося насправді

Знайшли реальний дефект: дашборд підтримки показував статус старого лідера ще 90 секунд. Виправлено. Саме заради таких знахідок навчання й проводять на проді, а не на стенді.

Пілот на вашому трафіку — 6 тижнів

Два тижні в тіньовому режимі на ваших реальних платежах, чотири — на канарковому трафіку. На виході ви отримуєте звіт: скільки шахрайства ми піймали понад вашу поточну систему і скільки чесних клієнтів перестали отримувати відмову.