Vela β†’ smart cache para sa time series ug uban pa

Sa fintech, kanunay namong iproseso ang daghang mga bulto sa datos sa currency exchange rate. Nagkuha kami mga datos gikan sa lainlaing mga gigikanan, ug ang matag usa kanila adunay kaugalingon nga ideya kung giunsa pag-extrapolate ang mga rate sa pagbinayloay alang sa ugma, pagkaugma, sunod nga bulan ug bisan sa sunod nga tulo ka tuig. Kung adunay makatagna sa mga rate husto, panahon na nga isira ang negosyo ug hungog lang nga mag-ilis ug kuwarta. Ang ubang mga tinubdan mas kasaligan, ang uban naghatag ug kompletong basura, nga adunay talagsaong mga inklusyon sa halos hustong mga bili, apan alang sa mga exotic nga magtiayon. Ang among trabaho mao ang pag-ayag niining libu-libo nga mga kantidad matag segundo ug mahibal-an kung unsa gyud ang ipakita sa mga kustomer. Kinahanglan natong i-filter ang usa ka husto nga kantidad gikan sa tonelada nga hugaw ug silt, sama sa gibuhat sa mga flamingo sa paniudto.

Vela β†’ smart cache para sa time series ug uban pa

Ang usa ka espesyal nga kinaiya sa mga flamingo mao ang ilang dako nga bawog nga kurbada nga sungo, diin ilang gisala ang pagkaon gikan sa tubig o lapok.
 - Wiki

Busa ang librarya natawo Vela, nga nagtipig sa usa ka cache sa estado alang sa daghang mga kantidad sa piho nga mga agwat sa oras. Ubos sa tabon, kini nagsala sa dili maayo ug karaan nga datos sa langaw, ug naghatag usab og access sa pinakabag-o N gi-validate nga mga kantidad alang sa matag yawe (mga pares sa salapi, sa among kaso).

Ingnon ta nga nagkolekta kami og mga rate alang sa tulo nga mga pares sa salapi. Pinakasimple nga kahulugan Vela sa pagtipig sa kasamtangan nga kahimtang kini tan-awon sama niini:

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

Pag-update sa mga Bili

Vela.put/3 Ang function mobuhat sa mosunod sa han-ay:

  • maoy hinungdan validator sa bili, kon ang usa gihubit (tan-awa ang kapitulo Pagpamatuod ubos);
  • idugang ang kantidad bisan sa laray sa maayong mga kantidad kung malampuson ang pag-validate, o sa linya sa serbisyo :__errors__ kon dili;
  • maoy hinungdan sa paghan-ay kon sorter gihubit alang sa gihatag nga yawe, o ibutang lang ang kantidad sa ulohan sa lista (LIFO, tan-awa ang kapitulo Paghan-ay ubos);
  • putlon ang laray sumala sa parameter :limit gipasa sa paglalang;
  • ibalik ang gi-update nga istruktura 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]}

Usab Vela nagpatuman Access, aron magamit nimo ang bisan unsang sukaranan nga mga gimbuhaton alang sa lawom nga pag-update sa mga istruktura gikan sa arsenal aron ma-update ang mga kantidad Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, Ug Kernel.get_and_update_in/3.

Pagpamatuod

Ang usa ka validator mahimong ipasabut ingon:

  • external function nga adunay usa ka argumento (&MyMod.my_fun/1), kini makadawat lamang sa bili alang sa validation;
  • external function nga adunay duha ka argumento, &MyMod.my_fun/2, makakuha siyag pares serie, value alang sa validation;
  • pagpatuman sa module Vela.Validator;
  • parameter sa pag-configure threshold, ug - opsyonal - compare_by, tan-awa ang kapitulo Pagtandi sa ubos.

Kung malampuson ang pag-validate, ang kantidad idugang sa lista sa ilawom sa katugbang nga yawe; kung dili, ang tuple {serie, value} moadto sa :__errors_.

Pagtandi

Ang mga kantidad nga gitipigan sa kini nga mga laray mahimong bisan unsa. Sa pagtudlo Vela aron itandi sila, gikinahanglan ang pagbalhin compare_by parameter sa kahulugan sa serye (gawas kung ang mga kantidad dili ikumpara sa sumbanan Kernel.</2); kini nga parameter kinahanglan nga tipo (Vela.value() -> number()). Sa kasagaran kini yano & &1.

Usab, mahimo nimong ipasa ang usa ka parameter sa kahulugan sa linya comparator aron makalkulo ang mga kantidad sa delta (min/max); pananglitan, pinaagi sa pagpasa Date.diff/2 isip komparator, makuha nimo ang saktong delta para sa mga petsa.

Ang laing sayon ​​​​nga paagi sa pagtrabaho mao ang pagpasa sa usa ka parameter threshold, nga naghubit sa labing taas nga gitugot nga ratio sa bag-ong kantidad sa {min, max} agwat. Tungod kay gipiho kini isip porsyento, ang tseke dili magamit comparatorpero gamit gihapon compare_by. Pananglitan, aron matino ang kantidad sa threshold alang sa mga oras sa petsa, kinahanglan nimo nga ipiho compare_by: &DateTime.to_unix/1 (aron makakuha usa ka integer nga kantidad) ug threshold: 1, hinungdan nga ang mga bag-ong kantidad gitugotan lamang kung naa sila Β±band interval gikan sa kasamtangan nga mga bili.

Sa katapusan, mahimo nimong gamiton Vela.equal?/2 aron itandi ang duha ka cache. Kung ang mga kantidad nagpaila sa usa ka function equal?/2 o compare/2, unya kini nga mga gimbuhaton gamiton alang sa pagtandi, kung dili kita hungog nga gigamit ==/2.

Pagkuha og mga mithi

Ang pagproseso sa kasamtangan nga kahimtang kasagaran magsugod sa pagtawag Vela.purge/1, nga nagtangtang sa karaan nga mga kantidad (kung validator gihigot sa timestamps). Makatawag ka unya Vela.slice/1nga mobalik keyword nga adunay mga ngalan sa laray isip mga yawe ug ang una, aktuwal nga mga bili.

Mahimo usab nimo gamiton get_in/2/pop_in/2 alang sa ubos nga lebel nga pag-access sa mga kantidad sa matag laray.

Paggamit

Vela mahimong labi ka mapuslanon ingon usa ka serye sa oras nga cache sa usa ka kahimtang sa proseso sama GenServer/Agent. Gusto namong dili na mogamit ug stale course values, ug sa pagbuhat niini gipadayon lang namo ang proseso nga giproseso sa estado Vela, uban ang validator nga gipakita sa ubos.

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

ΠΈ Vela.purge/1 hilom nga nagtangtang sa tanan nga mga stale value sa matag higayon nga kinahanglan namon ang datos. Aron ma-access ang aktuwal nga mga kantidad tawgon ra namon Vela.slice/1, ug kung gikinahanglan ang usa ka gamay nga kasaysayan sa kurso (ang tibuok nga serye), ibalik lang namo kini - nahan-ay na - nga adunay balido nga mga bili.

Malipayon nga time series caching!

Source: www.habr.com

Idugang sa usa ka comment