Vela → intelligens gyorsítótár idősorokhoz és egyebekhez
A fintechben gyakran meglehetősen hatalmas mennyiségű valutaárfolyam-adatot kell feldolgoznunk. Különböző forrásokból kapunk adatokat, és mindegyiknek megvan a maga elképzelése arról, hogyan extrapoláljuk a holnapi, holnaputáni, jövő hónapi és akár a következő három év árfolyamait. Ha valaki meg tudná jósolni az árfolyamokat helyesen, ideje lenne bezárni az üzletet és csak hülyén pénzt váltani oda-vissza. Egyes források megbízhatóbbak, vannak, akik teljes szemetet szolgáltatnak, ritka, szinte helyes értékű zárványokkal, de egzotikus pároknak. A mi feladatunk az, hogy átszűrjük ezt a másodpercenkénti több tízezer értéket, és meghatározzuk, hogy pontosan mit mutassunk meg az ügyfeleknek. Ki kell szűrnünk az egyetlen helyes értéket a tonna szennyeződésből és iszapból, akárcsak a flamingók ebédnél.
A flamingók különleges megkülönböztető jellemzője a masszív lefelé ívelt csőr, amellyel a táplálékot szűrik a vízből vagy a sárból.
- Vicki
Így született meg a könyvtár Vela, amely meghatározott időközönként több érték állapot-gyorsítótárát tárolja. A motorháztető alatt menet közben kiszűri a rossz és elavult adatokat, emellett hozzáférést biztosít a legfrissebbekhez N érvényesített értékek minden kulcshoz (esetünkben devizapárok).
Tegyük fel, hogy három devizapár árfolyamát gyűjtjük. A legegyszerűbb meghatározás Vela az aktuális állapot tárolásához a következőképpen fog kinézni:
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
Értékek frissítése
Vela.put/3 A függvény sorrendben a következőket hajtja végre:
okoz validator az értékre, ha van megadva (lásd a fejezetet Érvényesítés lent);
hozzáadja az értéket a jó értékek sorához, ha az ellenőrzés sikeres volt, vagy a szolgáltatás sorához :__errors__ másképp;
válogatást okoz, ha sorter adott kulcshoz definiálva, vagy egyszerűen a lista élére helyezi az értéket (LIFO, lásd a fejezetet osztályozás lent);
levágja a sort a paraméternek megfelelően :limit a teremtésnek átadva;
konfigurációs paraméter thresholdés - opcionálisan - compare_by, lásd a fejezetet Compare alább.
Ha az érvényesítés sikeres, az érték hozzáadódik a listához a megfelelő kulcs alatt, ellenkező esetben a sor {serie, value} megy :__errors_.
Сравнение
Az ezekben a sorokban tárolt értékek bármiek lehetnek. Tanítani Vela összehasonlításához át kell vinni compare_by paraméter a sorozatdefinícióban (kivéve, ha az értékek nem hasonlíthatók össze a standarddal Kernel.</2); ennek a paraméternek típusúnak kell lennie (Vela.value() -> number()). Alapértelmezés szerint egyszerű & &1.
Ezenkívül átadhat egy paramétert a sordefiníciónak comparator delta értékek kiszámításához (min/max); például továbbításával Date.diff/2 összehasonlításként megkaphatja a dátumokhoz a megfelelő deltákat.
Egy másik kényelmes munkamódszer egy paraméter átadása threshold, amely meghatározza az új érték legnagyobb megengedett arányát {min, max} intervallum. Mivel százalékban van megadva, a csekk nem használja comparatorde még mindig használja compare_by. Ha például küszöbértéket szeretne megadni a dátum- és időkhöz, meg kell adnia compare_by: &DateTime.to_unix/1 (hogy egész számot kapjunk) és threshold: 1, így az új értékek csak akkor engedélyezettek, ha benne vannak ±band intervallumot az aktuális értékektől.
Végül használhatod Vela.equal?/2 két gyorsítótár összehasonlításához. Ha az értékek függvényt határoznak meg equal?/2 vagy compare/2, akkor ezeket a függvényeket összehasonlításra használjuk, különben hülyén használjuk ==/2.
Értékek megszerzése
Az aktuális állapot feldolgozása általában hívással kezdődik Vela.purge/1, amely eltávolítja az elavult értékeket (ha validator kötve timestamps). Ezután hívhat Vela.slice/1ami vissza fog térni keyword sornevekkel kulcsként és az első, tényleges értékekkel.
Használhatja is get_in/2/pop_in/2 az egyes sorok értékeinek alacsony szintű eléréséhez.
App
Vela rendkívül hasznos lehet idősor gyorsítótárként olyan folyamatállapotban, mint pl GenServer/Agent. Soha nem akarunk elavult kurzusértékeket használni, és ehhez egyszerűen a folyamatot az állapotfeldolgozott állapotban tartjuk Vela, az alább látható érvényesítővel.
и Vela.purge/1 csendesen eltávolít minden elavult értéket, valahányszor szükségünk van az adatokra. A tényleges értékek eléréséhez egyszerűen hívjuk Vela.slice/1, és amikor szükség van a kurzus egy kis előzményére (a teljes sorozatra), egyszerűen visszaküldjük - már rendezve - érvényesített értékekkel.