Vela → inteligenta kaŝmemoro por temposerio kaj pli
En fintech, ni ofte devas prilabori sufiĉe amasajn volumojn de valutaj kurzoj. Ni ricevas datumojn de malsamaj fontoj, kaj ĉiu el ili havas sian propran ideon pri kiel eksterpoli kurzojn por morgaŭ, postmorgaŭ, venontan monaton kaj eĉ la venontajn tri jarojn. Se nur iu povus antaŭdiri tarifojn dekstre, estus tempo fermi la komercon kaj simple stulte ŝanĝi monon tien kaj reen. Iuj fontoj estas pli fidindaj, iuj provizas kompletan rubon, kun maloftaj inkludoj de preskaŭ ĝustaj valoroj, sed por ekzotikaj paroj. Nia tasko estas kribri ĉi tiujn dekojn da miloj da valoroj por sekundo kaj determini kion precize montri al klientoj. Ni devas filtri la ĝustan valoron el tunoj da malpuraĵo kaj silto, same kiel flamengoj faras ĉe tagmanĝo.
Speciala karakterizaĵo de fenikopteroj estas ilia masiva malsupren kurba beko, per kiu ili filtras manĝaĵon el akvo aŭ koto.
- Vikio
Tiel la biblioteko naskiĝis Vela, kiu stokas ŝtatkaŝmemoron por multoblaj valoroj je specifitaj tempintervaloj. Sub la kapuĉo, ĝi filtras malbonajn kaj malmodernajn datumojn sur la flugo, kaj ankaŭ provizas aliron al la plej novaj. N validigitaj valoroj por ĉiu ŝlosilo (valutparoj, en nia kazo).
Ni diru, ke ni kolektas tarifojn por tri valutparoj. Plej simpla difino Vela por konservi la nunan staton ĝi aspektos kiel ĉi tio:
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
Ĝisdatigo de Valoroj
Vela.put/3 La funkcio faros la sekvantan sinsekve:
kaŭzos validator pri la valoro, se oni estas difinita (vidu ĉapitron Valido sube);
aldonos la valoron aŭ al la vico de bonaj valoroj se la validigo sukcesis, aŭ al la servo vico :__errors__ alie;
kaŭzos ordigon se sorter difinita por donita ŝlosilo, aŭ simple metos la valoron ĉe la kapo de la listo (VIVO, vidu ĉapitron Ordigado sube);
tranĉos la vicon laŭ la parametro :limit pasis al la kreado;
agorda parametro threshold, kaj - laŭvole - compare_by, vidu ĉapitron komparo sube.
Se validumado estas sukcesa, la valoro estas aldonita al la listo sub la responda ŝlosilo; alie, la opo {serie, value} iras al :__errors_.
Komparo
La valoroj stokitaj en ĉi tiuj vicoj povas esti io ajn. Instrui Vela por kompari ilin, necesas translokigi compare_by parametro en la seriodifino (krom se la valoroj ne povas esti komparitaj kun la normo Kernel.</2); ĉi tiu parametro devas esti de tipo (Vela.value() -> number()). Defaŭlte ĝi estas simpla & &1.
Ankaŭ, vi povas pasi parametron al la vica difino comparator por kalkuli deltajn valorojn (min/max); ekzemple per transdono Date.diff/2 kiel komparilo, vi povas akiri la ĝustajn deltojn por datoj.
Alia oportuna maniero labori estas pasi parametron threshold, kiu difinas la maksimuman permeseblan rilatumon de la nova valoro al {min, max} intervalo. Ĉar ĝi estas specifita kiel procento, la ĉeko ne uzas comparatorsed ankoraŭ uzas compare_by. Ekzemple, por specifi sojlan valoron por dataj tempoj, vi devas specifi compare_by: &DateTime.to_unix/1 (por ricevi entjeran valoron) kaj threshold: 1, igante novajn valorojn esti permesitaj nur se ili estas en ±band intervalo de la nunaj valoroj.
Fine, vi povas uzi Vela.equal?/2 por kompari du kaŝmemorojn. Se la valoroj difinas funkcion equal?/2 aŭ compare/2, tiam ĉi tiuj funkcioj estos uzataj por komparo, alie ni stulte uzas ==/2.
Akiri valorojn
Prilaborado de la nuna stato kutime komenciĝas per vokado Vela.purge/1, kiu forigas malnoviĝintajn valorojn (se validator ligita al timestamps). Vi tiam povas voki Vela.slice/1kiu revenos keyword kun vicnomoj kiel ŝlosiloj kaj la unuaj, realaj valoroj.
Vi ankaŭ povas uzi get_in/2/pop_in/2 por malaltnivela aliro al la valoroj en ĉiu vico.
Apliko
Vela povas esti ekstreme utila kiel temposeriokaŝmemoro en proceza stato kiel GenServer/Agent. Ni volas neniam uzi malnoviĝintajn kursvalorojn, kaj por fari tion ni simple konservas la procezon kun stato prilaborita Vela, kun la validigilo montrita malsupre.
и Vela.purge/1 trankvile forigas ĉiujn malnoviĝintajn valorojn ĉiufoje kiam ni bezonas la datumojn. Por aliri la realajn valorojn, ni simple vokas Vela.slice/1, kaj kiam necesas malgranda historio de la kurso (la tuta serio), ni simple resendas ĝin - jam ordigitan - kun validigitaj valoroj.