Vela → nutikas vahemälu aegridade ja muu jaoks

Fintechis peame sageli töötlema üsna suuri valuutakursside andmeid. Saame andmeid erinevatest allikatest ja igaühel neist on oma idee, kuidas ekstrapoleerida homse, ülehomme, järgmise kuu ja isegi järgmise kolme aasta vahetuskursse. Kui keegi oskaks hindu ennustada õigesti, oleks aeg äri sulgeda ja lihtsalt rumalalt raha edasi-tagasi vahetada. Mõned allikad on usaldusväärsemad, mõned pakuvad täielikku prügi, harvaesinevate peaaegu õigete väärtustega, kuid eksootiliste paaride jaoks. Meie ülesanne on sõeluda läbi need kümned tuhanded väärtused sekundis ja otsustada, mida täpselt klientidele näidata. Peame välja filtreerima ühe õige väärtuse tonnide mustuse ja muda hulgast, täpselt nagu flamingod lõuna ajal teevad.

Vela → nutikas vahemälu aegridade ja muu jaoks

Flamingode eriliseks eripäraks on nende massiivne allapoole kaarduv nokk, millega nad filtreerivad toitu veest või mudast.
 - Wiki

Nii sündis raamatukogu Vela, mis salvestab oleku vahemälu mitme väärtuse jaoks kindlaksmääratud ajavahemike järel. Kapoti all filtreerib see halvad ja aegunud andmed käigu pealt välja ning annab juurdepääsu ka uusimatele N iga võtme jaoks kinnitatud väärtused (meie puhul valuutapaarid).

Oletame, et kogume kolme valuutapaari kursid. Lihtsaim määratlus Vela praeguse oleku salvestamiseks näeb see välja umbes selline:

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äärtuste värskendamine

Vela.put/3 Funktsioon teeb järjestikku järgmist.

  • põhjustab validator väärtuse kohta, kui see on määratletud (vt peatükki Kinnitamine allpool);
  • lisab väärtuse kas heade väärtuste reale, kui valideerimine õnnestus, või teenusereale :__errors__ muidu;
  • põhjustab sorteerimist, kui sorter määratud võtme jaoks või asetab väärtuse lihtsalt loendi algusesse (LIFO, vaata peatükki Сортировка allpool);
  • kärbib rida vastavalt parameetrile :limit loomist edasi andnud;
  • tagastab värskendatud struktuuri 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]}

Ka Vela rakendab Access, nii et saate väärtuste värskendamiseks kasutada mis tahes standardfunktsioone arsenali struktuuride põhjalikuks värskendamiseks Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2ja Kernel.get_and_update_in/3.

Kinnitamine

Validaatorit saab määratleda järgmiselt:

  • väline funktsioon ühe argumendiga (&MyMod.my_fun/1), saab see väärtuse ainult kinnitamiseks;
  • väline funktsioon kahe argumendiga, &MyMod.my_fun/2, ta saab paari serie, value kinnitamiseks;
  • mooduli juurutamine Vela.Validator;
  • konfiguratsiooni parameeter thresholdja - valikuliselt - compare_by, vaata peatükki võrdlus allpool.

Kui valideerimine on edukas, lisatakse väärtus vastava võtme alla loendisse, vastasel juhul korteež {serie, value} läheb :__errors_.

Võrdlus

Nendele ridadele salvestatud väärtused võivad olla mis tahes. Õpetama Vela nende võrdlemiseks on vaja üle kanda compare_by parameeter seeria määratluses (välja arvatud juhul, kui väärtusi ei saa võrrelda standardiga Kernel.</2); see parameeter peab olema tüüpi (Vela.value() -> number()). Vaikimisi on see lihtne & &1.

Samuti saate readefinitsioonile edastada parameetri comparator delta väärtuste arvutamiseks (min/max); näiteks edastades Date.diff/2 võrdluseks saad kuupäevade jaoks õiged deltad.

Teine mugav viis töötamiseks on parameetri edastamine threshold, mis määrab uue väärtuse maksimaalse lubatud suhte {min, max} intervall. Kuna see on määratud protsentides, siis tšekk ei kasuta comparatoraga kasutab ikka compare_by. Näiteks kuupäeva ja kellaaegade läviväärtuse määramiseks peate määrama compare_by: &DateTime.to_unix/1 (täisarvu väärtuse saamiseks) ja threshold: 1, mistõttu uued väärtused on lubatud ainult siis, kui need on sees ±band intervall praegustest väärtustest.

Lõpuks saate kasutada Vela.equal?/2 kahe vahemälu võrdlemiseks. Kui väärtused määratlevad funktsiooni equal?/2 või compare/2, siis kasutatakse neid funktsioone võrdluseks, muidu kasutame rumalalt ==/2.

Väärtuste saamine

Praeguse oleku töötlemine algab tavaliselt helistamisega Vela.purge/1, mis eemaldab aegunud väärtused (kui validator seotud timestamps). Seejärel saate helistada Vela.slice/1mis tuleb tagasi keyword klahvidena ridade nimed ja esimesed tegelikud väärtused.

Võite ka kasutada get_in/2/pop_in/2 madala taseme juurdepääsuks iga rea ​​väärtustele.

Taotlus

Vela võib olla äärmiselt kasulik aegrea vahemäluna protsessi olekus nagu GenServer/Agent. Soovime mitte kunagi kasutada aegunud kursuse väärtusi ja selleks hoiame protsessi lihtsalt olekuga töödeldud Vela, allpool näidatud validaatoriga.

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

и Vela.purge/1 eemaldab vaikselt kõik aegunud väärtused iga kord, kui andmeid vajame. Tegelike väärtuste juurde pääsemiseks helistame lihtsalt Vela.slice/1, ja kui on vaja väikest kursuse ajalugu (kogu seeria), tagastame selle – juba sorteeritult – kinnitatud väärtustega.

Head aegridade vahemällu salvestamist!

Allikas: www.habr.com

Lisa kommentaar