Vela → kaṣe ọlọgbọn fun jara akoko ati diẹ sii

Ni fintech, a nigbagbogbo ni lati ṣe ilana awọn iwọn pupọ ti data oṣuwọn paṣipaarọ owo. A gba data lati awọn orisun oriṣiriṣi, ati pe ọkọọkan wọn ni imọran tirẹ ti bii o ṣe le ṣe afikun awọn oṣuwọn paṣipaarọ fun ọla, ọjọ lẹhin ọla, oṣu ti n bọ ati paapaa ọdun mẹta to nbọ. Ti ẹnikan ba le ṣe asọtẹlẹ awọn oṣuwọn ọtun, o yoo jẹ akoko lati pa awọn owo ati ki o kan stupidly yi owo pada ati siwaju. Diẹ ninu awọn orisun jẹ igbẹkẹle diẹ sii, diẹ ninu awọn ipese idoti pipe, pẹlu awọn ifisi toje ti awọn iye to peye, ṣugbọn fun awọn tọkọtaya nla. Iṣẹ wa ni lati ṣaja nipasẹ ẹgbẹẹgbẹrun awọn iye wọnyi fun iṣẹju keji ati pinnu kini gangan lati fihan si awọn alabara. A nilo lati ṣe àlẹmọ iye ti o pe lati awọn toonu ti idoti ati silt, gẹgẹ bi flamingos ṣe ni ounjẹ ọsan.

Vela → kaṣe ọlọgbọn fun jara akoko ati diẹ sii

Ẹya iyatọ pataki ti flamingos ni ẹrẹkẹ nla wọn ti o tẹ sisale, eyiti wọn fi ṣe àlẹmọ ounjẹ lati omi tabi ẹrẹ.
 - Wiki

Bayi ni a bi ile-ikawe naa Vela, eyiti o tọju kaṣe ipinlẹ fun awọn iye pupọ ni awọn aaye arin akoko kan pato. Labẹ Hood, o ṣe asẹ jade buburu ati data igba atijọ lori fo, ati tun pese iraye si tuntun N awọn iye ifọwọsi fun bọtini kọọkan (awọn orisii owo, ninu ọran wa).

Jẹ ki a sọ pe a gba awọn oṣuwọn fun awọn orisii owo mẹta. Itumọ ti o rọrun julọ Vela lati tọju ipo lọwọlọwọ yoo dabi nkan bi eyi:

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

Ṣiṣe imudojuiwọn Awọn iye

Vela.put/3 Iṣẹ naa yoo ṣe awọn atẹle ni ọkọọkan:

  • yoo fa validator lori iye, ti ọkan ba ni asọye (wo ipin Ifọwọsi ni isalẹ);
  • yoo ṣafikun iye boya si ila ti awọn iye to dara ti ijẹrisi ba ṣaṣeyọri, tabi si laini iṣẹ naa :__errors__ bibẹkọ ti;
  • yoo fa ayokuro ti o ba ti sorter asọye fun bọtini ti a fun, tabi yoo rọrun fi iye naa si ori atokọ naa (LIFO, wo ipin Lẹsẹẹsẹ ni isalẹ);
  • yoo gee kana ni ibamu si awọn paramita :limit kọja lori ẹda;
  • yoo pada awọn imudojuiwọn be 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]}

Bakannaa Vela ohun elo Access, nitorinaa o le lo eyikeyi awọn iṣẹ boṣewa fun awọn ẹya isọdọtun jinlẹ lati ile-iṣọ lati ṣe imudojuiwọn awọn iye Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, Ati Kernel.get_and_update_in/3.

Ifọwọsi

Afọwọsi le jẹ asọye bi:

  • iṣẹ ita pẹlu ariyanjiyan kan (&MyMod.my_fun/1), yoo gba iye nikan fun afọwọsi;
  • iṣẹ ita pẹlu awọn ariyanjiyan meji, &MyMod.my_fun/2, yoo gba bata serie, value fun afọwọsi;
  • imuse module Vela.Validator;
  • paramita iṣeto ni threshold, ati - ni iyan - compare_by, wo ipin lafiwe ni isalẹ.

Ti ijẹrisi ba ṣaṣeyọri, iye naa jẹ afikun si atokọ labẹ bọtini ti o baamu; bibẹẹkọ, tuple naa {serie, value} lọ si :__errors_.

Ifiwewe

Awọn iye ti a fipamọ sinu awọn ori ila wọnyi le jẹ ohunkohun. Lati kọ Vela lati ṣe afiwe wọn, o jẹ dandan lati gbe compare_by paramita ninu asọye jara (ayafi ti awọn iye ko le ṣe akawe pẹlu boṣewa Kernel.</2); paramita yii gbọdọ jẹ ti iru (Vela.value() -> number()). Nipa aiyipada o rọrun & &1.

Paapaa, o le kọja paramita kan si asọye ila comparator lati ṣe iṣiro awọn iye delta (min/max); fun apẹẹrẹ, nipa gbigbe Date.diff/2 bi a comparator, o le gba awọn ti o tọ deltas fun awọn ọjọ.

Ọna miiran ti o rọrun lati ṣiṣẹ ni lati kọja paramita kan threshold, eyi ti o asọye awọn ti o pọju Allowable ratio ti awọn titun iye si {min, max} aarin. Niwon o ti wa ni pato bi ogorun, ayẹwo ko lo comparatorsugbon si tun nlo compare_by. Fun apẹẹrẹ, lati pato iye ala fun awọn akoko ọjọ, o gbọdọ pato compare_by: &DateTime.to_unix/1 (lati gba iye odidi) ati threshold: 1, nfa awọn iye tuntun lati gba laaye nikan ti wọn ba wa ±band aarin lati awọn ti isiyi iye.

Ni ipari, o le lo Vela.equal?/2 lati ṣe afiwe awọn kaṣe meji. Ti awọn iye ba ṣe alaye iṣẹ kan equal?/2 tabi compare/2, lẹhinna awọn iṣẹ wọnyi yoo ṣee lo fun lafiwe, bibẹẹkọ a lo aṣiwere ==/2.

Ngba awọn iye

Ṣiṣẹda ipo lọwọlọwọ maa n bẹrẹ pẹlu pipe Vela.purge/1, eyiti o yọkuro awọn iye igba atijọ (if validator so si timestamps). O le lẹhinna pe Vela.slice/1eyi ti yoo pada keyword pẹlu awọn orukọ kana bi awọn bọtini ati awọn akọkọ, gangan iye.

O tun le lo get_in/2/pop_in/2 fun iraye si ipele kekere si awọn iye ni ila kọọkan.

Ohun elo

Vela le wulo pupọ bi kaṣe jara akoko ni ipo ilana bii GenServer/Agent. A fẹ lati ma lo awọn iye ipa ọna stale, ati lati ṣe eyi a rọrun lati tọju ilana naa pẹlu ilana ipinlẹ Vela, pẹlu awọn validator han ni isalẹ.

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

и Vela.purge/1 laiparuwo yọ gbogbo awọn iye stale kuro ni gbogbo igba ti a nilo data naa. Lati wọle si awọn iye gangan a kan pe Vela.slice/1, ati nigbati a kekere itan ti awọn dajudaju wa ni ti beere (gbogbo jara), a nìkan pada o - tẹlẹ lẹsẹsẹ - pẹlu wulo iye.

Dun akoko jara caching!

orisun: www.habr.com

Fi ọrọìwòye kun