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.

Ī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
Tā radās bibliotēka , 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
endVērtību atjaunināšana
Funkcija secīgi veiks šādas darbības:
- izraisīs
validatorpar 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
sorterdefinē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
:limitnodota 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 , 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 : , , , , un .
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āriserie, valueapstiprināšanai; - moduļa ieviešana ;
- konfigurācijas parametrs
threshold, un pēc izvēlescompare_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
