Vela → išmanioji talpykla laiko eilutėms ir kt

„Fintech“ srityje dažnai turime apdoroti gana didelius valiutos kurso duomenų kiekius. Duomenų gauname iš skirtingų šaltinių ir kiekvienas iš jų turi savo idėją, kaip ekstrapoliuoti valiutų kursus rytojaus, poryt, kito mėnesio ir net ateinančių trejų metų valiutų kursui. Jei tik kas nors galėtų nuspėti tarifus teisingai, būtų laikas uždaryti verslą ir tiesiog kvailai keisti pinigus pirmyn ir atgal. Kai kurie šaltiniai yra patikimesni, kai kurie tiekia visiškas šiukšles, su retais beveik teisingų verčių inkliuzais, tačiau skirtos egzotiškoms poroms. Mūsų darbas – per sekundę perskaityti šias dešimtis tūkstančių verčių ir nustatyti, ką tiksliai parodyti klientams. Turime išfiltruoti vieną teisingą vertę iš tonų purvo ir dumblo, kaip tai daro flamingai per pietus.

Vela → išmanioji talpykla laiko eilutėms ir kt

Ypatingas flamingų skiriamasis bruožas – masyvus žemyn lenktas snapas, kuriuo jie filtruoja maistą iš vandens ar purvo.
 - Wiki

Taip gimė biblioteka Vela, kuriame nustatytais laiko intervalais saugoma kelių verčių būsenos talpykla. Po gaubtu jis iškart išfiltruoja blogus ir pasenusius duomenis, taip pat suteikia prieigą prie naujausių N patvirtintos kiekvieno rakto vertės (mūsų atveju valiutų poros).

Tarkime, kad renkame trijų valiutų porų kursus. Paprasčiausias apibrėžimas Vela Norėdami išsaugoti dabartinę būseną, ji atrodys maždaug taip:

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

Vertybių atnaujinimas

Vela.put/3 Funkcija iš eilės atliks šiuos veiksmus:

  • sukels validator apie vertę, jei ji apibrėžta (žr. skyrių Patvirtinimas žemiau);
  • pridės vertę į gerų reikšmių eilutę, jei patvirtinimas buvo sėkmingas, arba į paslaugų eilutę :__errors__ kitaip;
  • sukels rūšiavimą, jei sorter apibrėžtas tam tikram raktui arba tiesiog įtrauks reikšmę sąrašo pradžioje (LIFO, žr. skyrių Rūšiuoti žemiau);
  • apkarpys eilutę pagal parametrą :limit perduotas kūrybai;
  • grąžins atnaujintą struktūrą 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]}

Taip pat Vela padargai Access, todėl galite naudoti bet kurią iš standartinių funkcijų giliai atnaujinti struktūras iš arsenalo ir atnaujinti vertes Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2ir Kernel.get_and_update_in/3.

Patvirtinimas

Valdymo priemonė gali būti apibrėžta taip:

  • išorinė funkcija su vienu argumentu (&MyMod.my_fun/1), ji gaus tik patvirtinimo vertę;
  • išorinė funkcija su dviem argumentais, &MyMod.my_fun/2, ji gaus porą serie, value patvirtinimui;
  • modulio diegimas Vela.Validator;
  • konfigūracijos parametras threshold, ir – pasirinktinai – compare_by, žr. skyrių Palyginimas žemiau.

Jei patvirtinimas sėkmingas, reikšmė pridedama prie sąrašo po atitinkamu raktu; kitu atveju eilutė {serie, value} eina į :__errors_.

Palyginimas

Šiose eilutėse saugomos reikšmės gali būti bet kokios. Mokyti Vela norint juos palyginti, būtina perkelti compare_by parametras serijos apibrėžime (nebent verčių negalima palyginti su standartu Kernel.</2); šis parametras turi būti tipo (Vela.value() -> number()). Pagal numatytuosius nustatymus tai paprasta & &1.

Taip pat galite perduoti parametrą eilutės apibrėžimui comparator apskaičiuoti delta reikšmes (min/max); pavyzdžiui, perduodant Date.diff/2 kaip palyginimo priemonę galite gauti teisingas datų deltas.

Kitas patogus darbo būdas – perduoti parametrą threshold, kuris apibrėžia didžiausią leistiną naujos reikšmės santykį su {min, max} intervalas. Kadangi jis nurodytas procentais, čekis nenaudojamas comparatorbet vis tiek naudojasi compare_by. Pavyzdžiui, norėdami nurodyti datos ir laiko slenkstinę reikšmę, turite nurodyti compare_by: &DateTime.to_unix/1 (norėdami gauti sveikąjį skaičių) ir threshold: 1, todėl naujos vertės leidžiamos tik tada, kai jos yra ±band intervalą nuo esamų verčių.

Galiausiai galite naudoti Vela.equal?/2 palyginti dvi talpyklas. Jei reikšmės apibrėžia funkciją equal?/2 arba compare/2, tada šios funkcijos bus naudojamos palyginimui, kitaip mes kvailai naudojame ==/2.

Gauti vertybes

Dabartinės būsenos apdorojimas paprastai pradedamas skambinant Vela.purge/1, kuris pašalina pasenusias reikšmes (jei validator pririštas prie timestamps). Tada galite skambinti Vela.slice/1kuri grįš keyword su eilučių pavadinimais kaip raktais ir pirmosiomis tikrosiomis reikšmėmis.

Taip pat galite naudoti get_in/2/pop_in/2 žemo lygio prieigai prie kiekvienos eilutės reikšmių.

Taikymas

Vela gali būti labai naudinga kaip laiko eilutės talpykla tokioje proceso būsenoje kaip GenServer/Agent. Norime niekada nenaudoti pasenusių kurso reikšmių, o kad tai padarytume, proceso būsena tiesiog apdorojama Vela, naudodami toliau pateiktą patvirtinimo priemonę.

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

и Vela.purge/1 tyliai pašalina visas pasenusias reikšmes kiekvieną kartą, kai mums reikia duomenų. Norėdami pasiekti tikrąsias vertes, tiesiog skambiname Vela.slice/1, o kai reikalinga nedidelė kurso istorija (visa serija), tiesiog grąžiname ją – jau surūšiuotą – su patvirtintomis reikšmėmis.

Laimingo laiko eilučių kaupimo talpykloje!

Šaltinis: www.habr.com

Добавить комментарий