Vela ā†’ viedā keÅ”atmiņa laikrindām un citiem

Fintech jomā mums bieži ir jāapstrādā diezgan lieli valÅ«tas maiņas kursa datu apjomi. Mēs iegÅ«stam datus no dažādiem avotiem, un katram no tiem ir savs priekÅ”stats par to, kā ekstrapolēt valÅ«tas kursu rÄ«tdienai, parÄ«tdienai, nākamajam mēnesim un pat nākamajiem trim gadiem. Ja tikai kāds varētu paredzēt likmes pareizi, bÅ«tu laiks slēgt biznesu un vienkārÅ”i stulbi mainÄ«t naudu Å”urpu turpu. Daži avoti ir uzticamāki, daži piegādā pilnÄ«gus atkritumus ar retiem gandrÄ«z pareizu vērtÄ«bu ieslēgumiem, bet eksotiskiem pāriem. MÅ«su uzdevums ir izsijāt Å”os desmitiem tÅ«kstoÅ”u vērtÄ«bu sekundē un noteikt, ko tieÅ”i parādÄ«t klientiem. Mums ir jāizfiltrē viena pareizā vērtÄ«ba no tonnām netÄ«rumu un dūņu, tāpat kā flamingo dara pusdienās.

Vela ā†’ viedā keÅ”atmiņa laikrindām un citiem

ÄŖpaÅ”a flamingo atŔķirÄ«gā iezÄ«me ir masÄ«vais uz leju izliekts knābis, ar kuru tie filtrē barÄ«bu no Å«dens vai dubļiem.
 Sākot no Wiki

Tā radās bibliotēka Vela, kas glabā stāvokļa keÅ”atmiņu vairākām vērtÄ«bām noteiktos laika intervālos. Zem pārsega tas lidojumā filtrē sliktus un novecojuÅ”us datus, kā arÄ« nodroÅ”ina piekļuvi jaunākajam N apstiprinātas vērtÄ«bas katrai atslēgai (mÅ«su gadÄ«jumā valÅ«tu pāri).

Pieņemsim, ka mēs apkopojam kursus trim valÅ«tu pāriem. VienkārŔākā definÄ«cija Vela lai saglabātu paÅ”reizējo stāvokli, tas izskatÄ«sies apmēram Ŕādi:

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

VērtÄ«bu atjaunināŔana

Vela.put/3 Funkcija secīgi veiks Ŕādas darbības:

  • izraisÄ«s validator par vērtÄ«bu, ja tāda ir definēta (skatiet nodaļu Validācija zemāk);
  • pievienos vērtÄ«bu vai nu labo vērtÄ«bu rindai, ja validācija bija veiksmÄ«ga, vai pakalpojumu rindai :__errors__ citādi;
  • radÄ«s ŔķiroÅ”anu, ja sorter definēta noteiktai atslēgai vai vienkārÅ”i ievietos vērtÄ«bu saraksta sākumā (LIFO, skatiet nodaļu ŔķiroÅ”ana zemāk);
  • apgriezÄ«s rindu atbilstoÅ”i parametram :limit nodota radÄ«Å”anai;
  • atgriezÄ«s atjaunināto struktÅ«ru 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]}

arÄ« Vela Ä«steno Access, lai jÅ«s varētu izmantot jebkuru no standarta funkcijām dziļai struktÅ«ru atjaunināŔanai no arsenāla, lai atjauninātu vērtÄ«bas Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, un Kernel.get_and_update_in/3.

Validācija

Validatoru var definēt Ŕādi:

  • ārējā funkcija ar vienu argumentu (&MyMod.my_fun/1), tas saņems vērtÄ«bu tikai apstiprināŔanai;
  • ārējā funkcija ar diviem argumentiem, &MyMod.my_fun/2, viņa iegÅ«s pāri serie, value apstiprināŔanai;
  • moduļa ievieÅ”ana Vela.Validator;
  • konfigurācijas parametrs threshold, un pēc izvēles compare_by, skatiet nodaļu salÄ«dzinājums zemāk.

