Vela → snjall skyndiminni fyrir tímaraðir og fleira

Í fintech þurfum við oft að vinna töluvert magn af gjaldeyrisgögnum. Við fáum gögn frá mismunandi aðilum og hver þeirra hefur sína eigin hugmynd um hvernig eigi að framreikna gengi á morgun, daginn eftir, næsta mánuð og jafnvel næstu þrjú ár. Bara ef einhver gæti spáð fyrir um vexti rétt, það væri kominn tími til að loka fyrirtækinu og skipta bara heimskulega peningum fram og til baka. Sumar heimildir eru áreiðanlegri, sumar bjóða upp á algjört sorp, með sjaldgæfum innifalingum af næstum réttum gildum, en fyrir framandi pör. Okkar starf er að sigta í gegnum þessi tugþúsundir gilda á sekúndu og ákvarða hvað nákvæmlega á að sýna viðskiptavinum. Við þurfum að sía út eina rétta gildið úr tonnum af óhreinindum og silti, alveg eins og flamingóar gera í hádeginu.

Vela → snjall skyndiminni fyrir tímaraðir og fleira

Sérstakur sérkennandi eiginleiki flamingóa er stórfelldur boginn goggur þeirra, sem þeir sía mat úr vatni eða leðju með.
 - Wiki

Þannig varð bókasafnið til Vela, sem geymir ástand skyndiminni fyrir mörg gildi með tilteknu millibili. Undir hettunni síar það út slæm og úrelt gögn á flugu og veitir einnig aðgang að nýjustu N staðfest gildi fyrir hvern lykil (gjaldmiðapör, í okkar tilviki).

Segjum að við söfnum gengi fyrir þrjú gjaldeyrispör. Einfaldasta skilgreiningin Vela til að geyma núverandi ástand mun það líta eitthvað svona út:

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

Uppfærir gildi

Vela.put/3 Aðgerðin mun gera eftirfarandi í röð:

  • mun valda validator um gildið, ef eitt er skilgreint (sjá kafla Staðfesting fyrir neðan);
  • mun bæta gildinu annað hvort við röðina af góðum gildum ef staðfestingin heppnaðist, eða við þjónustulínuna :__errors__ annars;
  • mun valda flokkun ef sorter skilgreint fyrir tiltekinn lykil, eða mun einfaldlega setja gildið efst á listanum (LIFO, sjá kafla Raða fyrir neðan);
  • mun klippa röðina í samræmi við færibreytuna :limit liðinn yfir sköpunina;
  • mun skila uppfærðu skipulagi 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]}

Einnig Vela verkfæri Access, svo þú getur notað hvaða stöðluðu aðgerða sem er til að djúpuppfæra mannvirki úr vopnabúrinu til að uppfæra gildi Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2og Kernel.get_and_update_in/3.

Staðfesting

Hægt er að skilgreina staðfestingaraðila sem:

  • ytri fall með einum rökum (&MyMod.my_fun/1), það mun aðeins fá gildið fyrir staðfestingu;
  • ytri fall með tveimur rökum, &MyMod.my_fun/2, hún fær par serie, value til staðfestingar;
  • mát útfærslu Vela.Validator;
  • stillingarbreytu threshold, og - valfrjálst - compare_by, sjá kafla Samanburður hér að neðan.

Ef staðfesting tekst, er gildinu bætt við listann undir samsvarandi lykli; annars er túplið {serie, value} fer til :__errors_.

Samanburður

Gildin sem geymd eru í þessum línum geta verið hvað sem er. Að kenna Vela til að bera þær saman er nauðsynlegt að flytja compare_by breytu í röð skilgreiningu (nema ekki sé hægt að bera gildin saman við staðalinn Kernel.</2); þessi færibreyta verður að vera af gerðinni (Vela.value() -> number()). Sjálfgefið er það einfalt & &1.

Einnig er hægt að senda færibreytu í línuskilgreininguna comparator til að reikna delta gildi (min/max); til dæmis með því að senda Date.diff/2 sem samanburðartæki geturðu fengið rétta deltas fyrir dagsetningar.

Önnur þægileg leið til að vinna er að senda breytu threshold, sem skilgreinir hámarks leyfilegt hlutfall nýja gildisins til {min, max} millibili. Þar sem það er tilgreint sem prósenta, notar ávísunin ekki comparatoren notar samt compare_by. Til dæmis, til að tilgreina þröskuldsgildi fyrir dagsetningartíma, verður þú að tilgreina compare_by: &DateTime.to_unix/1 (til að fá heiltölugildi) og threshold: 1, sem veldur því að ný gildi eru aðeins leyfð ef þau eru inni ±band bil frá núverandi gildum.

Að lokum geturðu notað Vela.equal?/2 að bera saman tvö skyndiminni. Ef gildin skilgreina fall equal?/2 eða compare/2, þá verða þessar aðgerðir notaðar til samanburðar, annars notum við heimskulega ==/2.

Að fá gildi

Vinnsla núverandi ástands byrjar venjulega með því að hringja Vela.purge/1, sem fjarlægir úrelt gildi (ef validator bundinn við timestamps). Þú getur þá hringt Vela.slice/1sem mun koma aftur keyword með línunöfnum sem lyklum og fyrstu raungildunum.

Þú getur líka notað get_in/2/pop_in/2 fyrir aðgang á lágu stigi að gildunum í hverri röð.

umsókn

Vela getur verið mjög gagnlegt sem tímaraðar skyndiminni í ferli eins og GenServer/Agent. Við viljum aldrei nota gömul námskeiðsgildi og til að gera þetta höldum við einfaldlega ferlinu með vinnslu ríkisins Vela, með staðfestingartækinu sem sýnt er hér að neðan.

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

и Vela.purge/1 fjarlægir hljóðlega öll gömul gildi í hvert skipti sem við þurfum gögnin. Til að fá aðgang að raunverulegum gildum hringjum við einfaldlega Vela.slice/1, og þegar krafist er lítillar sögu námskeiðsins (heildaröðin), skilum við henni einfaldlega — þegar búið er að flokka — með staðfestum gildum.

Til hamingju með tímaröð skyndiminni!

Heimild: www.habr.com

Bæta við athugasemd