Финтех архитектура: нещата, които не подлежат на договаряне

·11 мин четене

В повечето софтуер един бъг е инцидент. Във финтеха бъгът е задължение, което може вече да е струвало пари, без някой още да го е забелязал.

Финтех архитектурата има малък брой наистина недоговоряеми решения. Сгрешите ли ги, никакво по-късно инженерство не наваксва напълно — наследявате система, в която парите могат да са беззвучно грешни, а това е единственият режим на отказ, който финансов продукт не може да поеме.

1. Салдата се извеждат, никога не се пазят като истина

Най-честата и най-разрушителна грешка е променлива колона за салдо, която кодът обновява директно. Тя е удобна, бърза и невъзстановима: щом се отклони, няма как да се определи каква е трябвало да бъде.

Правилният модел е журнал със записи само за добавяне. Нищо никога не се обновява или трие; корекциите са нови компенсиращи записи. Салдото е сумата от записите — кеширано за производителност, но винаги възстановимо от журнала.

Променливо салдоЖурнал само за добавяне
UPDATE accounts SET balance = balance - 100INSERT запис (дебит 100), INSERT запис (кредит 100)
Историята се губи при всеки записПълна история по самата конструкция
Отклонението е незасичаемо и непоправимоВсяко състояние е възпроизводимо във всеки момент
Грешките при конкурентност развалят състоянието завинагиИнвариантът на двойното записване улавя грешки
Одит означава четене на логовете на приложениетоОдит означава четене на журнала

2. Всеки паричен път е идемпотентен

Мрежите повтарят заявки. Потребителите щракат два пъти. Платежните доставчици доставят уебхуци повече от веднъж — това е документирано поведение, а не граничен случай. Всяка операция, която движи пари, трябва да е безопасна при многократно изпълнение.

  • Всяка парична операция носи ключ за идемпотентност, подаден от извикващия, уникален за логическото намерение
  • Ключът се записва с ограничение за уникалност преди страничните ефекти, а не след тях
  • Повторен ключ връща първоначалния резултат, вместо да върши работата отново
  • Обработчиците на уебхуци записват суровия payload с ключ идентификатора на събитието на доставчика и едва после обработват — така повторна доставка се разпознава дори по средата на обработката

3. Парите са цели числа в минорни единици

Плаващата запетая не може да представи десетични дроби точно, затова аритметиката върху пари във float натрупва грешка. Пазете минорните единици като цели числа (или десетичен тип с фиксирана точност) и правете валутата явна при всяка сума — сума без валута е бъг, който чака първия международен клиент.

4. Равнението е функционалност, а не последваща мисъл

Приемете, че ще има разминаване между вашия журнал и платежния доставчик — ще се случи, чрез таймаути, частични откази и корекции от страна на доставчика. Въпросът е дали ще го засечете.

  • Планирана задача, която сравнява вътрешното състояние със сетълмент данните на доставчика
  • Аларма при разминаване, с определен отговорник и runbook
  • Определен път за решаване — компенсиращи записи, никога тиха корекция
  • Прочистване на заседнали състояния: транзакции в pending по-дълго, отколкото трябва

5. Изолация, и в двата смисъла

  • Изолация на наематели — налагана на ниво данни, а не с надеждата, че всяка заявка съдържа правилния филтър
  • Изолация на отказите — бавен доставчик не бива да изчерпва пула от заявки и да събаря несвързана функционалност
  • Изолация на средите — никога тестови транзакции в продукционни журнали

6. Строете за одита, който рано или късно ще срещнете

Не. Той дава технически констатации в уговорения обхват. Правната оценка и формалната сертификация изискват съответните квалифицирани специалисти.

  • Неизменна одитна следа кой какво и кога е направил — включително вътрешните административни действия
  • Картовите данни никога да не докосват вашите сървъри, освен ако наистина възнамерявате да сте PCI-съвместими (използвайте hosted fields или hosted страница)
  • Съхранение и изтриване на данни, които наистина могат да се изпълнят при поискване
  • Контрол на достъпа, който подлежи на преглед — кой може да движи пари, кой го е одобрил
В обикновения софтуер оптимизирате за скорост на промяната. Във финтеха оптимизирате за способността по-късно да докажете точно какво се е случило и защо.

Петте въпроса към собствената ви система

  1. Ако този уебхук пристигне два пъти, променя ли се нещо втория път?
  2. Мога ли да възстановя салдото на който и да е клиент в който и да е минал момент само от журнала?
  3. Бихме ли засекли разминаване с доставчика, или клиент би ни казал?
  4. Може ли подправена заявка да прочете или премести парите на друг наемател?
  5. Ако регулатор попита кой е одобрил ръчна корекция миналия март, бихме ли отговорили за минути?

Разделяйте приемане на транзакция и сетълмент

Платежните състояния трябва да обясняват закъснели и повторени събития. Проверявайте финансови записи и процедурата за корекции.

  1. Използвайте точни десетични или цели минимални единици с валутни правила.
  2. Свързвайте събития и записи без двойно отчитане на повторения.
  3. Запазвайте оригиналите и следата на одобрените корекции.

Често задавани въпроси

Нужен ли ни е журнал с двойно записване за прост финтех продукт?

Ако държите салда или движите пари от името на потребители — да. Журналът само за добавяне не е счетоводна формалност, а точно това, което прави състоянието възстановимо, а грешките — засичаеми. Добавянето му след като салдата вече са се отклонили е далеч по-трудно от започването с него.

Кой е най-честият сериозен недостатък в ранните финтех системи?

Променливи салда без журнал, следвани плътно от липса на идемпотентност по платежните пътища и уебхуците. И двете позволяват парите да станат беззвучно грешни — режимът на отказ, който най-трудно се засича и най-трудно се отстранява после.

Трябва ли сами да съхраняваме картови данни?

Почти сигурно не. Използвайте hosted fields или hosted платежна страница на доставчик, така че картовите данни никога да не достигат вашите сървъри. Да ги обработвате сами вкарва цялата ви инфраструктура в обхвата на PCI DSS, което е сериозна постоянна тежест по съответствие и одит.

Кога финтех стартъп да направи одит на архитектурата?

Преди първото значимо увеличение на обема и преди всеки рунд, при който се очаква технически due diligence. Горните структурни решения са евтини за проверка рано и скъпи за поправка, след като през системата вече са минали реални пари.

Всички валути ли имат два десетични знака?

Не. Определете точност и закръгляване по валута и операция и проверете изискванията на доставчика. Избягвайте двоичен float при необходима точна десетична аритметика.

Искате това проверено срещу вашата система?

Одитираме финтех архитектура точно по този списък — цялост на журнала, идемпотентност, равнение, изолация.

Финтех одит →

Още по темата

Технически due diligence за инвеститори: пълното ръководство

Техническият due diligence не е code review. Той е отговор на един въпрос: колко ще струва тази технология да стигне там, където инвестиционната теза я иска?

Одит на системната архитектура: кога е нужен и какво открива

Одитът на архитектурата не е мнение за вашия стек. Той е карта на местата, където системата се чупи под плана, който наистина имате.