Vela → nutikas vahemĂ€lu ajajoonte jaoks ja mitte ainult

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.

Vela → nutikas vahemĂ€lu ajajoonte jaoks ja mitte ainult

Flamingo eripÀra on suur allapoole kumer nokk, millega nad filtreerivad toitu veest vÔi mudast.
 — Wiki

Nii sĂŒndis teekĂ€imise raamatukogu Vela, 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
end

VÀÀrtuste uuendamine

Vela.put/3 funktsioon teeb jÀrjestikku jÀrgmist:

  • kutsub vĂ€lja validatori antud 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 sorter on 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 :limit mille 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 Access, seega on vĂ”imalik vÀÀrtuste uuendamiseks kasutada mĂ”nda tavalist funktsiooni sĂŒgaval struktuuri uuendamiseks Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, ja Kernel.get_and_update_in/3.

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 paari serie, value kehtivuse jaoks;
  • moodul, mis rakendab Vela.Validator;
  • 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_age

ja , 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

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster