A fintech területén gyakran kell meglehetősen nagy mennyiségű valutaárfolyam adatot feldolgoznunk. Különböző forrásokból szerezzük az adatokat, és mindegyik saját nézőpontjával rendelkezik arról, hogyan kell extrapolálni az árfolyamokat holnapra, holnaputánra, a következő hónapra és akár a következő három évre is. Ha valaki képes lenne megjósolni az árfolyamokat, akkor be lehetne zárni a céget, és egyszerűen csak ide-oda váltogatni a pénzt. kellNéhány forrás nagyobb bizalomnak örvend, míg mások szinte csak hulladékot szolgáltatnak, ritka, majdnem helyes értékekkel együtt, de egzotikus párokra. A mi munkánk abban áll, hogy átválogassuk ezeket a sok ezer értéket másodpercenként, és meghatározzuk, hogy mit mutassunk a megrendelőknek. Ki kell szűrnünk az egyetlen helyes értéket a tonnányi piszokból és iszapból, ahogy azt a flamingók teszik az étkezésük során.

A flamingók különleges megkülönböztető jele a masszív, lefelé ívelt csőrük, amellyel a vízből vagy iszapból szűrik a táplálékot.
—
Így jött létre a könyvtár , amely a megadott időintervallumokban több érték állapotának gyorsítótárát tárolja. A motor alatt valós időben kiszűri a rossz és elavult adatokat, ugyanakkor hozzáférést biztosít az utolsó N validált értékekhez minden kulcs (párok, esetünkben valuták) számára.
Tegyük fel, hogy három valutapár árfolyamait gyűjtjük. A legegyszerűbb meghatározás Vela az aktuális állapot tárolására körülbelül így nézne ki:
defmodule Pairs do
use Vela,
eurusd: [sorter: &Kernel. 0
endÉrtékek frissítése
a funkció fokozatosan a következőket fogja tenni:
- meghívja a
validatorszót,ha van ilyen (lásd a Validálás fejezetet alább); - hozzáadja az értéket, vagy a jó értékek sorába, ha a validálás sikeresen befejeződött, vagy a szolgáltatás sorába
::__errors__,ellenkező esetben; - meghívja a rendezést, ha a
sortermeghatározva van az adott kulcshoz, vagy egyszerűen csak a lista elejére teszi az értéket (LIFO, lásd a fejezetet) Rendezés fejezetet alább); - megvágja a sort a megadott
:limitparaméter szerint, amelyet a létrehozáskor adtak meg; - visszaadja a frissített struktúrát.
Vela.
iex|1 > párok = %Pairs{}
iex|2 > Vela.put(párok, :eurcad, 1.0)
#⇒ %Pairs{..., eurcad: [1.0], ...}
iex|3 > Vela.put(párok, :eurcad, -1.0)
#⇒ %Pairs{__errors__: [eurcad: -1.0], ...}
iex|4 > párok |> Vela.put(:eurusd, 2.0) |> Vela.put(:eurusd, 1.0)
#⇒ %Pairs{... eurusd: [1.0, 2.0]}Ezenkívül Vela implementál , így az értékek frissítéséhez bármelyik, a struktúrák mély frissítésére szolgáló standard funkciót felhasználhatjuk : , , , , és .
Validálás
A validátor a következőképpen definiálható:
- külső függvény egy paraméterrel (
&MyMod.my_fun/1), ez csak az érvényesítendő értéket fogja megkapni; - külső függvény két paraméterrel,
&MyMod.my_fun/2, ez megkap egy pártsorozat, értékérvényesítéshez; - modul, amely implementálja ;
- konfigurációs paraméter
küszöb, és opcionálisancompare_by, lásd a fejezetet) Összehasonlítás alatt.
Ha az érvényesítés sikeres, az érték a megfelelő kulcs alatt a listához adódik, ellenkező esetben a tuple {sorozat, érték} küldésre kerül :__errors_.
Összehasonlítás
Az ebben a táblázatban tárolt értékek bármilyenek lehetnek. Az összehasonlítás tanításához meg kell adni Vela paramétert a sor definiálásánál (ha az értékek nem hasonlíthatók össze a standard compare_by Kernel.< /2 ); ennek a paraméternek a típusa(Vela.value() -> number()) . Alapértelmezés szerint ez csak& &1 Szintén, a sor definiálásához megadhatunk egy.
comparator paramétert az értékek delta kiszámításához ( ); például, ha amin/maxDate.diff/2 komparátorként van megadva, akkor helyes deltat nyerhetünk a dátumokhoz. Egy másik kényelmes módja a munkának, ha átadunk egy paramétert,
amely meghatározza az új érték maximálisan megengedett arányát a küszöb{min, max} tartományhoz. Mivel százalékban van megadva, az ellenőrzés nem használja , de még mindig használja paramétert az értékek delta kiszámításához (. Például, ha küszöbértékeket szeretnénk meghatározni a dátumok időszakára, meg kell adni compare_bycompare_by: &DateTime.to_unix/1 (egész számú érték eléréséhez) és threshold: 1 , így az új értékeket csak akkor engedjük meg, ha azok±band tartományban vannak a jelenlegi értékektől. Végül, használhatjuk
Vela.equal?/2 összehasonlítani két cache-t. Ha az értékek definiálják a függvényt equal?/2 compare/2 vagy , akkor ezeket a függvényeket fogják használni az összehasonlításhoz, különben egyszerűenAz értékek lekérése ==/2.
A jelenlegi állapot kezelése általában a
Vela.purge/1 , amely eltávolítja az elavult értékeket (haidőbélyegre van kötve validatorszót, ). Ezután hívhatjuk meg Vela.slice/1). Ezt követően meghívhatja Vela.slice/1, amely visszatér kulcsszó sorok neveivel kulcsokként és első, aktuális értékekkel.
Használhatjuk a get_in/2/pop_in/2 az értékek alacsony szintű eléréséhez minden sorban.
Az alkalmazás
Vela nagyon hasznos lehet, mint a folyamat állapotának ideiglenes sorozatának cache-e GenServer/Ügynök. Soha nem akarunk elavult árfolyamértékeket használni, erre egyszerűen fenntartunk egy állapotkezelő folyamatot, amely kezeli Vela, az alábbi validátorral.
@impl Vela.Validator
def valid?(_key, %Rate{} = rate),
do: Rate.age(rate) < @death_ageés , amely eltávolítja az elavult értékeket (ha békésen eltávolítja az összes elavult értéket, valahányszor adatokat kérünk. Az aktuális értékek eléréséhez egyszerűen meghívjuk Vela.slice/1, és amikor egy kis történetre van szükség az árról (a teljes sorozatról), azt egyszerűen visszaadjuk - már rendezett formában - a validált értékekkel.
Sikeres ideiglenes sorozatok cache-elést!
Forrás: habr.com
