davanu kartes

Integrēt dāvanu kartes internetā uzņēmuma sistēmās bez haosa

Dāvanu karšu ieviešana e-komercijā izskatās trivāla… līdz brīdim, kad tās jāintegrē ar maksājumiem, noliktavu un grāmatvedību 😬 Tad sākas nekonsekventi stāvokļi, dubultas validācijas un spoku atlikumi. Šeit ejam dziļāk. Kā uzbūvēt arhitektūru, kur dāvanu kartes internetā strādā deterministiski, auditējami un bez tehniskā parāda. Papildus pieskaramies drošībai (https://itpeople.lv/cik-drosas-ir-davanu-kartes-interneta-no-it-skatpunkta/) un reālām integrācijas niansēm.

Praktiska ietekme skaitļos

Pirms arhitektūras. Ātri sanity check ar skaitļiem.

Dubultas norakstīšanas izmaksas

Ja dienā ir 200 redeem pieprasījumi un 1% gadījumu retry rada dubultu norakstīšanu. 200 × 1% = 2 kļūdaini darījumi dienā. Vidējā karte 30 € dod 2 × 30 = 60 € dienā. Mēnesī ~ 1800 € noplūde, ja nav idempotences.

Nesinhronizēti atlikumi ERP

Ja ERP atpaliek par 0.5% no 10 000 € izlaisto karšu apjoma:
10 000 × 0.5% = 50 € neatbilstība
Auditā tas nozīmē manuālu korekciju stundas × cilvēkresurss.

Webhook dublikātu slodze

Pie 5000 notikumiem dienā un at-least-once piegādes:
pieņemsim 5% dublikāti → 250 lieki eventi
Ja apstrāde maksā 5 ms CPU, tas ir 1.25 s/dienā, nieks… līdz brīdim, kad pieaug x100.

sistemas integracija

Integrācijas slāņu sadalījums

Tipiska kļūda. Visu loģiku ielikt e-veikala backendā.

Rezultāts ir cieša sasaite un grūti refaktori.

Sadaliet domēnos:

  • gift-card service (issuance, balance, redemption)
  • checkout/maksājumu serviss
  • ERP/grāmatvedības adapteris

Izveidojiet gift-card-service ar savu datu modeli (karte, atlikums, transakcijas). Nevis paļaujieties uz e-veikala tabulām. Tas dod izolāciju un skaidrus API kontraktus.

API kontrakti un versēšana

API jābūt idempotentam un versētam. Bez kompromisiem.

Idempotenti pieprasījumi

Redeem operācijai izmantojiet Idempotency-Key, lai retry nerada dubultu norakstīšanu.

  • POST /redeem
  • headers Idempotency-Key UUID
  • body cardid, amount, orderid

Serveris glabā atslēgu un pie atkārtota pieprasījuma atgriež identisku rezultātu.

Versiju pārvaldība

Neplēsiet klientus ar breaking changes.

  • /v1/redeem, /v2/redeem
  • vai header-based versioning

Schema evolution > ātri hotfixi.

klientu maksajumi

Webhook dizains praksē

Webhooki ātri pārvēršas par haosu, ja nav disciplīnas.

Piegādes garantijas

Pieņemiet at-least-once.

  • notikumi var atkārtoties
  • patērētājam jābūt idempotentam

Notikumu struktūra

Standartizējiet payload:

  • event_type giftcard.redeemed
  • event_id UUID
  • occurred_at ISO8601
  • data { cardid, amount, orderid }

Glabājiet event_id, lai izslēgtu dubultu apstrādi.

Datu sinhronizācija starp sistēmām

Šeit visbiežāk rodas drift un kāpēc cipari nesakrīt? moments 😅

Event driven pieeja

Publicējiet notikumus (Kafka, SQS u.c.):

  • giftcard.issued
  • giftcard.redeemed
  • giftcard.refunded

ERP patērē un veido ledger ierakstus. Loose coupling, mazāk sāpju.

Periodiska reconcile

Pat ar eventiem vajag reconcile jobu:

  • salīdzina atlikumus
  • atrod neatbilstības
  • ģenerē korekcijas

Bez šī agrāk vai vēlāk būs mums kaut kas nesakrīt.

digitala platforma

Dubultas validācijas slazdi

Bieži validācija notiek gan checkoutā, gan gift-card servisā… ar atšķirīgiem noteikumiem.

Risinājums:

  • viens source of truth
  • checkout orkestrē
  • gift-card serviss validē
  • checkout uzticas atbildei

Pretējā gadījumā garantēti būs edge case konflikti.

Transakciju modelis bez ACID

Distributed ACID šeit parasti ir overkill.

Izmantojiet saga modeli:

  1. Rezervē summu (hold)
  2. Apstiprina maksājumu
  3. Finalizē redeem

Ja 2. solis failo → kompensācija (release hold).

e komercija

Grāmatvedības integrācija

Dāvanu kartes = saistības (liability), nevis ieņēmumi.

Tehniski:

  • issuance → debit cash, credit deferred revenue
  • redeem → debit deferred revenue, credit revenue

ERP adapterim jāstrādā ar unikāliem event_id, lai nebūtu dublikātu.

Arhitektūras ieteikumi praksē

Vienots identifikators visur

Izmantojiet vienu order_id across sistēmām. Traceability kļūst daudz vienkāršāka.

Observability instrumenti

Ieviesiet:

  • distributed tracing (OpenTelemetry)
  • structured logs ar correlation_id

Bez šī debug būs minēšana.

Retry un kļūdu apstrāde

  • exponential backoff
  • dead-letter queue webhookiem

Pretējā gadījumā kļūdas pazūd.

Kur rodas tehniskais parāds

  • biznesa loģika izkaisīta vairākos servisos
  • webhook bez versijas un shēmas
  • tieši DB savienojumi starp sistēmām

Šie trīs punkti = nākotnes refaktoru rēķins.

Reāls konteksts Latvijā

Latvijā pieaug uzsvars uz tehnoloģiju prasmēm, piemēram, Google MI apmācības. Tas tieši ietekmē to, kā tiek projektētas šādas integrācijas, vairāk event-driven, vairāk datu disciplīnas.

Arī finanšu sektorā (piemēram, kredītu sistēmās, kā redzams Netcredit.lv datos) konsekvence un auditējamība ir kritiska, tās pašas problēmas parādās arī dāvanu karšu risinājumos. Dubultas transakcijas, neatbilstoši atlikumi, retry edge case.

Lietošanas scenāriji praksē

Pat šķietami vienkāršā gadījumā, kā izvēloties Dāvanu kartes konkrētai auditorijai, backendā notiek:

  • atlikuma pārvaldība
  • validācija
  • notikumu sinhronizācija
  • grāmatvedības ieraksti

UI vienkāršs. Backend… ne tik ļoti.

Ko darīt tālāk

Ja plānojat ieviest vai refaktorēt. Atdaliet domēnus un veidojiet dedicated servisu, ieviesiet idempotentus API un eventus, pārejiet uz event-driven sinhronizāciju, pievienojiet reconcile procesus. Rezultātā iegūsiet sistēmu, kur dāvanu kartes internetā nav edge case, bet stabils, prognozējams komponents, kas iztur gan slodzi, gan auditu.