Vela → cache inteligjent pĂ«r seri tĂ« dhĂ«nash dhe jo vetĂ«m

Në fintech shpeshherë na nevojitet të përpunojmë volume të mëdha të dhënash të kursit të këmbimit të monedhave. Ne marrim të dhëna nga burime të ndryshme, dhe secili prej tyre ka paraqitjen e vet mbi mënyrën se si të ekstrapolojmë vlerat e kursit për nesër, pasnesër, muajin e ardhshëm dhe madje për tre vitet e ardhshme. Nëse dikush do të dinte të parashikonte kursin duhet, do të duhej të mbyllnim biznesin dhe thjesht të këmbenim para nga ana në anë. Disa burime gëzojnë më shumë besueshmëri, disa ofrojnë vetëm plehra, me disa vlera përplot të gabuara, por që janë të sakta për çiftet ekzotike. Puna jonë është të filtrojmë këto dhjetëra mijëra vlera për sekondë dhe të përcaktojmë se çfarë ta tregojmë klientëve. Na duhet të filtrojmë vlerën e vetme të saktë nga një ton plehrash dhe baltë, sikur flamangohet gjatë drekës.

Vela → cache inteligjent pĂ«r seri tĂ« dhĂ«nash dhe jo vetĂ«m

Një veçori e veçantë e flamangoëve është beçi i madh e i lakuar poshtë, me të cilin filtrojnë ushqimin nga uji ose balta.
 — Wiki

Kështu u krijua biblioteka Vela, e cila ruan një cache të gjendjes për disa vlera në intervalet e caktuara. Në prapavijë ajo zhduket në fluturim të dhënat që janë të këqija dhe të skaduara, si dhe siguron qasje në vlerat më të fundit N të verifikuara për çdo çelës (çifti i monedhave, në rastin tonë).

Supozoni se ne mbledhim kursin për tri çiftet e monedhave. Përkufizimi më i thjeshtë Vela për ruajtjen e gjendjes aktuale do të dukej kështu:

defmodule Pairs do
  use Vela,
    eurusd: [sorter: &Kernel. 0
end

Rënia e vlerave

Vela.put/3 funksioni do të bëjë radhazi këtë:

  • do tĂ« thĂ«rrasĂ« validator nĂ« vlerĂ«, nĂ«se existon (shih kapitullin Validimi mĂ« poshtĂ«);
  • do tĂ« shtojĂ« vlerĂ«n ose nĂ« radhĂ«n e vlerave tĂ« mira, nĂ«se validimi pĂ«rfundoi me sukses, ose nĂ« radhĂ«n ndihmĂ«se :__errors__ nĂ« rastin tjetĂ«r;
  • do tĂ« thĂ«rrasĂ« sortimin nĂ«se sorter Ă«shtĂ« e pĂ«rcaktuar pĂ«r kĂ«tĂ« çelĂ«s, ose thjesht do tĂ« vendos vlerĂ«n nĂ« krye tĂ« listĂ«s (LIFO, shih kapitullin Renditja mĂ« poshtĂ«);
  • do tĂ« prajĂ« radhĂ«n nĂ« pĂ«rputhje me parametrin :limit tĂ« kaluar gjatĂ« krijimit;
  • do tĂ« kthejĂ« strukturĂ«n e azhurnuar 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]}

Po ashtu Vela implementon Access, kështu që mund të përdorni çfarëdo nga funksionet standarde për përmirësimin e thellë të strukturave nga arsenali Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, dhe Kernel.get_and_update_in/3.

Validimi

Validatori mund të përcaktohet si:

  • njĂ« funksion i jashtĂ«m me njĂ« argument (&MyMod.my_fun/1), ai do tĂ« marrĂ« vetĂ«m vlerĂ«n pĂ«r verifikim;
  • njĂ« funksion i jashtĂ«m me dy argumente, &MyMod.my_fun/2, ai do tĂ« marrĂ« çiftin serie, value pĂ«r verifikim;
  • moduli qĂ« implementon Vela.Validator;
  • parametri konfidencial pragu, dhe — opsionalisht — compare_by, shih kapitullin Krahasimi poshtĂ«.

