Fintech jomÄ mums bieži ir jÄapstrÄdÄ diezgan lieli valÅ«tas maiÅas kursa datu apjomi. MÄs iegÅ«stam datus no dažÄdiem avotiem, un katram no tiem ir savs priekÅ”stats par to, kÄ ekstrapolÄt valÅ«tas kursu rÄ«tdienai, parÄ«tdienai, nÄkamajam mÄnesim un pat nÄkamajiem trim gadiem. Ja tikai kÄds varÄtu paredzÄt likmes pareizi, bÅ«tu laiks slÄgt biznesu un vienkÄrÅ”i stulbi mainÄ«t naudu Å”urpu turpu. Daži avoti ir uzticamÄki, daži piegÄdÄ pilnÄ«gus atkritumus ar retiem gandrÄ«z pareizu vÄrtÄ«bu ieslÄgumiem, bet eksotiskiem pÄriem. MÅ«su uzdevums ir izsijÄt Å”os desmitiem tÅ«kstoÅ”u vÄrtÄ«bu sekundÄ un noteikt, ko tieÅ”i parÄdÄ«t klientiem. Mums ir jÄizfiltrÄ viena pareizÄ vÄrtÄ«ba no tonnÄm netÄ«rumu un dÅ«Åu, tÄpat kÄ flamingo dara pusdienÄs.
ÄŖpaÅ”a flamingo atŔķirÄ«gÄ iezÄ«me ir masÄ«vais uz leju izliekts knÄbis, ar kuru tie filtrÄ barÄ«bu no Å«dens vai dubļiem.
SÄkot no Wiki
TÄ radÄs bibliotÄka Vela, kas glabÄ stÄvokļa keÅ”atmiÅu vairÄkÄm vÄrtÄ«bÄm noteiktos laika intervÄlos. Zem pÄrsega tas lidojumÄ filtrÄ sliktus un novecojuÅ”us datus, kÄ arÄ« nodroÅ”ina piekļuvi jaunÄkajam N apstiprinÄtas vÄrtÄ«bas katrai atslÄgai (mÅ«su gadÄ«jumÄ valÅ«tu pÄri).
PieÅemsim, ka mÄs apkopojam kursus trim valÅ«tu pÄriem. VienkÄrÅ”ÄkÄ definÄ«cija Vela lai saglabÄtu paÅ”reizÄjo stÄvokli, tas izskatÄ«sies apmÄram Å”Ädi:
defmodule Pairs do
use Vela,
eurusd: [sorter: &Kernel.<=/2],
eurgbp: [limit: 3, errors: 1],
eurcad: [validator: Pairs]
@behaviour Vela.Validator
@impl Vela.Validator
def valid?(:eurcad, rate), do: rate > 0
end
VÄrtÄ«bu atjauninÄÅ”ana
Vela.put/3 Funkcija secÄ«gi veiks Å”Ädas darbÄ«bas:
izraisÄ«s validator par vÄrtÄ«bu, ja tÄda ir definÄta (skatiet nodaļu ValidÄcija zemÄk);
pievienos vÄrtÄ«bu vai nu labo vÄrtÄ«bu rindai, ja validÄcija bija veiksmÄ«ga, vai pakalpojumu rindai :__errors__ citÄdi;
radÄ«s ŔķiroÅ”anu, ja sorter definÄta noteiktai atslÄgai vai vienkÄrÅ”i ievietos vÄrtÄ«bu saraksta sÄkumÄ (LIFO, skatiet nodaļu ŔķiroÅ”ana zemÄk);
Ja validÄcija ir veiksmÄ«ga, vÄrtÄ«ba tiek pievienota sarakstam zem atbilstoÅ”Äs atslÄgas; pretÄjÄ gadÄ«jumÄ kortežs {serie, value} iet uz :__errors_.
SalÄ«dzinÄjums
Å ajÄs rindÄs saglabÄtÄs vÄrtÄ«bas var bÅ«t jebkas. MÄcÄ«t Vela lai tos salÄ«dzinÄtu, ir nepiecieÅ”ams pÄrsÅ«tÄ«t compare_by parametrs sÄrijas definÄ«cijÄ (ja vien vÄrtÄ«bas nevar salÄ«dzinÄt ar standartu Kernel.</2); Å”im parametram ir jÄbÅ«t tipa (Vela.value() -> number()). PÄc noklusÄjuma tas ir vienkÄrÅ”i & &1.
VÄl viens Ärts darba veids ir parametra nodoÅ”ana threshold, kas nosaka jaunÄs vÄrtÄ«bas maksimÄlo pieļaujamo attiecÄ«bu pret {min, max} intervÄls. TÄ kÄ tas ir norÄdÄ«ts procentos, Äeks neizmanto comparatorbet joprojÄm izmanto compare_by. PiemÄram, lai norÄdÄ«tu datuma un laika sliekÅ”Åa vÄrtÄ«bu, ir jÄnorÄda compare_by: &DateTime.to_unix/1 (lai iegÅ«tu veselu skaitli) un threshold: 1, tÄdÄjÄdi jaunas vÄrtÄ«bas tiek atļautas tikai tad, ja tÄs ir Ā±band intervÄlu no paÅ”reizÄjÄm vÄrtÄ«bÄm.
Visbeidzot, jÅ«s varat izmantot Vela.equal?/2 lai salÄ«dzinÄtu divas keÅ”atmiÅas. Ja vÄrtÄ«bas definÄ funkciju equal?/2 vai compare/2, tad Ŕīs funkcijas tiks izmantotas salÄ«dzinÄÅ”anai, pretÄjÄ gadÄ«jumÄ mÄs stulbi lietojam ==/2.
VÄrtÄ«bu iegÅ«Å”ana
PaÅ”reizÄjÄ stÄvokļa apstrÄde parasti sÄkas ar zvanu Vela.purge/1, kas noÅem novecojuÅ”as vÄrtÄ«bas (ja validator piesiets pie timestamps). PÄc tam varat piezvanÄ«t Vela.slice/1kas atgriezÄ«sies keyword ar rindu nosaukumiem kÄ taustiÅiem un pirmajÄm faktiskajÄm vÄrtÄ«bÄm.
Vela var bÅ«t ļoti noderÄ«ga kÄ laikrindu keÅ”atmiÅa procesa stÄvoklÄ«, piemÄram, GenServer/Agent. MÄs vÄlamies nekad neizmantot novecojuÅ”as kursa vÄrtÄ«bas, un, lai to paveiktu, process tiek vienkÄrÅ”i apstrÄdÄts ar stÄvokli Vela, izmantojot tÄlÄk parÄdÄ«to validatoru.
Šø Vela.purge/1 klusi noÅem visas novecojuÅ”Äs vÄrtÄ«bas ikreiz, kad mums ir nepiecieÅ”ami dati. Lai piekļūtu faktiskajÄm vÄrtÄ«bÄm, mÄs vienkÄrÅ”i piezvanÄm Vela.slice/1, un, ja ir nepiecieÅ”ama neliela kursa vÄsture (visa sÄrija), mÄs to vienkÄrÅ”i atgriežam ā jau sakÄrtotu ā ar apstiprinÄtÄm vÄrtÄ«bÄm.