Fintechis peame sageli töötlema üsna suuri valuutakursside andmeid. Saame andmeid erinevatest allikatest ja igaühel neist on oma idee, kuidas ekstrapoleerida homse, ülehomme, järgmise kuu ja isegi järgmise kolme aasta vahetuskursse. Kui keegi oskaks hindu ennustada õigesti, oleks aeg äri sulgeda ja lihtsalt rumalalt raha edasi-tagasi vahetada. Mõned allikad on usaldusväärsemad, mõned pakuvad täielikku prügi, harvaesinevate peaaegu õigete väärtustega, kuid eksootiliste paaride jaoks. Meie ülesanne on sõeluda läbi need kümned tuhanded väärtused sekundis ja otsustada, mida täpselt klientidele näidata. Peame välja filtreerima ühe õige väärtuse tonnide mustuse ja muda hulgast, täpselt nagu flamingod lõuna ajal teevad.
Flamingode eriliseks eripäraks on nende massiivne allapoole kaarduv nokk, millega nad filtreerivad toitu veest või mudast.
- Wiki
Nii sündis raamatukogu Vela, mis salvestab oleku vahemälu mitme väärtuse jaoks kindlaksmääratud ajavahemike järel. Kapoti all filtreerib see halvad ja aegunud andmed käigu pealt välja ning annab juurdepääsu ka uusimatele N iga võtme jaoks kinnitatud väärtused (meie puhul valuutapaarid).
Oletame, et kogume kolme valuutapaari kursid. Lihtsaim määratlus Vela praeguse oleku salvestamiseks näeb see välja umbes selline:
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
Kui valideerimine on edukas, lisatakse väärtus vastava võtme alla loendisse, vastasel juhul korteež {serie, value} läheb :__errors_.
Võrdlus
Nendele ridadele salvestatud väärtused võivad olla mis tahes. Õpetama Vela nende võrdlemiseks on vaja üle kanda compare_by parameeter seeria määratluses (välja arvatud juhul, kui väärtusi ei saa võrrelda standardiga Kernel.</2); see parameeter peab olema tüüpi (Vela.value() -> number()). Vaikimisi on see lihtne & &1.
Samuti saate readefinitsioonile edastada parameetri comparator delta väärtuste arvutamiseks (min/max); näiteks edastades Date.diff/2 võrdluseks saad kuupäevade jaoks õiged deltad.
Teine mugav viis töötamiseks on parameetri edastamine threshold, mis määrab uue väärtuse maksimaalse lubatud suhte {min, max} intervall. Kuna see on määratud protsentides, siis tšekk ei kasuta comparatoraga kasutab ikka compare_by. Näiteks kuupäeva ja kellaaegade läviväärtuse määramiseks peate määrama compare_by: &DateTime.to_unix/1 (täisarvu väärtuse saamiseks) ja threshold: 1, mistõttu uued väärtused on lubatud ainult siis, kui need on sees ±band intervall praegustest väärtustest.
Lõpuks saate kasutada Vela.equal?/2 kahe vahemälu võrdlemiseks. Kui väärtused määratlevad funktsiooni equal?/2 või compare/2, siis kasutatakse neid funktsioone võrdluseks, muidu kasutame rumalalt ==/2.
Väärtuste saamine
Praeguse oleku töötlemine algab tavaliselt helistamisega Vela.purge/1, mis eemaldab aegunud väärtused (kui validator seotud timestamps). Seejärel saate helistada Vela.slice/1mis tuleb tagasi keyword klahvidena ridade nimed ja esimesed tegelikud väärtused.
Võite ka kasutada get_in/2/pop_in/2 madala taseme juurdepääsuks iga rea väärtustele.
Taotlus
Vela võib olla äärmiselt kasulik aegrea vahemäluna protsessi olekus nagu GenServer/Agent. Soovime mitte kunagi kasutada aegunud kursuse väärtusi ja selleks hoiame protsessi lihtsalt olekuga töödeldud Vela, allpool näidatud validaatoriga.
и Vela.purge/1 eemaldab vaikselt kõik aegunud väärtused iga kord, kui andmeid vajame. Tegelike väärtuste juurde pääsemiseks helistame lihtsalt Vela.slice/1, ja kui on vaja väikest kursuse ajalugu (kogu seeria), tagastame selle – juba sorteeritult – kinnitatud väärtustega.