Vela → cache pinter kanggo seri wektu lan liyane

Ing fintech, kita asring kudu ngolah data kurs mata uang kanthi volume sing cukup gedhe. Kita entuk data saka macem-macem sumber, lan saben-saben duwe ide dhewe babagan cara extrapolate kurs kanggo sesuk, sesuk, wulan ngarep lan malah telung taun sabanjure. Yen mung ana sing bisa prédhiksi tarif tengen, iku bakal wektu kanggo nutup bisnis lan mung stupidly ngganti dhuwit bali lan kasebut. Sawetara sumber luwih dipercaya, sawetara nyedhiyakake sampah lengkap, kanthi inklusi langka sing meh bener, nanging kanggo pasangan sing eksotis. Tugas kita yaiku nyaring puluhan ewu nilai per detik iki lan nemtokake apa sing bakal dituduhake menyang pelanggan. Kita kudu nyaring nilai sing bener saka ton rereget lan lempung, kaya flamingo nalika nedha awan.

Vela → cache pinter kanggo seri wektu lan liyane

Ciri khas flamingo sing mbedakake yaiku cucuk sing mlengkung mudhun, sing nyaring panganan saka banyu utawa lendhut.
 - Wiki

Mangkono perpustakaan lair Vela, sing nyimpen cache negara kanggo macem-macem nilai ing interval wektu tartamtu. Ing hood, nyaring data ala lan outdated ing fly, lan uga menehi akses menyang paling anyar N nilai sing divalidasi kanggo saben kunci (pasangan mata uang, ing kasus kita).

Ayo kita ngumpulake tarif kanggo telung pasangan mata uang. Definisi paling prasaja Vela kanggo nyimpen kahanan saiki bakal katon kaya iki:

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

Nganyari Nilai

Vela.put/3 Fungsi kasebut bakal nindakake ing ngisor iki kanthi urutan:

  • bakal nimbulaké validator ing Nilai, yen siji ditetepake (ndeleng bab Validasi ngisor);
  • bakal nambah nilai kasebut ing baris nilai sing apik yen validasi sukses, utawa menyang baris layanan :__errors__ yen ora;
  • bakal nimbulaké ngurutake yen sorter ditetepake kanggo kunci sing diwenehake, utawa mung bakal menehi nilai ing ndhuwur dhaptar (LIFO, ndeleng bab Ngurutake ngisor);
  • bakal motong baris miturut parameter :limit liwati marang tumitah;
  • bakal ngasilake struktur sing dianyari 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]}

Uga Vela ngleksanakake Access, supaya sampeyan bisa nggunakake sembarang fungsi standar kanggo struktur nganyari jero saka arsenal kanggo nganyari nilai Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, Lan Kernel.get_and_update_in/3.

Validasi

Validator bisa ditetepake minangka:

  • fungsi eksternal kanthi siji argumen (&MyMod.my_fun/1), mung bakal nampa nilai kanggo validasi;
  • fungsi eksternal kanthi rong argumen, &MyMod.my_fun/2, dheweke bakal entuk pasangan serie, value kanggo validasi;
  • implementasi modul Vela.Validator;
  • parameter konfigurasi threshold, lan - opsional - compare_by, ndeleng bab comparison ing ngisor iki.

Yen validasi sukses, nilai kasebut ditambahake menyang dhaptar ing sangisore tombol sing cocog; yen ora, tuple {serie, value} tindak menyang :__errors_.

Perbandingan

Nilai sing disimpen ing baris kasebut bisa apa wae. Kanggo mulang Vela kanggo mbandhingaké wong, iku perlu kanggo nransfer compare_by parameter ing definisi seri (kajaba nilai ora bisa dibandhingake karo standar Kernel.</2); parameter iki kudu saka jinis (Vela.value() -> number()). Kanthi gawan iku prasaja & &1.

Uga, sampeyan bisa ngirim parameter menyang definisi baris comparator kanggo ngitung nilai delta (min/max); contone, dening ngirimaken Date.diff/2 minangka komparator, sampeyan bisa njaluk delta bener kanggo tanggal.

Cara liya sing trep kanggo nggarap yaiku ngliwati parameter threshold, kang nemtokake rasio maksimum allowable saka Nilai anyar kanggo {min, max} interval. Wiwit kasebut minangka persentase, mriksa ora digunakake comparatornanging isih nggunakake compare_by. Contone, kanggo nemtokake nilai ambang kanggo kaping tanggal, sampeyan kudu nemtokake compare_by: &DateTime.to_unix/1 (kanggo entuk nilai integer) lan threshold: 1, nyebabake nilai anyar mung diidini yen ana ±band interval saka nilai saiki.

Pungkasan, sampeyan bisa nggunakake Vela.equal?/2 kanggo mbandhingaké loro caches. Yen nilai nemtokake fungsi equal?/2 utawa compare/2, banjur fungsi iki bakal digunakake kanggo comparison, digunakake kita bodho nggunakake ==/2.

Entuk nilai

Ngolah kahanan saiki biasane diwiwiti kanthi nelpon Vela.purge/1, sing mbusak nilai sing ora bisa digunakake (yen validator diikat menyang timestamps). Sampeyan banjur bisa nelpon Vela.slice/1kang bakal bali keyword karo jeneng baris minangka tombol lan pisanan, nilai nyata.

Sampeyan uga bisa nggunakake get_in/2/pop_in/2 kanggo akses tingkat rendah menyang nilai ing saben baris.

Aplikasi

Vela bisa banget migunani minangka cache seri wektu ing negara proses kaya GenServer/Agent. Kita pengin tau nggunakake nilai mesthi stale, lan kanggo nindakake iki kita mung supaya proses karo negara diproses Vela, kanthi validator kapacak ing ngisor iki.

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

и Vela.purge/1 kanthi tenang mbusak kabeh nilai basi saben-saben kita butuh data. Kanggo ngakses nilai nyata kita mung nelpon Vela.slice/1, lan nalika sajarah cilik saka mesthi dibutuhake (kabeh seri), kita mung bali-wis diurut-karo nilai divalidasi.

Caching seri wektu seneng!

Source: www.habr.com

Add a comment