Nëse verifikimi kalon me sukses, vlera shtohet në listën nën çelësin përkatës, përndryshe në një tupë {serie, value} dërgohet në :__errors_.

Krahasimi

Vlerat e ruajtura në këto rreshta mund të jenë çdo gjë. Për të mësuar Vela ato të krahasohen, është e nevojshme të kaloni compare_by parametrin në definimin e rreshtit (nëse vlerat nuk mund të krahasohen sipas standardit Kernel.</2); ky parametër duhet të ketë tipin (Vela.value() -> number()). Me default është thjesht & &1.

Gjithashtu, në definimin e serisë mund të kaloni parametrin comparator për të llogaritur vlerat e dëltes (min/max); për shembull, duke kaluar Date.diff/2 si komparator, mund të merrni dëlta të sakta për datat.

NjĂ« tjetĂ«r mĂ«nyrĂ« tĂ« rehatshme pĂ«r tĂ« punuar Ă«shtĂ« kalimi i parametrin pragu, i cili pĂ«rcakton raportin maksimal tĂ« pranueshĂ«m tĂ« vlerĂ«s sĂ« re ndaj {min, max} intervalit. Duke qenĂ« se Ă«shtĂ« dhĂ«nĂ« nĂ« pĂ«rqindje, kontrolli nuk pĂ«rdor comparator, por akoma pĂ«rdor compare_by. PĂ«r shembull, pĂ«r tĂ« caktuar njĂ« kufi pĂ«r vlerĂ«n e kohĂ«s sĂ« datave, duhet tĂ« спДцОфОĐșуara compare_by: &DateTime.to_unix/1 (pĂ«r tĂ« marrĂ« njĂ« vlerĂ« tĂ« plotĂ«) dhe threshold: 1, duke bĂ«rĂ« qĂ« vlerat e reja tĂ« lejohet vetĂ«m nĂ«se ato janĂ« nĂ« ±band intervalin e vlerave aktuale.

Në fund, mund të përdorni Vela.equal?/2 për të krahasuar dy cache. Nëse vlerat përcaktojnë funksionin equal?/2 ose compare/2, atëherë këto funksione do të përdoren për krahasim, përndryshe ne thjesht do të përdorim ==/2.

Marrja e vlerave

Trajtimi i gjendjes aktuale zakonisht fillon me thirrjen Vela.purge/1, i cili heq vlerat e vjetra (nëse validator është e lidhur me timestamps). Pastaj mund të thërrisni Vela.slice/1, e cila do të kthejë fjalë kyçe me emrat e rreshtave si çelës dhe vlerat e para, aktuale.

Gjithashtu mund të përdorni get_in/2/pop_in/2 për qasje në nivel të ulët në vlerat në çdo rresht.

Aplikacioni

Vela mund të jetë jashtëzakonisht e dobishme si një ruajtës për seritë e përkohshme në gjendjen e procesit të tipit GenServer/Agent. Ne dëshirojmë të mos përdorim kurrë vlerat e dala të kursit, dhe për këtë thjesht mbajmë një proces me gjendjen, e cila përpunon Vela, me një validator të treguar më poshtë.

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

dhe Vela.purge/1 lehtĂ«sisht heq tĂ« gjitha vlerat e dalura sa herĂ« qĂ« na nevojiten tĂ« dhĂ«nat. PĂ«r qasje nĂ« vlerat aktuale, thjesht e thĂ«rrasim Vela.slice/1, dhe kur kĂ«rkohet njĂ« histori e vogĂ«l e kursit (e gjithĂ« seria), thjesht e kthejmĂ« atĂ« — tashmĂ« tĂ« renditur — me vlera tĂ« verifikuara.

Suksese në ruajtjen e serive të përkohshme!

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster