2 min lasīšanai
Problēma, ko neviens neplāno
Platforma nosūta pieteikumu, bet atbilde neatnāk — savienojums pārtrūka, serveris atbildēja pārāk lēni vai lietotājs vēlreiz nospieda pogu. Loģiskākā rīcība ir mēģināt vēlreiz. Bet ko tad, ja pirmais pieprasījums patiesībā bija veiksmīgs?
Bez aizsardzības kreditētājs saņem divus vienādus pieteikumus. Klientam tas var nozīmēt dubultu kredītvēstures pārbaudi, divus zvanus no kreditētāja vai mulsinošus, dublētus piedāvājumus. Platformai — sarežģītus labojumus un neapmierinātu partneri.
Kas ir idempotence
Pieprasījums ir idempotents, ja to var atkārtot jebkuru reižu skaitu, bet rezultāts paliek tāds pats kā pēc pirmās reizes. Lai to panāktu, katram pieteikumam vajag unikālu identifikatoru, ko piešķir pati platforma — piemēram, savu iekšējo pieteikuma numuru.
Kā tas strādā Apifly
Katrā pieprasījumā platforma norāda savu pieteikuma identifikatoru client_submission_id:
POST /api/submissions
{
"client_submission_id": "app-10482",
"lender_codes": ["lender-a", "lender-b"],
"applicant": { ... },
"application": { "amount": 3000, "term_months": 24 }
}
- Saņemot pieteikumu pirmo reizi, Apifly to saglabā, nosūta izvēlētajiem kreditētājiem un atbild ar
202 Accepted. - Ja tas pats
client_submission_idpienāk vēlreiz, Apifly atgriež jau saglabāto pieteikumu ar200 OKun nesūta to kreditētājiem atkārtoti.
Tātad pēc statusa koda uzreiz redzams, vai pieteikums tikko pieņemts vai bija jau zināms, un pēc jebkuras tīkla kļūdas var droši mēģināt vēlreiz.
Tas pats princips arī atpakaļceļā
Arī kreditētāji mēdz vienu un to pašu atbildi nosūtīt vairākas reizes. Apifly identiskas atkārtotas atbildes atfiltrē, tāpēc tās nemaina pieteikuma stāvokli un neizraisa liekus paziņojumus jūsu sistēmai. Savukārt katram webhook paziņojumam ir stabils event_id, lai dublikātus varētu atpazīt arī jūsu pusē.
Secinājums
Idempotence nav papildu funkcija, bet pamatprasība jebkurai integrācijai, kas strādā ar finansēm un personas datiem. To ir vērts ieviest vienreiz savienotājā, nevis atsevišķi katrā integrācijā ar katru kreditētāju.