Vela β†’ akiba mahiri kwa mfululizo wa saa na zaidi

Katika fintech, mara nyingi tunalazimika kuchakata data kubwa kabisa ya kiwango cha ubadilishaji wa sarafu. Tunapata data kutoka kwa vyanzo tofauti, na kila moja ina wazo lake la jinsi ya kuongeza viwango vya kubadilisha fedha vya kesho, keshokutwa, mwezi ujao na hata miaka mitatu ijayo. Ikiwa tu mtu anaweza kutabiri viwango usahihi, itakuwa wakati wa kufunga biashara na kubadilisha pesa kwa ujinga tu na kurudi. Vyanzo vingine ni vya kuaminika zaidi, vingine vinatoa takataka kamili, na inclusions adimu ya maadili karibu sahihi, lakini kwa wanandoa wa kigeni. Kazi yetu ni kuchuja makumi ya maelfu ya maadili kwa sekunde na kuamua ni nini hasa cha kuonyesha kwa wateja. Tunahitaji kuchuja thamani moja sahihi kutoka kwa tani za uchafu na matope, kama vile flamingo hufanya wakati wa chakula cha mchana.

Vela β†’ akiba mahiri kwa mfululizo wa saa na zaidi

Sifa maalum ya kutofautisha ya flamingo ni mdomo wao mkubwa uliopinda chini, ambao huchuja chakula kutoka kwa maji au matope.
 - Wiki

Kwa hivyo maktaba ilizaliwa Vela, ambayo huhifadhi akiba ya serikali kwa thamani nyingi kwa vipindi maalum vya wakati. Chini ya kofia, huchuja data mbaya na ya zamani kwenye kuruka, na pia hutoa ufikiaji wa hivi karibuni N maadili yaliyothibitishwa kwa kila ufunguo (jozi za sarafu, kwa upande wetu).

Wacha tuseme tunakusanya viwango vya jozi tatu za sarafu. Ufafanuzi rahisi zaidi Vela kuhifadhi hali ya sasa itaonekana kitu kama hiki:

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

Inasasisha Maadili

Vela.put/3 Kitendaji kitafanya yafuatayo kwa mlolongo:

  • itasababisha validator juu ya thamani, ikiwa moja imefafanuliwa (tazama sura Uthibitishaji chini);
  • itaongeza thamani ama kwa safu ya maadili mazuri ikiwa uthibitishaji ulifanikiwa, au kwenye safu ya huduma :__errors__ vinginevyo;
  • itasababisha upangaji ikiwa sorter imefafanuliwa kwa ufunguo uliopewa, au itaweka tu dhamana kwenye kichwa cha orodha (LIFO, tazama sura Panga chini);
  • itapunguza safu kulingana na parameta :limit kupita juu ya uumbaji;
  • itarudisha muundo uliosasishwa 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]}

Pia Vela zana Access, kwa hivyo unaweza kutumia kazi zozote za kawaida za kusasisha miundo ya kina kutoka kwa safu ya uokoaji kusasisha maadili. Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, na Kernel.get_and_update_in/3.

Uthibitishaji

Mthibitishaji anaweza kufafanuliwa kama:

  • kazi ya nje na hoja moja (&MyMod.my_fun/1), itapokea tu thamani ya uthibitisho;
  • kazi ya nje yenye hoja mbili, &MyMod.my_fun/2, atapata jozi serie, value kwa uthibitisho;
  • utekelezaji wa moduli Vela.Validator;
  • parameta ya usanidi threshold, na - kwa hiari - compare_by, tazama sura kulinganisha chini.

Ikiwa uthibitishaji umefaulu, thamani huongezwa kwenye orodha chini ya kitufe kinacholingana; vinginevyo, nakala {serie, value} huenda kwa :__errors_.

Kulinganisha

Thamani zilizohifadhiwa katika safu mlalo hizi zinaweza kuwa chochote. Kufundisha Vela ili kulinganisha nao, ni muhimu kuhamisha compare_by parameta katika ufafanuzi wa mfululizo (isipokuwa maadili hayawezi kulinganishwa na kiwango Kernel.</2); parameter hii lazima iwe ya aina (Vela.value() -> number()). Kwa chaguo-msingi ni rahisi & &1.

Pia, unaweza kupitisha parameter kwa ufafanuzi wa safu comparator kuhesabu maadili ya delta (min/max); kwa mfano, kwa kusambaza Date.diff/2 kama mlinganisho, unaweza kupata deltas sahihi za tarehe.

Njia nyingine rahisi ya kufanya kazi ni kupitisha parameter threshold, ambayo inafafanua uwiano wa juu unaoruhusiwa wa thamani mpya kwa {min, max} muda. Kwa kuwa imeainishwa kama asilimia, hundi haitumii comparatorlakini bado inatumika compare_by. Kwa mfano, ili kutaja thamani ya kizingiti kwa nyakati za tarehe, lazima ueleze compare_by: &DateTime.to_unix/1 (kupata thamani kamili) na threshold: 1, na kusababisha thamani mpya kuruhusiwa ikiwa tu zimeingia Β±band muda kutoka kwa maadili ya sasa.

Hatimaye, unaweza kutumia Vela.equal?/2 kulinganisha cache mbili. Ikiwa maadili yanafafanua chaguo la kukokotoa equal?/2 au compare/2, basi kazi hizi zitatumika kwa kulinganisha, vinginevyo tunatumia kwa ujinga ==/2.

Kupata maadili

Kuchakata hali ya sasa kwa kawaida huanza na kupiga simu Vela.purge/1, ambayo huondoa maadili ya kizamani (ikiwa validator amefungwa kwa timestamps) Kisha unaweza kupiga simu Vela.slice/1ambayo itarudi keyword na majina ya safu kama funguo na ya kwanza, maadili halisi.

Unaweza pia kutumia get_in/2/pop_in/2 kwa ufikiaji wa kiwango cha chini kwa maadili katika kila safu.

Programu

Vela inaweza kuwa muhimu sana kama kashe ya safu ya wakati katika hali ya mchakato kama GenServer/Agent. Hatutaki kamwe kutumia maadili ya kozi ya zamani, na kufanya hivi tunaweka mchakato na hali iliyochakatwa Vela, na kithibitishaji kilichoonyeshwa hapa chini.

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

ΠΈ Vela.purge/1 huondoa kwa utulivu maadili yote ya zamani kila wakati tunapohitaji data. Ili kufikia maadili halisi tunaita tu Vela.slice/1, na wakati historia ndogo ya kozi inahitajika (mfululizo mzima), tunairudisha tu - tayari imepangwa - na maadili yaliyothibitishwa.

Furaha wakati wa kuhifadhi akiba!

Chanzo: mapenzi.com

Kuongeza maoni