Vela β†’ cache adimenduna denbora serieetarako eta gehiagorako

Fintech-en, askotan moneta-truke-tasaren datu-bolumen nahiko masiboak prozesatu behar ditugu. Iturri ezberdinetatik jasotzen ditugu datuak, eta bakoitzak bere ideia du nola estrapolatu bihar, etzi, hurrengo hilabeterako eta baita hurrengo hiru urteetarako ere. Norbaitek tasak iragar ditzake behar bezala, negozioa ixteko eta ergelki dirua atzera eta aurrera aldatzeko garaia izango litzateke. Iturri batzuk fidagarriagoak dira, beste batzuk zabor osoa hornitzen dute, balio ia zuzenen sartze arraroekin, baina bikote exotikoentzat. Gure lana segundoko hamar mila balio hauek bahetzea eta bezeroei zer erakutsi zehazki zehaztea da. Balio zuzena iragazi behar dugu tona zikinkeria eta limoetatik, flamenkoek bazkarian egiten duten bezala.

Vela β†’ cache adimenduna denbora serieetarako eta gehiagorako

Flamenkoen bereizgarri berezi bat beheranzko makurtuta dagoen moko handia da, eta horrekin janaria uretatik edo lokatzetatik iragazten dute.
 - Vicki

Horrela sortu zen liburutegia Vela, balio anitzeko egoera-cachea gordetzen duena denbora-tarte zehatzetan. Kanpaiaren azpian, datu txarrak eta zaharkituak iragazten ditu hegalean, eta azkenerako sarbidea ere ematen du. N gako bakoitzeko baliozko balioak (moneta bikoteak, gure kasuan).

Demagun hiru moneta bikoteren tasak biltzen ditugula. Definiziorik errazena Vela uneko egoera gordetzeko, itxura hau izango du:

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

Balioak eguneratzea

Vela.put/3 Funtzioak honako hau egingo du sekuentzian:

  • eragingo du validator balioari buruz, bat definitu bada (ikus kapitulua Balioztatzea behean);
  • balioa gehituko dio balio onen errenkadari baliozkotzea arrakastatsua izan bada, edo zerbitzu errenkadan :__errors__ bestela;
  • ordenatzea eragingo badu sorter gako jakin baterako definitu edo, besterik gabe, balioa zerrendaren buruan jarriko du (LIFO, ikusi kapitulua ordenatzeko behean);
  • errenkada moztuko du parametroaren arabera :limit sorkuntzara pasatu;
  • eguneratutako egitura itzuliko du 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]}

Era berean, Vela tresnak Access, beraz, funtzio estandarren bat erabil dezakezu armategiko egiturak sakon eguneratzeko balioak eguneratzeko Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, eta Kernel.get_and_update_in/3.

Balioztatzea

Balidatzaile bat honela defini daiteke:

  • kanpoko funtzioa argumentu batekin (&MyMod.my_fun/1), baliozkotzeko balioa soilik jasoko du;
  • kanpoko funtzioa bi argumenturekin, &MyMod.my_fun/2, pare bat lortuko du serie, value baliozkotzeko;
  • modulua inplementatzea Vela.Validator;
  • konfigurazio-parametroa threshold, eta - aukeran - compare_by, ikusi kapitulua konparazioa azpian.

Balioztatzea arrakastatsua bada, balioa dagokion gakoaren azpian zerrendara gehitzen da; bestela, tupla {serie, value} doa :__errors_.

konparazio

Errenkada hauetan gordetako balioak edozein izan daitezke. Irakasteko Vela horiek alderatzeko, transferitu egin behar da compare_by seriearen definizioan parametroa (balioak estandararekin alderatu ezin badira izan ezik Kernel.</2); parametro honek motakoa izan behar du (Vela.value() -> number()). Berez sinplea da & &1.

Gainera, parametro bat pasa diezaiokezu errenkaden definizioari comparator delta balioak kalkulatzeko (min/max); adibidez, transmitituz Date.diff/2 konparatzaile gisa, daten delta zuzenak lor ditzakezu.

Lan egiteko beste modu eroso bat parametro bat pasatzea da threshold, balio berriaren gehienezko ratio onargarria definitzen duena {min, max} tartea. Ehuneko gisa zehazten denez, txekea ez da erabiltzen comparatorbaina oraindik erabiltzen du compare_by. Adibidez, data-orduetarako atalase-balio bat zehazteko, zehaztu behar duzu compare_by: &DateTime.to_unix/1 (balio oso bat lortzeko) eta threshold: 1, balio berriak sartzen badira bakarrik onartzen direla eraginez Β±band uneko balioetatik tartea.

Azkenik, erabil dezakezu Vela.equal?/2 bi cache alderatzeko. Balioek funtzio bat definitzen badute equal?/2 edo compare/2, orduan funtzio hauek alderatzeko erabiliko dira, bestela ergelkeriaz erabiltzen dugu ==/2.

Balioak lortzea

Uneko egoera prozesatzea normalean deiarekin hasten da Vela.purge/1, balio zaharkituak kentzen dituena (baldin eta validator lotuta timestamps). Orduan deitu dezakezu Vela.slice/1itzuliko dena keyword errenkaden izenak gako gisa eta lehenengoak, benetako balioak.

Erabil ditzakezu get_in/2/pop_in/2 errenkada bakoitzeko balioetarako maila baxuko sarbidea izateko.

Eskaera

Vela oso erabilgarria izan daiteke denbora serieko cache gisa prozesu egoera batean GenServer/Agent. Ez dugu inoiz erabili nahi ikastaro zaharkituen balioak, eta, horretarako, prozesua egoera prozesatuarekin mantentzen dugu Vela, behean agertzen den baliozkotzailearekin.

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

ΠΈ Vela.purge/1 Datuak behar ditugun bakoitzean balio zaharkituak lasai kentzen ditu. Deitu besterik ez dugu egiten benetako balioetara sartzeko Vela.slice/1, eta ikastaroaren historia txiki bat behar denean (serie osoa), besterik gabe itzuliko dugu -dagoeneko ordenatuta- baliozko balioekin.

Zoriontsu denbora serieak cachean gordetzea!

Iturria: www.habr.com

Gehitu iruzkin berria