Vela → cache intelliġenti għal serje tal-ħin u aktar

Fil-fintech, ħafna drabi jkollna nipproċessaw volumi pjuttost massivi ta’ data dwar ir-rata tal-kambju tal-munita. Nirċievu data minn sorsi differenti, u kull wieħed minnhom għandu l-idea tiegħu ta’ kif jiġu estrapolati r-rati tal-kambju għal għada, wara għada, ix-xahar id-dieħel u anke t-tliet snin li ġejjin. Kieku xi ħadd jista' jbassar ir-rati korrett, ikun iż-żmien li tagħlaq in-negozju u sempliċement ibiddel il-flus b'mod stupidu 'l quddiem u lura. Xi sorsi huma aktar affidabbli, xi jfornu żibel komplut, b'inklużjonijiet rari ta 'valuri kważi korretti, iżda għal koppji eżotiċi. Ix-xogħol tagħna huwa li ngħarbel dawn l-għexieren ta 'eluf ta' valuri kull sekonda u niddeterminaw x'se nuru eżattament lill-klijenti. Għandna bżonn niffiltraw il-valur korrett wieħed minn tunnellati ta 'ħmieġ u ħama, bħalma jagħmlu l-fjamingi waqt l-ikla ta' nofsinhar.

Vela → cache intelliġenti għal serje tal-ħin u aktar

Karatteristika speċjali li tiddistingwi l-fjamingi hija l-munqar massiv tagħhom mgħawweġ 'l isfel, li bih jiffiltraw l-ikel mill-ilma jew mit-tajn.
 - Wiki

Hekk twieldet il-librerija Vela, li jaħżen cache tal-istat għal valuri multipli f'intervalli ta 'ħin speċifikati. Taħt il-barnuża, tiffiltra data ħażina u skaduta fuq il-fly, u tipprovdi wkoll aċċess għall-aħħar N valuri validati għal kull ċavetta (pari ta’ muniti, fil-każ tagħna).

Ejja ngħidu li niġbru rati għal tliet pari ta' muniti. Definizzjoni sempliċi Vela biex taħżen l-istat attwali se tidher xi ħaġa bħal din:

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

Aġġornament tal-Valuri

Vela.put/3 Il-funzjoni se tagħmel dan li ġej f'sekwenza:

  • se jikkawża validator fuq il-valur, jekk wieħed ikun definit (ara l-kapitlu Validazzjoni hawn taħt);
  • se żżid il-valur jew mar-ringiela ta 'valuri tajbin jekk il-validazzjoni kienet ta' suċċess, jew mar-ringiela tas-servizz :__errors__ inkella;
  • se jikkawża issortjar jekk sorter definit għal ċavetta partikolari, jew sempliċiment ipoġġi l-valur fil-kap tal-lista (LIFO, ara l-kapitlu Issortja hawn taħt);
  • se trim ir-ringiela skond il-parametru :limit għadda mal-ħolqien;
  • se jirritorna l-istruttura aġġornata 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]}

Wkoll Vela timplimenta Access, sabiex tkun tista' tuża kwalunkwe mill-funzjonijiet standard għal strutturi ta' aġġornament profond mill-armament biex taġġorna l-valuri Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, u Kernel.get_and_update_in/3.

Validazzjoni

Validatur jista’ jiġi definit bħala:

  • funzjoni esterna b'argument wieħed (&MyMod.my_fun/1), se tirċievi biss il-valur għall-validazzjoni;
  • funzjoni esterna b'żewġ argumenti, &MyMod.my_fun/2, hi ser tikseb par serie, value għall-validazzjoni;
  • implimentazzjoni tal-modulu Vela.Validator;
  • parametru tal-konfigurazzjoni threshold, u - b'għażla - compare_by, ara l-kapitlu paragun hawn taħt.

Jekk il-validazzjoni tirnexxi, il-valur jiżdied mal-lista taħt iċ-ċavetta korrispondenti inkella, it-tuple {serie, value} tmur għal :__errors_.

Tqabbil

Il-valuri maħżuna f'dawn ir-ringieli jistgħu jkunu xi ħaġa. Biex tgħallem Vela biex tqabbelhom, huwa meħtieġ li tittrasferixxi compare_by parametru fid-definizzjoni tas-serje (sakemm il-valuri ma jistgħux jitqabblu mal-istandard Kernel.</2); dan il-parametru għandu jkun tat-tip (Vela.value() -> number()). B'mod awtomatiku huwa sempliċi & &1.

Ukoll, tista 'tgħaddi parametru lid-definizzjoni tar-ringiela comparator biex tikkalkula l-valuri delta (min/max); pereżempju, billi tittrasmetti Date.diff/2 bħala komparatur, tista 'tikseb id-deltas korretti għad-dati.

Mod konvenjenti ieħor biex taħdem huwa li tgħaddi parametru threshold, li jiddefinixxi l-proporzjon massimu permissibbli tal-valur il-ġdid għal {min, max} intervall. Peress li huwa speċifikat bħala persentaġġ, il-kontroll ma jużax comparatoriżda xorta juża compare_by. Pereżempju, biex tispeċifika valur limitu għad-data ħinijiet, trid tispeċifika compare_by: &DateTime.to_unix/1 (biex tikseb valur sħiħ) u threshold: 1, li tikkawża valuri ġodda li jkunu permessi biss jekk ikunu ġewwa ±band intervall mill-valuri kurrenti.

Fl-aħħarnett, tista 'tuża Vela.equal?/2 biex tqabbel żewġ caches. Jekk il-valuri jiddefinixxu funzjoni equal?/2 jew compare/2, allura dawn il-funzjonijiet se jintużaw għall-paragun, inkella aħna stupidly nużaw ==/2.

Jkollna valuri

L-ipproċessar tal-istat attwali normalment jibda bis-sejħa Vela.purge/1, li tneħħi valuri skaduti (jekk validator marbut ma timestamps). Imbagħad tista' ċċempel Vela.slice/1li se jirritorna keyword b'ismijiet ta' ringieli bħala ċwievet u l-ewwel valuri attwali.

Tista 'wkoll tuża get_in/2/pop_in/2 għal aċċess ta 'livell baxx għall-valuri f'kull ringiela.

Applikazzjoni

Vela jista 'jkun estremament utli bħala cache ta' serje ta 'żmien fi stat ta' proċess bħal GenServer/Agent. Aħna rridu li qatt ma nużaw valuri tal-kors skaduti, u biex nagħmlu dan aħna sempliċement inżommu l-proċess bl-istat ipproċessat Vela, bil-validatur muri hawn taħt.

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

и Vela.purge/1 tneħħi bil-kwiet il-valuri skaduti kollha kull darba li għandna bżonn id-dejta. Biex taċċessa l-valuri attwali aħna sempliċement insejħu Vela.slice/1, u meta tkun meħtieġa storja żgħira tal-kors (is-serje kollha), aħna sempliċement nirritornawha - diġà magħżula - b'valuri validati.

Caching tas-serje tal-ħin kuntenti!

Sors: www.habr.com

Żid kumment