Fintech-sektoris seisame sageli silmitsi suurte andmemassidega valuutakursside töötlemisel. Saame andmeid erinevatest allikatest, ja igal neist on oma viis defineerida, kuidas projitseerida kursse jĂ€rgmiseks pĂ€evaks, ĂŒlejĂ€rgmiseks pĂ€evaks, jĂ€rgmise kuu ja isegi kolme aasta kaugusele. Kui keegi oskaks kursse ennustada, oleks aeg Ă€ri sulgeda ja lihtsalt vahetada raha edasi-tagasi. Ă”igestiMĂ”ned allikad on usaldusvÀÀrsemad kui teised, mĂ”ned toovad pigem prĂŒgi, harvade peaaegu Ă”igete vÀÀrtuste vahelt, kuid siiski eksootiliste paaride jaoks. Meie ĂŒlesanne on filtreerida need kĂŒmned tuhanded vÀÀrtused sekundis ja otsustada, mida klientidele nĂ€idata. Peame vĂ€lja filtreerima ainulaadse Ă”ige vÀÀrtuse mustast august, just nagu flamingod söömisel.

Flamingo eripÀra on suur allapoole kumer nokk, millega nad filtreerivad toitu veest vÔi mudast.
 âÂ
Nii sĂŒndis teekĂ€imise raamatukogu , mis salvestab oleku vahemĂ€lu mitme vÀÀrtuse jaoks mÀÀratud ajavahemikes. Selle sisemus eemaldab reaalajas halvad ja aegunud andmed ning pakub ligipÀÀsu viimasetele N kehtestatud vÀÀrtustele igas vĂ”tmes (valuutapaarid meie puhul).
Oletame, et kogume kursse kolmele valuutapaarile. Lihtsaim mÀÀratlemine Vela kehtiva oleku salvestamiseks nÀeks vÀlja umbes nii:
defmodule Pairs do
use Vela,
eurusd: [sorter: &Kernel. 0
endVÀÀrtuste uuendamine
funktsioon teeb jÀrjestikku jÀrgmist:
- kutsub vÀlja
validatoriantud vÀÀrtuse ĂŒle, kui see on mÀÀratud (vt peatĂŒkki Kehtivus allpool); - lisab vÀÀrtuse hea vÀÀrtuste ritta, kui kehtivusĂ”pe lĂ”ppes edukalt, muul juhul siis teeninduslikku ritta
:__errors__vastu; - kutsub vÀlja sortimise, kui
sorteron antud vĂ”tme jaoks mÀÀratud vĂ”i lihtsalt lisab vÀÀrtuse nimekirja ette (LIFO, vt peatĂŒkki Sorteerimine allpool); - lĂ”ikab ritta vastavalt parameetrile
:limitmille mÀÀrasime loomisel; - tagastab uuendatud struktuuri
Vela.
iex|1 > pairs = %Pairs{}
iex|2 > Vela.put(pairs, :eurcad, 1.0)
#â %Pairs{..., eurcad: [1.0], ...}
iex|3 > Vela.put(pairs, :eurcad, -1.0)
#â %Pairs{__errors__: [eurcad: -1.0], ...}
iex|4 > pairs |> Vela.put(:eurusd, 2.0) |> Vela.put(:eurusd, 1.0)
#â %Pairs{... eurusd: [1.0, 2.0]}Samuti Vela rakendab , seega on vĂ”imalik vÀÀrtuste uuendamiseks kasutada mĂ”nda tavalist funktsiooni sĂŒgaval struktuuri uuendamiseks : , , , , ja .
Kehtivus
Kehtivus vÔib olla mÀÀratletud jÀrgmiselt:
- vĂ€lisfunktsioon, millel on ĂŒks argument (
&MyMod.my_fun/1), see saab vaid kehtivuse jaoks kontrollitava vÀÀrtuse; - vÀlisfunktsioon, millel on kaks argumenti,
&MyMod.my_fun/2, see saab paariserie, valuekehtivuse jaoks; - moodul, mis rakendab ;
- konfiguratsiooniparameeter
lĂ€vend, ja - valikuliselt -compare_by, vt peatĂŒkki VĂ”rdlus alla.
Kui kehtivus on edukalt lÀbitud, lisatakse vÀÀrtus nimekirja vastava vÔtme all, muul juhul saadetakse tuplet {serie, value} jÀrgmisse :__errors_.
VÔrdlus
Nendes ridades salvestatavad vÀÀrtused vĂ”ivad olla igasugused. Et Ă”petada Vela neid vĂ”rdlema, tuleb parameeter edastada rea mÀÀratlemisel (kui vÀÀrtusi ei saa vĂ”rrelda tavalise compare_by Kernel</2 ); see parameeter peab olema tĂŒĂŒbilt(Vela.value() -> number()) . Vaikimisi on see lihtsalt& &1 Samuti on rea mÀÀratlemisel vĂ”imalik edastada parameeter.
comparator delta vÀÀrtuste arvutamiseks ( ); nÀiteks, edastadesmin/maxDate.diff/2 vÔrreldes, vÔib saada Ôigeid deltasid kuupÀevade jaoks. Teine mugav töömeetod on parameetri edastamine
, mis mÀÀratleb maksimaalselt lubatud suhte uue vÀÀrtuse ja lĂ€vend{min, max} vahemiku vahel. Kuna see on mÀÀratud protsentides, ei kasuta kontroll , kuid kasutab siiski delta vÀÀrtuste arvutamiseks (. NĂ€iteks, et mÀÀrata kuupĂ€eva vÀÀrtuse kĂŒnnise vÀÀrtus, tuleb mĂ€rkida compare_bycompare_by: &DateTime.to_unix/1 (kuni tĂ€isarvuvÀÀrtuseni) ja threshold: 1 , mille tulemusel lubatakse uued vÀÀrtused alles siis, kui need jÀÀvad±band vahemikku praegustest vÀÀrtustest. LĂ”puks on vĂ”imalik kasutada
Vela.equal?/2 kahe vahemÀlu vÔrdlemiseks. Kui vÀÀrtused mÀÀravad funktsiooni equal?/2 compare/2 vÔi , kasutatakse neid vÔrdlemiseks, muul juhul kasutame me lihtsaltVÀÀrtuste saamine ==/2.
Praeguse oleku töötlemine algab tavaliselt kutsumisega
Vela.purge/1 , mis eemaldab aegunud vÀÀrtused (kuiseotud validatori timestampsiga). SeejÀrel on vÔimalik kutsuda Vela.slice/1, mis tagastab nimed ridadena vÔtmetena ja esimesed, kehtivad vÀÀrtused.Samuti on vÔimalik kasutada keyword get_in/2
pop_in/2 madalama taseme ligipÀÀsu saamiseks iga rea vÀÀrtustele./pop_in/2 madala taseme juurdepÀÀs iga rea vÀÀrtustele.
Rakendus
Vela vĂ”ib osutuda ÀÀrmiselt kasulikuks ajavee vahemĂ€llu hoidmiseks protsessi seisundi tĂŒĂŒbi puhul GenServer/Agent. Soovime kunagi mitte kasutada aegunud kursivÀÀrtusi, ja selleks hoiame protsessi, mille olek on töödeldud Vela, allpool nĂ€idatud valideerijaga.
@impl Vela.Validator
def valid?(_key, %Rate{} = rate),
do: Rate.age(rate) < @death_ageja , mis eemaldab aegunud vÀÀrtused (kui rahulikult eemaldab kÔik aegunud vÀÀrtused iga kord, kui andmeid vajame. Aktiivsete vÀÀrtuste saamiseks lihtsalt kutsume vÀlja nimed ridadena vÔtmetena ja esimesed, kehtivad vÀÀrtused., ja kui me vajame vÀikest ajalugu kursist (kogu seeria), tagastame selle lihtsalt - juba sorteeritud - kehtivate vÀÀrtustega.
Edu ajavee vahemÀllu hoidmisel!
Allikas: habr.com
