Vela → cache pinter pikeun séri waktos sareng seueur deui

Dina fintech, urang sering kedah ngolah data nilai tukar mata uang anu lumayan ageung. Kami nampi data tina sumber anu béda-béda, sareng masing-masing gaduh ideu sorangan ngeunaan kumaha carana ngitung nilai tukar kanggo énjing, énjing, sasih payun sareng bahkan tilu taun ka hareup. Lamun ngan batur bisa ngaduga ongkos neuleu, eta bakal jadi waktu pikeun nutup bisnis jeung ngan stupidly ngarobah duit deui mudik. Sababaraha sumber anu leuwih dipercaya, sababaraha suplai lengkep sampah, kalawan inclusions langka tina nilai ampir bener, tapi pikeun pasangan aheng. Tugas urang nyaéta ngayak puluhan rébu nilai per detik ieu sareng nangtoskeun naon anu bakal dipidangkeun ka konsumén. Urang kedah nyaring nilai anu leres tina ton kokotor sareng lebu, sapertos flamingo nalika tuang siang.

Vela → cache pinter pikeun séri waktos sareng seueur deui

Fitur anu ngabédakeun khusus tina flamingo nyaéta pamatuk anu melengkung ka handap, anu aranjeunna nyaring tuangeun tina cai atanapi leutak.
 - Wiki

Kituna perpustakaan dilahirkeun Vela, nu nyimpen cache kaayaan pikeun sababaraha nilai dina interval waktu nu tangtu. Dina tiung, éta nyaring data goréng jeung luntur dina laleur, sarta ogé nyadiakeun aksés ka panganyarna N nilai divalidasi pikeun tiap konci (pasangan mata uang, bisi urang).

Anggap urang ngumpulkeun ongkos pikeun tilu pasang mata uang. Definisi pangbasajanna Vela pikeun nyimpen kaayaan ayeuna bakal kasampak kawas kieu:

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

Ngamutahirkeun Nilai

Vela.put/3 Fungsi bakal ngalakukeun di handap dina urutan:

  • bakal ngabalukarkeun validator ngeunaan nilai, upami aya anu didefinisikeun (tingali bab Validasi handap);
  • bakal nambahan nilai boh ka baris nilai alus lamun validasi éta suksés, atawa baris layanan :__errors__ sabalikna;
  • bakal ngabalukarkeun asihan lamun sorter ditetepkeun pikeun konci anu dipasihkeun, atanapi ngan saukur bakal nempatkeun nilaina dina sirah daptar (LIFO, tingali bab Urut handap);
  • baris motong baris nurutkeun parameter :limit diliwatan kana ciptaan;
  • bakal mulangkeun struktur anu diropéa 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]}

oge Vela ngalaksanakeun Access, ku kituna anjeun tiasa nganggo salah sahiji fungsi standar pikeun ngapdet struktur jero tina arsenal pikeun ngapdet nilai. Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, sarta Kernel.get_and_update_in/3.

Validasi

A validator bisa dihartikeun salaku:

  • fungsi éksternal kalawan hiji argumen (&MyMod.my_fun/1), éta ngan bakal nampi nilai pikeun validasi;
  • fungsi éksternal kalawan dua argumen, &MyMod.my_fun/2, manehna bakal meunang sapasang serie, value pikeun validasi;
  • palaksanaan modul Vela.Validator;
  • parameter konfigurasi threshold, sareng - opsional - compare_by, tingali bab pabandingan di handap.

Lamun validasi suksés, nilai ditambahkeun kana daptar handapeun konci pakait; disebutkeun, tuple nu {serie, value} nuju ka :__errors_.

pabandingan

Nilai anu disimpen dina barisan ieu tiasa nanaon. Ngajar Vela pikeun ngabandingkeun aranjeunna, perlu pikeun mindahkeun compare_by Parameter dina definisi séri (kecuali nilaina henteu tiasa dibandingkeun sareng standar Kernel.</2); parameter ieu kudu tipe (Vela.value() -> number()). Sacara standar éta basajan & &1.

Ogé, anjeun tiasa ngalebetkeun parameter kana definisi baris comparator ngitung nilai delta (min/max); contona, ku ngirimkeun Date.diff/2 salaku comparator a, Anjeun bisa meunangkeun delta bener pikeun kaping.

Cara anu sanés pikeun dianggo nyaéta ngalangkungan parameter threshold, nu ngahartikeun rasio allowable maksimum tina nilai anyar pikeun {min, max} interval. Kusabab eta dieusian salaku perséntase, cek teu make comparatortapi tetep nganggo compare_by. Contona, pikeun nangtukeun nilai bangbarung pikeun kaping tanggal, anjeun kudu nangtukeun compare_by: &DateTime.to_unix/1 (pikeun meunang hiji nilai integer) jeung threshold: 1, ngabalukarkeun nilai-nilai anyar ngan diidinan upami aranjeunna aya ±band interval tina nilai ayeuna.

Tungtungna, anjeun tiasa nganggo Vela.equal?/2 pikeun ngabandingkeun dua caches. Lamun nilai nangtukeun hiji fungsi equal?/2 atawa compare/2, lajeng fungsi ieu bakal dipaké pikeun ngabandingkeun, disebutkeun urang stupidly ngagunakeun ==/2.

Meunangkeun nilai

Ngolah kaayaan ayeuna biasana dimimitian ku nelepon Vela.purge/1, anu ngaleungitkeun niléy-niléy anu leungit (upami validator dihijikeun ka timestamps). Anjeun teras tiasa nelepon Vela.slice/1nu bakal mulang keyword kalawan ngaran baris salaku konci jeung kahiji, nilai sabenerna.

Anjeun oge bisa make get_in/2/pop_in/2 pikeun aksés tingkat handap kana nilai dina unggal baris.

aplikasi

Vela tiasa pisan mangpaat salaku cache runtuyan waktu dina kaayaan prosés kawas GenServer/Agent. Simkuring hoyong pernah ngagunakeun nilai tangtu bulukan, sarta pikeun ngalakukeun ieu urang ngan saukur ngajaga prosés jeung kaayaan diolah Vela, kalawan validator ditémbongkeun di handap ieu.

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

и Vela.purge/1 quietly miceun kabeh nilai bulukan unggal waktu urang butuh data. Pikeun ngakses nilai sabenerna urang ngan nelepon Vela.slice/1, sarta lamun sajarah leutik tangtu diperlukeun (sakabeh runtuyan), urang ngan balik deui - geus diurutkeun - kalawan nilai disahkeun.

Senang cache runtuyan waktos!

sumber: www.habr.com

Tambahkeun komentar