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.

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.
 âÂ
Kështu u krijua biblioteka , 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
endRënia e vlerave
funksioni do të bëjë radhazi këtë:
- do të thërrasë
validatornë 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
:limittë 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 , kĂ«shtu qĂ« mund tĂ« pĂ«rdorni çfarĂ«do nga funksionet standarde pĂ«r pĂ«rmirĂ«simin e thellĂ« tĂ« strukturave nga arsenali : , , , , dhe .
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ë çiftinserie, valuepër verifikim; - moduli që implementon ;
- 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_agedhe 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
