Në fintech shpesh na ndodh të përballim volume të konsiderueshme të të dhënash për kursin e këmbimit të valutave. Merrni të dhënat nga burime të ndryshme, dhe çdo burim ka mënyrën e tij për të ekstrapoluar vlerat e kursit për nesër, pasnesër, muajin e ardhshëm apo edhe tre vitet në vazhdim. Nëse dikush do të ishte në gjendje të parashikonte kursin, është e drejtë, do të ishte koha të mbyllnim biznesin dhe thjesht të këmbynim para nga njëra anë në tjetrën. Disa burime shijojnë besim më të madh, disa ofrojnë thjesht mbetje, me disa vlera pothuajse të sakta, por për çifte ekzotike. Puna jonë është të filtrojmë këto dhjetëra mijëra vlera në sekondë dhe të përcaktojmë se çfarë të tregojmë klientëve. Na nevojitet të filtrojmë vlerën e vetme të saktë nga tonelatat e papastërtisë, ashtu siç bëjnë flamingot gjatë drekës.

Një veçori dalluese e flamingove është beçi i tyre i madh i kënduar poshtë, me të cilin filtrojnë ushqimin nga uji ose llumi.
 âÂ
Kështu lindi biblioteka , e cila ruan cash-in e gjendjes për vlera të shumta në intervale të caktuara kohore. Nën kapak ajo filtroi në ajër të dhënat e këqija dhe të vjetra, si dhe ofron akses në të fundit N vlerat e verifikuara për çdo çelës (çift valutash, në rastin tonë).
Supozoni se ne mbledhim kursin për tre çifte valutash. Përkufizimi më i thjeshtë Vela për ruajtjen e gjendjes aktuale do të dukej si më poshtë:
defmodule Pairs do
use Vela,
eurusd: [sorter: &Kernel. 0
endPërditësimi i vlerave
funksioni do të bëjë në mënyrë të njëpasnjëshme si më poshtë:
- do të thërrasë
validatorinnë vlerën, nëse është e përcaktuar (shih kapitullin Verifikimi më poshtë); - do të shtojë vlerën ose në radhën e vlerave të mira, nëse verifikimi përfundon me sukses, ose në radhën e shërbimit
:__errors__ndryshe; - do të thërrasë sortimin nëse
sorterështë i përcaktuar për këtë çelës, ose thjesht do ta vendosë vlerën në fillim të listës (LIFO, shih kapitullin Sortimi më poshtë); - do ta privojë radhën sipas parametrin
:limittë kaluar gjatë krijimit; - do të kthejë strukturën e përditësuar
Vela.
iex|1 > çiftet = %Pairs{}
iex|2 > Vela.put(çiftet, :eurcad, 1.0)
#â %Pairs{..., eurcad: [1.0], ...}
iex|3 > Vela.put(çiftet, :eurcad, -1.0)
#â %Pairs{__errors__: [eurcad: -1.0], ...}
iex|4 > çiftet |> Vela.put(:eurusd, 2.0) |> Vela.put(:eurusd, 1.0)
#â %Pairs{... eurusd: [1.0, 2.0]}Gjithashtu Vela implementon , kĂ«shtu qĂ« mund tĂ« pĂ«rditĂ«soni vlerat duke pĂ«rdorur ndonjĂ« nga funksionet standard pĂ«r pĂ«rditĂ«simin e thellĂ« tĂ« strukturave nga arsenali : , , , , dhe .
Verifikimi
Validatori mund të për definehet si:
- një funksion jashtëm me një argument (
&MyMod.my_fun/1), ajo do të marrë vetëm vlerën për validim; - një funksion jashtëm me dy argumente,
&MyMod.my_fun/2, ajo do të marrë çiftinserie, vlerëpër validim; - moduli që implementon ;
- parametri i konfirmimit
threshold, dhe â opcionale âcompare_by, shih kapitullin Krahasimi mĂ« poshtĂ«.
Nëse validimi kalon me sukses, vlera shtohet në listën nën çelësin përkatës, përndryshe një çift {serie, vlerë} transportohet në :__errors_.
Krahasimi
Vlerat që ruhet në këto radhë, mund të jenë çfarëdo. Për të mësuar Vela të krahasojnë, duhet të kaloni compare_by parametrin në definimin e radhës (nëse vlerat nuk mund të krahasohen standardisht Kernel.</2); ky parametr duhet të ketë tipin (Vela.value() -> numër()). Në mënyrë të parazgjedhur, kjo është thjesht & &1.
Gjithashtu, në definimin e radhës mund të kaloni parametrin comparator për llogaritjen e diferencave të vlerave (min/maks); për shembull, duke kaluar Date.diff/2 si krahasues, mund të merrni diferenca të sakta për datat.
Një mënyrë tjetër e përshtatshme për të punuar është kalimi i parametrin threshold, që përcakton marrëdhënien maksimale të lejuar të vlerës së re ndaj {min, max} intervalit. Duke qenë se ajo është e caktuar në përqindje, verifikimi nuk përdor comparator, por ende përdor compare_by. Për shembull, për të caktuar një vlerë prag për kohën e datave, duhet të caktosh compare_by: &DateTime.to_unix/1 (për të marrë një vlerë të plotë) dhe threshold: 1, duke rezultuar në që vlerat e reja do të lejohet vetëm nëse ato janë në ±band intervali nga vlerat aktuale.
Në fund, mund të përdorni Vela.equal?/2 compare/2 , nëse vlerat përcaktojnë funksionin ose equal?/2compare/2 ==/2.
, atëherë këto funksione do të përdoren për krahasim, përndryshe ne thjesht përdorim
Marrja e vlerave Përpunimi i gjendjes aktuale zakonisht fillon me thirrjenVela.purge/1 validatorin , e cila heq vlerat e skaduara (nëse në lidhje metimestamps ). Pastaj mund të thirrni, e cila do kthen fjalë kyçe me emrat e rreshtave si çelësa dhe vlerat përkatëse të parave.
Gjithashtu mund të shfrytëzohet get_in/2/pop_in/2 për qasje në nivele të ulëta në vlerat në çdo rresht.
Aplikacioni
Vela mund të jetë jashtëzakonisht e dobishme si një cache të serive temporale në gjendjen e një procesi të tipit GenServer/Agent. Ne duam të mos përdorim asnjëherë vlera të skaduara të kursit, dhe për këtë thjesht mbajmë procesin me një gjendje, e cila përpunon Vela, me validatorin e treguar më poshtë.
@impl Vela.Validator
def valid?(_key, %Rate{} = rate),
do: Rate.age(rate) < @death_agedhe PĂ«rpunimi i gjendjes aktuale zakonisht fillon me thirrjen pa ndonjĂ« shqetĂ«sim heq tĂ« gjitha vlerat e skaduara çdo herĂ« qĂ« na nevojiten tĂ« dhĂ«nat. PĂ«r tĂ« aksesuar vlerat aktuale, thjesht thĂ«rrasim ). Pastaj mund tĂ« thirrni, ndĂ«rsa kur kĂ«rkohet njĂ« histori e vogĂ«l mbi kursin (e gjithĂ« seria si njĂ« e tĂ«rĂ«), thjesht e kthejmĂ« atĂ« â tashmĂ« tĂ« renditur â me vlerat e validuara.
Suksese në caching e serive temporale!
Burimi: habr.com
