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

Finantstehnoloogia valdkonnas peame tihti töötlema ĂŒsna suuri valuutakursi andmehulkasid. Me saame andmeid erinevatest allikatest, ja igaĂŒhel neist on oma tĂ”lgendus, kuidas projitseerida kursse homme, ĂŒlehomme, jĂ€rgmisel kuul ja isegi jĂ€rgmistel kolmel aastal. Kui keegi oskaks kursse ennustada, oleks mĂ”istlik ettevĂ”te lĂ”petada ja lihtsalt raha edasi-tagasi vahetada. Ă”igestiMĂ”ned allikad on usaldusvÀÀrsemad, mĂ”ned pakuvad puhtalt prĂŒgi, haruldaste peaaegu Ă”igete vÀÀrtuste sissekannetega, kuid eksootiliste paaride jaoks. Meie töö on filtreerida need kĂŒmned tuhanded vÀÀrtused sekundis ning mÀÀrata, mida nĂ€idata klientidele. Peame filtreerima ainulaadse Ă”ige vÀÀrtuse tonni mustuse ja mudase seest, nagu flamingod lĂ”unasöögi ajal.

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

Flamingo eristav tunnus on suur allapoole kÔverdatud nokk, millega nad filtreerivad toitu veest vÔi mudast.
 — Wiki

Nii sĂŒndis teekond Vela, mis salvestab olekukĂ€igu mitme vÀÀrtuse jaoks mÀÀratud ajavahemikes. Selle all toimub halvimate ja aegunud andmete automaatne filtreerimine ning juurdepÀÀs viimastele N kontrollitud vÀÀrtustele iga vĂ”tme (valuutapaaride, meie juhul) jaoks.

Oletame, et kogume kursse kolmele valuutpaarile. Lihtsaim mÀÀratlus Vela aktiivsete seisundite salvestamiseks nÀeks vÀlja nii:

defmodule Pairs do
  use Vela,
    eurusd: [sorter: &Kernel. 0
end

VÀÀrtuste vÀrskendamine

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

  • kutsub esile validator vĂ€ljaande vÀÀrtuse peale, kui see on mÀÀratud (vt peatĂŒkk Valideerimine allpool);
  • lisab vÀÀrtuse kas heade vÀÀrtuste rikka, kui validatsioon Ă”nnestus, vĂ”i teenindusliku rea :__errors__ vastasel juhul;
  • kutsub esile sortimise, kui sorter on selle vĂ”tme jaoks mÀÀratud, vĂ”i lihtsalt paneb vÀÀrtuse nimekirja ette (LIFO, vt peatĂŒkk Sorteerimine allpool);
  • lĂ”ikab rida vastavalt parameetrile :limit mis on loomisel edastatud;
  • tagastab vĂ€rskendatud 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, nii et vÀÀrtuste uuendamiseks vĂ”ib kasutada mĂ”nda tavalist struktuuride sĂŒgava uuendamise funktsioonidest Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, ja Kernel.get_and_update_in/3.

Valideerimine

Validaator vÔib olla mÀÀratletud kui:

  • vĂ€lisfunktsioon ĂŒhe argumendiga (&MyMod.my_fun/1), see saab ainult kontrollimise vÀÀrtuse;
  • vĂ€lisfunktsioon kahe argumendiga, &MyMod.my_fun/2, see saab paari serie, value kontrollimiseks;
  • moodul, mis rakendab Vela.Validator;
  • konfigureerimisparameeter threshold, ja - valikuliselt - compare_by, vt peatĂŒkk Comparison allpool.

Kui kontrollimine on edukas, lisatakse vÀÀrtus vastava vÔtme alla nimekirja, vastasel juhul saadetakse tuple {serie, value} aadressile :__errors_.

VÔrdlus

Nendes ridades salvestatavad vÀÀrtused vĂ”ivad olla mis tahes. Et Ă”petada Vela neid vĂ”rdlema, tuleb edastada compare_by parameeter rida mÀÀratlusse (kui vÀÀrtusi ei saa vĂ”rrelda tavalise Kernel.<\/2); see parameeter peab olema tĂŒĂŒbiga (Vela.value() -> number()). Vaikimisi on see lihtsalt & &1.

Samuti vÔib rida mÀÀratlusse edastada parameetri comparator delta vÀÀrtuste arvutamiseks (min/max); nÀiteks edastades Date.diff/2 komparatoorina, on vÔimalik saada korrektsed deltid kuupÀevade jaoks.

Teine mugav viis töötamiseks on parameetri edastamine threshold, mis mÀÀrab maksimaalse lubatava suhte uue vÀÀrtuse ja {min, max} vahemiku vahel. Kuna see on vĂ€ljendatud protsentides, ei kasuta kontroll comparator, kuid kasutab endiselt compare_by. NĂ€iteks, et mÀÀrata kĂŒnnis kuupĂ€eva vÀÀrtuste jaoks, tuleb mĂ€rkida compare_by: &DateTime.to_unix/1 (tĂ€isarvuline vÀÀrtus) ja threshold: 1, mille tulemuseks on, et uued vÀÀrtused on lubatud ainult siis, kui nad on ±band vahe ulatuses praegustest vÀÀrtustest.

LÔpuks saab kasutada Vela.equal?/2 compare/2 , et vÔrrelda kahte vahemÀlu. Kui vÀÀrtused mÀÀravad funktsiooni vÔi equal?/2compare/2 ==/2.

, siis neid funktsioone kasutatakse vÔrdlemiseks, vastasel juhul kasutame lihtsalt

VÀÀrtuste saamine Praeguse oleku töötlemine algab tavaliselt kÔnegaVela.purge/1 validator , mis eemaldab aegunud vÀÀrtused (kui seondubajatempleid). SeejÀrel saab kutsuda Vela.slice/1, mis tagastab mÀrksÔna ridade nimed vÔtmetena ja esimesed, kehtivad vÀÀrtused.

Samuti saab kasutada get_in/2/pop_in/2 madalama taseme juurdepÀÀsuks vÀÀrtustele igas reas.

Rakendus

Vela vĂ”ib osutuda ÀÀrmiselt kasulikuks ajasari vahemĂ€lu kui protsessi tĂŒĂŒp GenServer/Agent. Me ei taha kunagi kasutada aegunud kursi vÀÀrtusi ja selleks hoiame lihtsalt protsessi olekut, mida töödeldakse Vela, koos valideerijaga, mis on nĂ€idatud allpool.

@impl Vela.Validator
def valid?(_key, %Rate{} = rate),
  do: Rate.age(rate) < @death_age

ja Praeguse oleku töötlemine algab tavaliselt kĂ”nega rahulikult eemaldab kĂ”ik aegunud vÀÀrtused iga kord, kui vajame andmeid. Aktiivsete vÀÀrtuste juurde pÀÀsemiseks kutsume lihtsalt Vela.slice/1, ja kui vajame vĂ€ikest ajalugu kursist (kogu rida tervikuna), tagastame selle lihtsalt – juba sorteerituna – valideeritud vÀÀrtustega.

Edu ajavahemike vahemÀlu loomisel!

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster