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.

Vela → inteligenta kaŝmemoro por temposerio kaj pli

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;
  • redonos la ĝisdatigitan strukturon 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]}

Ankaŭ Vela ilojn Access, do vi povas uzi iun el la normaj funkcioj por profunda ĝisdatigo de strukturoj de la arsenalo por ĝisdatigi valorojn. Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2Kaj Kernel.get_and_update_in/3.

Valido

Konfirmilo povas esti difinita kiel:

  • ekstera funkcio kun unu argumento (&MyMod.my_fun/1), ĝi nur ricevos la valoron por validigo;
  • ekstera funkcio kun du argumentoj, &MyMod.my_fun/2, ŝi ricevos paron serie, value por validigo;
  • efektivigo de modulo Vela.Validator;
  • 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?/2compare/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.

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

и 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.

Feliĉa temposerio kaŝmemoro!

fonto: www.habr.com

Aldoni komenton