Vela → smart cache don jerin lokaci da ƙari

A cikin fintech, sau da yawa dole ne mu aiwatar da adadi mai yawa na bayanan kuɗin musayar kuɗi. Muna samun bayanai daga tushe daban-daban, kuma kowannensu yana da nasa ra’ayin yadda za a fitar da kudin musaya na gobe, jibi, wata mai zuwa har ma da shekaru uku masu zuwa. Idan kawai wani zai iya hasashen ƙimar dama, zai zama lokaci don rufe kasuwancin kuma kawai wauta canza kudi da baya. Wasu kafofin sun fi dogaro, wasu suna ba da cikakkun shara, tare da ƙarancin shigar da kusan daidaitattun dabi'u, amma ga ma'aurata. Ayyukanmu shine mu raba ta cikin waɗannan dubun dubatar dabi'u a sakan daya kuma mu tantance ainihin abin da za a nuna wa abokan ciniki. Muna buƙatar tace ƙima ɗaya daidai daga ton na datti da silt, kamar yadda flamingos ke yi a abincin rana.

Vela → smart cache don jerin lokaci da ƙari

Wani fasali na musamman na flamingos shine katon baki mai lankwasa a kasa, wanda da shi suke tace abinci daga ruwa ko laka.
 - Wiki

Ta haka aka haifi ɗakin karatu Vela, wanda ke adana ma'ajin jihar don ƙima mai yawa a ƙayyadadden lokaci. Ƙarƙashin murfin, yana tace bayanai mara kyau da tsofaffi akan tashi, kuma yana ba da dama ga sababbin N ingantattun dabi'u ga kowane maɓalli (nau'i-nau'i na kuɗi, a cikin yanayinmu).

Bari mu ce muna tattara rates don nau'i-nau'i na kuɗi uku. Ma'anar mafi sauƙi Vela don adana halin yanzu zai kasance kamar haka:

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

Ana ɗaukaka Darajoji

Vela.put/3 Aikin zai yi haka a jere:

  • zai haifar validator akan darajar, idan an ayyana ɗaya (duba babi Tabbatarwa kasa);
  • zai ƙara darajar ko dai zuwa jeri na kyawawan dabi'u idan ingancin ya yi nasara, ko kuma zuwa layin sabis :__errors__ in ba haka ba;
  • zai haifar da rarrabuwa idan sorter an ayyana don maɓalli da aka ba, ko kuma za a sanya ƙimar kawai a kan lissafin (LIFO, duba babi Tacewa kasa);
  • zai datse layin bisa ga siga :limit an shige a kan halitta;
  • zai dawo da tsarin da aka sabunta 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]}

Har ila yau Vela aiwatarwa Access, don haka zaka iya amfani da kowane daidaitattun ayyuka don zurfafa sabunta tsarin daga arsenal don sabunta ƙima. Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, Da kuma Kernel.get_and_update_in/3.

Tabbatarwa

Ana iya siffanta mai inganci da:

  • aikin waje tare da hujja ɗaya (&MyMod.my_fun/1), kawai zai karɓi ƙimar don tabbatarwa;
  • aikin waje tare da dalilai guda biyu, &MyMod.my_fun/2, za ta samu biyu serie, value don tabbatarwa;
  • module aiwatarwa Vela.Validator;
  • sigar daidaitawa threshold, kuma - na zaɓi - compare_by, duba babi kwatanta a kasa.

Idan inganci ya yi nasara, ana ƙara ƙimar zuwa jeri a ƙarƙashin maɓalli mai dacewa; in ba haka ba, tuple {serie, value} ke zuwa :__errors_.

Daidaita

Ƙimar da aka adana a cikin waɗannan layuka na iya zama komai. Don koyarwa Vela don kwatanta su, wajibi ne don canja wurin compare_by siga a cikin jerin ma'anar (sai dai idan ba za a iya kwatanta ƙimar da ma'auni ba Kernel.</2); wannan siga dole ne ya zama nau'i (Vela.value() -> number()). Ta hanyar tsoho yana da sauƙi & &1.

Hakanan, zaku iya wuce siga zuwa ma'anar jere comparator don lissafta ƙimar delta (min/max); misali, ta hanyar watsawa Date.diff/2 a matsayin kwatancen, zaku iya samun daidaitattun deltas don kwanakin.

Wata hanyar da ta dace don aiki ita ce wuce siga threshold, wanda ke bayyana madaidaicin madaidaicin madaidaicin izinin sabuwar ƙima zuwa {min, max} tazara. Tunda an ayyana shi azaman kashi, cak ɗin baya amfani comparatoramma har yanzu yana amfani compare_by. Misali, don tantance ƙimar kofa don lokutan kwanan wata, dole ne ka saka compare_by: &DateTime.to_unix/1 (don samun ƙimar lamba) da threshold: 1, yana haifar da sabbin dabi'u da za a yarda kawai idan suna ciki ±band tazara daga ƙimar halin yanzu.

A karshe, za ka iya amfani Vela.equal?/2 don kwatanta cache guda biyu. Idan ƙimar sun ayyana aiki equal?/2 ko compare/2, to waɗannan ayyuka za a yi amfani da su don kwatanta, in ba haka ba muna amfani da wauta ==/2.

Samun dabi'u

Gudanar da halin yanzu yawanci yana farawa da kira Vela.purge/1, wanda ke kawar da ƙima mara amfani (idan validator daure da timestamps). Kuna iya kira Vela.slice/1wanda zai dawo keyword tare da sunaye jere azaman maɓalli kuma na farko, ainihin ƙima.

Hakanan zaka iya amfani get_in/2/pop_in/2 don samun dama ga ƙananan ƙimar ƙimar kowane jere.

Aikace-aikacen

Vela na iya zama da amfani sosai azaman ma'ajin jerin lokaci a cikin yanayin tsari kamar GenServer/Agent. Ba za mu taɓa yin amfani da darajojin darasi ba, kuma don yin wannan muna kawai kiyaye tsari tare da sarrafa jihar Vela, tare da mai tabbatarwa da aka nuna a ƙasa.

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

и Vela.purge/1 a hankali yana kawar da duk tarkacen dabi'u a duk lokacin da muke buƙatar bayanan. Don samun damar ainihin ƙimar mu kawai muna kira Vela.slice/1, kuma lokacin da ake buƙatar ƙaramin tarihin kwas ɗin (dukan jerin), muna mayar da shi kawai - an riga an jera shi - tare da ingantattun dabi'u.

Caching jerin lokutan farin ciki!

source: www.habr.com

Add a comment