Vela → cache jîr ji bo rêzikên demê û hêj bêtir

Di fintech de, em bi gelemperî neçar in ku cildên pir girseyî yên daneyên rêjeya danûstendina diravê bişopînin. Em daneyan ji çavkaniyên cihêreng distînin, û her yek ji wan ramana xwe heye ka meriv çawa rêjeyên danûstendinê ji bo sibe, piştî sibe, meha pêş û hetta sê salên pêş de vedihewîne. Ger tenê kesek bikaribe rêjeyan pêşbîn bike rast, ew ê dem be ku meriv karsaziyê bigire û tenê bi ehmeqî drav û paş ve biguhezîne. Hin çavkanî pêbawertir in, hin çopê bêkêmasî peyda dikin, bi tevlêbûna kêm kêm nirxên hema rast, lê ji bo zewacên biyanî. Karê me ev e ku em van deh hezaran nirxan di çirkeyê de bişopînin û diyar bikin ka bi rastî çi ji xerîdaran re nîşan bidin. Pêdivî ye ku em yek nirxa rast ji tonên ax û siltê fîltre bikin, mîna ku flamîngo di firavînê de dikin.

Vela → cache jîr ji bo rêzikên demê û hêj bêtir

Taybetmendiyek cihêreng a flamîngoyan bejna wan a girs a ber bi xwarê ye, ku bi wê re ew xwarinê ji av an heriyê parz dikin.
 - Wiki

Bi vî awayî pirtûkxane çêbû Vela, ku ji bo gelek nirxan di navberên dema diyarkirî de cacheya dewletê hilîne. Di binê kapê de, ew daneyên xirab û kevnar di firînê de fîlter dike, û di heman demê de gihîştina herî dawî peyda dike N nirxên pejirandî ji bo her mifteyê (di doza me de cotên diravî).

Ka em bêjin em rêjeyên sê cotên dirav berhev dikin. Pênaseya herî hêsan Vela ji bo hilanîna rewşa heyî ew ê tiştek wusa xuya bike:

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

Nûvekirina Nirxên

Vela.put/3 Fonksiyon dê di rêzê de jêrîn bike:

  • dê bibe sedema validator li ser nirxê, heke yek were diyar kirin (binihêre beş Validation jêrîn);
  • heke erêkirin serketî bû, dê nirxê an li rêza nirxên baş zêde bike, an jî li rêza karûbarê :__errors__ wekî din;
  • dê bibe sedema sorkirinê eger sorter ji bo mifteyek diyarkirî tête diyar kirin, an dê bi tenê nirxê bide serê navnîşê (LIFO, li beşê binêre Sort jêrîn);
  • dê rêzê li gorî pîvanê bibire :limit li ser afirandinê derbas bû;
  • dê avahiya nûvekirî vegerîne 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]}

Her wiha Vela pêk tîne Access, ji ber vê yekê hûn dikarin yek ji fonksiyonên standard ji bo nûvekirina kûr a strukturên ji arsenal bikar bînin da ku nirxan nûve bikin. Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, û Kernel.get_and_update_in/3.

Validation

Validatorek dikare wiha were pênase kirin:

  • fonksiyona derveyî bi yek arguman (&MyMod.my_fun/1), ew ê tenê ji bo pejirandinê nirxê bistîne;
  • fonksiyona derveyî bi du argumanan, &MyMod.my_fun/2, wê cotek bigre serie, value ji bo pejirandinê;
  • pêkanîna module Vela.Validator;
  • parametre veavakirina threshold, û - vebijarkî - compare_by, li beşê binêre Mûqayese jêrîn.

Ger erêkirin serketî be, nirx li navnîşê di binê mifteya têkildar de tê zêdekirin; Wekî din, tîrêjê {serie, value} diçe :__errors_.

Comparison

Nirxên ku di van rêzan de têne hilanîn dikarin her tişt bin. Ji bo hînkirinê Vela ji bo berhevdana wan, ew hewce ye ku veguherîne compare_by parametre di pênaseya rêzê de (heya ku nirx bi standard re neyên berhev kirin Kernel.</2); divê ev parametre ji cureyê be (Vela.value() -> number()). Bi xwerû ew hêsan e & &1.

Di heman demê de, hûn dikarin pîvanek ji pênase rêzê re derbas bikin comparator ji bo hejmartina nirxên delta (min/max); ji bo nimûne, bi veguhestinê Date.diff/2 wekî berhevkar, hûn dikarin deltayên rast ji bo tarîxan bistînin.

Rêbazek din a hêsan a xebatê derbaskirina pîvanek e threshold, ku rêjeya herî zêde ya destûr a nirxa nû diyar dike {min, max} navber. Ji ber ku ew wekî sedî tête diyar kirin, kontrol nayê bikar anîn comparatorlê dîsa jî bikar tîne compare_by. Mînakî, ji bo destnîşankirina nirxek sînor ji bo demên tarîxê, divê hûn diyar bikin compare_by: &DateTime.to_unix/1 (ji bo bidestxistina nirxek yekjimar) û threshold: 1, dibe sedem ku nirxên nû tenê heke tê de bin destûr bidin ±band navber ji nirxên heyî.

Di dawiyê de, hûn dikarin bikar bînin Vela.equal?/2 ji bo berhevdana du cache. Ger nirx fonksiyonek diyar dikin equal?/2 an compare/2, wê hingê dê van fonksiyonan ji bo berhevdanê werin bikar anîn, wekî din em bi ehmeqî bikar tînin ==/2.

Bidestxistina nirxan

Pêvajoya rewşa heyî bi gelemperî bi bangkirinê dest pê dike Vela.purge/1, ku nirxên kevnar jê dike (heke validator ve girêdayî ye timestamps). Hingê hûn dikarin telefon bikin Vela.slice/1ku dê vegere keyword bi navên rêzan wekî mifteyên û yekem, nirxên rastîn.

Hûn jî dikarin bikar bînin get_in/2/pop_in/2 ji bo gihîştina asta nizm a nirxên di her rêzê de.

App

Vela dikare di rewşek pêvajoyê de wekî cache-ya rêza demê pir bikêr be GenServer/Agent. Em dixwazin tu carî nirxên qursê yên kevnar bikar neynin û ji bo vê yekê em tenê pêvajoya bi dewletê re bi rê ve dibin Vela, bi erêkerê ku li jêr tê xuyang kirin.

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

и Vela.purge/1 her gava ku em hewceyê daneyê bi bêdengî hemî nirxên kevnar radike. Ji bo gihîştina nirxên rastîn em tenê gazî dikin Vela.slice/1, û gava ku dîrokek piçûk a qursê hewce ye (tevahiya rêzê), em bi tenê wê - jixwe veqetandî - bi nirxên pejirandî vedigerînin.

Veşartina rêzikên demkî xweş!

Source: www.habr.com

Add a comment