Vela β†’ storfa smart ar gyfer cyfresi amser a mwy

Yn fintech, yn aml mae'n rhaid i ni brosesu symiau eithaf enfawr o ddata cyfradd cyfnewid arian cyfred. Rydyn ni'n cael data o wahanol ffynonellau, ac mae gan bob un ohonyn nhw ei syniad ei hun o sut i allosod cyfraddau cyfnewid ar gyfer yfory, y diwrnod ar Γ΄l yfory, y mis nesaf a hyd yn oed y tair blynedd nesaf. Os mai dim ond rhywun allai ragweld cyfraddau yn gywir, byddai'n amser cau'r busnes a newid arian yn Γ΄l ac ymlaen yn wirion. Mae rhai ffynonellau yn fwy dibynadwy, mae rhai yn cyflenwi sothach cyflawn, gyda chynhwysion prin o werthoedd cywir bron, ond ar gyfer cyplau egsotig. Ein gwaith ni yw sifftio trwy'r degau o filoedd hyn o werthoedd yr eiliad a phenderfynu beth yn union i'w ddangos i gwsmeriaid. Mae angen inni hidlo'r un gwerth cywir o dunelli o faw a silt, yn union fel y mae fflamingos yn ei wneud amser cinio.

Vela β†’ storfa smart ar gyfer cyfresi amser a mwy

Nodwedd wahaniaethol arbennig o fflamingos yw eu pig anferth ar i lawr, y maent yn hidlo bwyd o ddΕ΅r neu fwd ag ef.
 - Wiki

Felly ganwyd y llyfrgell Vela, sy'n storio storfa wladwriaeth ar gyfer gwerthoedd lluosog ar gyfnodau amser penodedig. O dan y cwfl, mae'n hidlo data gwael a hen ffasiwn ar y hedfan, ac mae hefyd yn darparu mynediad i'r diweddaraf N gwerthoedd wedi'u dilysu ar gyfer pob allwedd (parau arian, yn ein hachos ni).

Gadewch i ni ddweud ein bod yn casglu cyfraddau ar gyfer tri phΓ’r arian. Diffiniad symlaf Vela i storio'r cyflwr presennol bydd yn edrych rhywbeth fel hyn:

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

Diweddaru Gwerthoedd

Vela.put/3 Bydd y swyddogaeth yn gwneud y canlynol mewn trefn:

  • bydd yn achosi validator ar y gwerth, os yw un wedi'i ddiffinio (gweler pennod Dilysu isod);
  • yn ychwanegu'r gwerth naill ai at y rhes o werthoedd da os oedd y dilysiad yn llwyddiannus, neu i'r rhes gwasanaeth :__errors__ fel arall;
  • bydd yn achosi didoli os sorter wedi'i ddiffinio ar gyfer allwedd benodol, neu bydd yn rhoi'r gwerth ar ben y rhestr (LIFO, gweler y bennod Trefnu isod);
  • yn tocio'r rhes yn Γ΄l y paramedr :limit trosglwyddo ar y greadigaeth;
  • yn dychwelyd y strwythur wedi'i ddiweddaru 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]}

Hefyd Vela offer Access, felly gallwch chi ddefnyddio unrhyw un o'r swyddogaethau safonol ar gyfer diweddaru strwythurau dwfn o'r arsenal i ddiweddaru gwerthoedd Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, a Kernel.get_and_update_in/3.

Dilysu

Gellir diffinio dilysydd fel:

  • swyddogaeth allanol gydag un ddadl (&MyMod.my_fun/1), bydd ond yn derbyn y gwerth ar gyfer dilysu;
  • swyddogaeth allanol gyda dwy ddadl, &MyMod.my_fun/2, bydd hi'n cael pΓ’r serie, value ar gyfer dilysu;
  • gweithredu modiwl Vela.Validator;
  • paramedr cyfluniad threshold, ac - yn ddewisol - compare_by, gweler y bennod cymharu isod.

Os yw'r dilysiad yn llwyddiannus, ychwanegir y gwerth at y rhestr o dan yr allwedd gyfatebol; fel arall, y tuple {serie, value} yn mynd i :__errors_.

Cymhariaeth

Gall y gwerthoedd a storir yn y rhesi hyn fod yn unrhyw beth. I ddysgu Vela i'w cymharu, mae angen trosglwyddo compare_by paramedr yn y diffiniad cyfres (oni bai na ellir cymharu'r gwerthoedd Γ’'r safon Kernel.</2); rhaid i'r paramedr hwn fod o fath (Vela.value() -> number()). Yn ddiofyn, mae'n syml & &1.

Hefyd, gallwch chi basio paramedr i ddiffiniad y rhes comparator i gyfrifo gwerthoedd delta (min/max); er enghraifft, trwy drosglwyddo Date.diff/2 fel cymharydd, gallwch gael y deltas cywir ar gyfer dyddiadau.

Ffordd gyfleus arall o weithio yw pasio paramedr threshold, sy'n diffinio'r gymhareb uchaf a ganiateir o'r gwerth newydd i {min, max} cyfwng. Gan ei fod wedi'i nodi fel canran, nid yw'r siec yn defnyddio comparatorond yn dal i ddefnyddio compare_by. Er enghraifft, i bennu gwerth trothwy ar gyfer amseroedd dyddiad, rhaid i chi nodi compare_by: &DateTime.to_unix/1 (i gael gwerth cyfanrif) a threshold: 1, gan achosi gwerthoedd newydd i gael eu caniatΓ‘u dim ond os ydynt i mewn Β±band cyfwng o'r gwerthoedd cyfredol.

Yn olaf, gallwch chi ddefnyddio Vela.equal?/2 i gymharu dau caches. Os yw'r gwerthoedd yn diffinio swyddogaeth equal?/2 neu compare/2, yna bydd y swyddogaethau hyn yn cael eu defnyddio ar gyfer cymharu, fel arall rydym yn dwp yn defnyddio ==/2.

Cael gwerthoedd

Mae prosesu'r cyflwr presennol fel arfer yn dechrau gyda galw Vela.purge/1, sy'n dileu gwerthoedd darfodedig (os validator ynghlwm wrth timestamps). Yna gallwch chi ffonio Vela.slice/1a fydd yn dychwelyd keyword gydag enwau rhes fel allweddi a'r gwerthoedd cyntaf, gwirioneddol.

Gallwch hefyd ddefnyddio get_in/2/pop_in/2 ar gyfer mynediad lefel isel i'r gwerthoedd ym mhob rhes.

Cais

Vela Gall fod yn hynod ddefnyddiol fel storfa cyfres amser mewn cyflwr proses fel GenServer/Agent. Rydym am beidio byth Γ’ defnyddio hen werthoedd cwrs, ac i wneud hyn yn syml rydym yn cadw'r broses gyda'r wladwriaeth wedi'i phrosesu Vela, gyda'r dilysydd a ddangosir isod.

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

ΠΈ Vela.purge/1 yn cael gwared ar yr holl hen werthoedd yn dawel bob tro y bydd angen y data arnom. I gael mynediad at y gwerthoedd gwirioneddol rydym yn syml yn galw Vela.slice/1, a phan fydd angen hanes bach o'r cwrs (y gyfres gyfan), yn syml, rydyn ni'n ei ddychwelyd - wedi'i ddidoli'n barod - gyda gwerthoedd dilys.

caching cyfres amser hapus!

Ffynhonnell: hab.com

Ychwanegu sylw