Fintechissä joudumme usein käsittelemään melko suuria määriä valuuttakurssitietoja. Saamme tietoa eri lähteistä, ja jokaisella niistä on oma käsityksensä siitä, miten valuuttakurssit voidaan ekstrapoloida huomiselle, ylihuomenlle, ensi kuulle ja jopa seuraaville kolmelle vuodelle. Kunpa joku osaisi ennustaa hintoja oikein, olisi aika lopettaa yritys ja vaihtaa vain tyhmästi rahaa edestakaisin. Jotkut lähteet ovat luotettavampia, jotkut tarjoavat täyttä roskaa, harvinaisilla lähes oikeilla arvoilla, mutta eksoottisille pariskunnille. Tehtävämme on selata näitä kymmeniä tuhansia arvoja sekunnissa ja määrittää, mitä tarkalleen näyttää asiakkaille. Meidän on suodatettava pois yksi oikea arvo tonneista likaa ja lietettä, aivan kuten flamingot tekevät lounaalla.
Flamingojen erityispiirre on massiivinen alaspäin kaareva nokka, jolla ne suodattavat ruokaa vedestä tai mudasta.
- Wiki
Näin kirjasto syntyi Vela, joka tallentaa tilavälimuistin useille arvoille tietyin aikavälein. Konepellin alla se suodattaa huonot ja vanhentuneet tiedot lennossa ja tarjoaa myös pääsyn uusimpiin N validoidut arvot jokaiselle avaimelle (valuuttaparit, meidän tapauksessamme).
Oletetaan, että keräämme kursseja kolmelle valuuttaparille. Yksinkertaisin määritelmä Vela tallentaaksesi nykyisen tilan, se näyttää tältä:
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
Päivitetään arvoja
Vela.put/3 Funktio tekee seuraavat järjestyksessä:
aiheuttaa validator arvosta, jos sellainen on määritetty (katso luku Validointi alla);
lisää arvon joko hyvien arvojen riville, jos vahvistus onnistui, tai palveluriville :__errors__ muuten;
aiheuttaa lajittelua, jos sorter määritetty tietylle avaimelle tai asettaa arvon yksinkertaisesti luettelon alkuun (LIFO, katso luku Сортировка alla);
leikkaa rivin parametrin mukaan :limit siirretty luomiseen;
konfigurointiparametri threshold, ja - valinnaisesti - compare_by, katso luku Vertailu jäljempänä.
Jos vahvistus onnistuu, arvo lisätään luetteloon vastaavan avaimen alle; muussa tapauksessa monikko {serie, value} menee :__errors_.
vertailu
Näille riveille tallennetut arvot voivat olla mitä tahansa. Opettaa Vela niiden vertailua varten on siirrettävä compare_by parametri sarjamäärittelyssä (ellei arvoja voi verrata standardiin Kernel.</2); tämän parametrin on oltava tyyppiä (Vela.value() -> number()). Oletuksena se on yksinkertainen & &1.
Voit myös välittää parametrin rivimäärittelyyn comparator laskea delta-arvot (min/max); esimerkiksi lähettämällä Date.diff/2 vertailukohtana voit saada oikeat deltat päivämäärille.
Toinen kätevä tapa työskennellä on parametrin välittäminen threshold, joka määrittää uuden arvon suurimman sallitun suhteen {min, max} intervalli. Koska se on määritetty prosentteina, sekki ei käytä comparatormutta käyttää silti compare_by. Jos esimerkiksi haluat määrittää kynnysarvon päivämäärille, sinun on määritettävä compare_by: &DateTime.to_unix/1 (kokonaisluvun saamiseksi) ja threshold: 1, jolloin uudet arvot sallitaan vain, jos ne ovat sisällä ±band aikaväli nykyisistä arvoista.
Lopuksi voit käyttää Vela.equal?/2 vertailla kahta välimuistia. Jos arvot määrittelevät funktion equal?/2 tai compare/2, niin näitä toimintoja käytetään vertailuun, muuten käytämme tyhmästi ==/2.
Arvojen saaminen
Nykyisen tilan käsittely alkaa yleensä soittamalla Vela.purge/1, joka poistaa vanhentuneet arvot (jos validator sidottu timestamps). Voit sitten soittaa Vela.slice/1joka tulee takaisin keyword rivien nimet avaimina ja ensimmäiset todelliset arvot.
Voit myös käyttää get_in/2/pop_in/2 jokaisen rivin arvojen matalan tason pääsyä varten.
Sovellus
Vela voi olla erittäin hyödyllinen aikasarjavälimuistina prosessitilassa, kuten GenServer/Agent. Emme halua koskaan käyttää vanhentuneita kurssiarvoja, ja tätä varten pidämme prosessin tilassa käsiteltynä Vela, alla näkyvällä validaattorilla.
и Vela.purge/1 poistaa hiljaa kaikki vanhentuneet arvot aina, kun tarvitsemme tietoja. Päästäksemme todellisiin arvoihin soitamme Vela.slice/1, ja kun vaaditaan pieni kurssin historia (koko sarja), palautamme sen - jo lajiteltuna - validoiduilla arvoilla.