Ja validācija ir veiksmÄ«ga, vērtÄ«ba tiek pievienota sarakstam zem atbilstoŔās atslēgas; pretējā gadÄ«jumā kortežs {serie, value} iet uz :__errors_.

Salīdzinājums

Å ajās rindās saglabātās vērtÄ«bas var bÅ«t jebkas. MācÄ«t Vela lai tos salÄ«dzinātu, ir nepiecieÅ”ams pārsÅ«tÄ«t compare_by parametrs sērijas definÄ«cijā (ja vien vērtÄ«bas nevar salÄ«dzināt ar standartu Kernel.</2); Å”im parametram ir jābÅ«t tipa (Vela.value() -> number()). Pēc noklusējuma tas ir vienkārÅ”i & &1.

Varat arī nodot parametru rindas definīcijai comparator lai aprēķinātu delta vērtības (min/max); piemēram, pārraidot Date.diff/2 kā salīdzinātāju, jūs varat iegūt pareizās deltas datumiem.

Vēl viens ērts darba veids ir parametra nodoÅ”ana threshold, kas nosaka jaunās vērtÄ«bas maksimālo pieļaujamo attiecÄ«bu pret {min, max} intervāls. Tā kā tas ir norādÄ«ts procentos, čeks neizmanto comparatorbet joprojām izmanto compare_by. Piemēram, lai norādÄ«tu datuma un laika sliekŔņa vērtÄ«bu, ir jānorāda compare_by: &DateTime.to_unix/1 (lai iegÅ«tu veselu skaitli) un threshold: 1, tādējādi jaunas vērtÄ«bas tiek atļautas tikai tad, ja tās ir Ā±band intervālu no paÅ”reizējām vērtÄ«bām.

Visbeidzot, jÅ«s varat izmantot Vela.equal?/2 lai salÄ«dzinātu divas keÅ”atmiņas. Ja vērtÄ«bas definē funkciju equal?/2 vai compare/2, tad Ŕīs funkcijas tiks izmantotas salÄ«dzināŔanai, pretējā gadÄ«jumā mēs stulbi lietojam ==/2.

VērtÄ«bu iegÅ«Å”ana

PaÅ”reizējā stāvokļa apstrāde parasti sākas ar zvanu Vela.purge/1, kas noņem novecojuÅ”as vērtÄ«bas (ja validator piesiets pie timestamps). Pēc tam varat piezvanÄ«t Vela.slice/1kas atgriezÄ«sies keyword ar rindu nosaukumiem kā taustiņiem un pirmajām faktiskajām vērtÄ«bām.

Jūs varat arī izmantot get_in/2/pop_in/2 zema līmeņa piekļuvei vērtībām katrā rindā.

Pieteikums

Vela var bÅ«t ļoti noderÄ«ga kā laikrindu keÅ”atmiņa procesa stāvoklÄ«, piemēram, GenServer/Agent. Mēs vēlamies nekad neizmantot novecojuÅ”as kursa vērtÄ«bas, un, lai to paveiktu, process tiek vienkārÅ”i apstrādāts ar stāvokli Vela, izmantojot tālāk parādÄ«to validatoru.

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

Šø Vela.purge/1 klusi noņem visas novecojuŔās vērtÄ«bas ikreiz, kad mums ir nepiecieÅ”ami dati. Lai piekļūtu faktiskajām vērtÄ«bām, mēs vienkārÅ”i piezvanām Vela.slice/1, un, ja ir nepiecieÅ”ama neliela kursa vēsture (visa sērija), mēs to vienkārÅ”i atgriežam ā€” jau sakārtotu ā€” ar apstiprinātām vērtÄ«bām.

LaimÄ«gu laikrindu saglabāŔanu keÅ”atmiņā!

Avots: www.habr.com

Pievieno komentāru