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.

Vela → intelligens gyorsítótár idősorokhoz és egyebekhez

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;
  • visszaadja a frissített szerkezetet 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]}

Is Vela megvalósítja Access, így bármelyik szabványos funkciót használhatja a struktúrák mélyreható frissítéséhez az arzenáltól az értékek frissítéséig Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2és Kernel.get_and_update_in/3.

Érvényesítés

A validátor a következőképpen definiálható:

  • külső függvény egy argumentummal (&MyMod.my_fun/1), csak az érvényesítési értéket kapja meg;
  • külső függvény két argumentummal, &MyMod.my_fun/2, kap egy párat serie, value érvényesítéshez;
  • modul megvalósítása Vela.Validator;
  • 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.

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

и 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.

Boldog idősor gyorsítótárazást!

Forrás: will.com

Hozzászólás