Vela → vaxt seriyası və daha çoxu üçün ağıllı keş

Fintech-də biz tez-tez kifayət qədər böyük həcmdə valyuta məzənnəsi məlumatlarını emal etməli oluruq. Biz müxtəlif mənbələrdən məlumat alırıq və onların hər birinin sabah, sabahkı gün, gələn ay və hətta növbəti üç il üçün valyuta məzənnələrini necə ekstrapolyasiya etmək barədə öz fikirləri var. Əgər kimsə dərəcələri proqnozlaşdıra bilsəydi doğru, bu işi bağlamaq və sadəcə axmaqcasına pulu irəli-geri dəyişməyin vaxtı olardı. Bəzi mənbələr daha etibarlıdır, bəziləri demək olar ki, düzgün dəyərlərin nadir daxilolmaları ilə tam zibil verir, lakin ekzotik cütlər üçün. Bizim işimiz saniyədə bu on minlərlə dəyəri gözdən keçirmək və müştərilərə tam olaraq nəyi göstərəcəyini müəyyən etməkdir. Biz flaminqoların naharda etdiyi kimi, tonlarla kir və lildən bir düzgün dəyəri süzməliyik.

Vela → vaxt seriyası və daha çoxu üçün ağıllı keş

Flamingoların xüsusi fərqləndirici xüsusiyyəti onların aşağıya doğru əyilmiş kütləvi dimdiyidir, onun köməyi ilə qidaları sudan və ya palçıqdan süzürlər.
 - Wiki

Beləliklə, kitabxana yarandı Vela, müəyyən vaxt intervallarında birdən çox dəyər üçün dövlət önbelleğini saxlayan. Başlıq altında o, pis və köhnəlmiş məlumatları tez bir zamanda süzür və həmçinin ən son məlumatlara çıxışı təmin edir N hər bir açar üçün təsdiq edilmiş dəyərlər (valyuta cütləri, bizim vəziyyətimizdə).

Deyək ki, biz üç valyuta cütü üçün məzənnələr toplayırıq. Ən sadə tərif Vela cari vəziyyəti saxlamaq üçün bu kimi görünəcək:

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

Dəyərlərin Yenilənməsi

Vela.put/3 Funksiya ardıcıl olaraq aşağıdakıları edəcək:

  • səbəb olacaq validator dəyərə görə, əgər biri müəyyən edilibsə (bax Doğrulama aşağıda);
  • doğrulama uğurlu olarsa, ya yaxşı dəyərlər sırasına, ya da xidmət sırasına dəyər əlavə edəcək :__errors__ əks halda;
  • əgər çeşidlənməsinə səbəb olacaq sorter verilmiş açar üçün müəyyən edilir və ya sadəcə dəyəri siyahının başına qoyur (LİFO, bölməsinə baxın Sortlaşdırma aşağıda);
  • parametrə uyğun olaraq sıranı kəsəcək :limit yaradılışdan keçdi;
  • yenilənmiş strukturu qaytaracaq 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]}

Həmçinin Vela həyata keçirir Access, beləliklə siz dəyərləri yeniləmək üçün arsenaldan strukturları dərindən yeniləmək üçün hər hansı bir standart funksiyadan istifadə edə bilərsiniz. Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2Kernel.get_and_update_in/3.

Doğrulama

Doğrulayıcı aşağıdakı kimi müəyyən edilə bilər:

  • bir arqumentlə xarici funksiya (&MyMod.my_fun/1), yalnız doğrulama üçün dəyəri alacaq;
  • iki arqumentli xarici funksiya, &MyMod.my_fun/2, o bir cüt alacaq serie, value doğrulama üçün;
  • modulun həyata keçirilməsi Vela.Validator;
  • konfiqurasiya parametri threshold, və - istəyə görə - compare_by, bölməsinə baxın Müqayisə aşağıda.

Doğrulama uğurlu olarsa, dəyər müvafiq açarın altındakı siyahıya əlavə edilir, əks halda, çubuq {serie, value} gedir :__errors_.

Müqayisə

Bu sətirlərdə saxlanılan dəyərlər hər hansı bir şey ola bilər. Öyrətmək Vela onları müqayisə etmək üçün köçürmək lazımdır compare_by seriyanın tərifindəki parametr (dəyərlər standartla müqayisə edilə bilməzsə Kernel.</2); bu parametr tipli olmalıdır (Vela.value() -> number()). Varsayılan olaraq sadədir & &1.

Həmçinin, sətir tərifinə parametr ötürə bilərsiniz comparator delta dəyərlərini hesablamaq üçün (min/max); məsələn, ötürməklə Date.diff/2 müqayisəçi olaraq, tarixlər üçün düzgün deltaları əldə edə bilərsiniz.

İşləmək üçün başqa bir rahat yol parametri ötürməkdir threshold, yeni dəyərin maksimum icazə verilən nisbətini təyin edir {min, max} interval. Faizlə göstərildiyi üçün çek istifadə etmir comparatoramma yenə də istifadə edir compare_by. Məsələn, tarix vaxtları üçün hədd dəyərini təyin etmək üçün siz qeyd etməlisiniz compare_by: &DateTime.to_unix/1 (tam qiymət almaq üçün) və threshold: 1, yeni dəyərlərə yalnız daxil olduqda icazə verilməsinə səbəb olur ±band cari dəyərlərdən interval.

Nəhayət, istifadə edə bilərsiniz Vela.equal?/2 iki önbelleği müqayisə etmək üçün. Dəyərlər bir funksiyanı təyin edərsə equal?/2 və ya compare/2, onda bu funksiyalar müqayisə üçün istifadə olunacaq, əks halda axmaqcasına istifadə edirik ==/2.

Dəyərlərin əldə edilməsi

Cari vəziyyətin işlənməsi adətən zənglə başlayır Vela.purge/1köhnəlmiş dəyərləri silən (əgər validator bağlı timestamps). Sonra zəng edə bilərsiniz Vela.slice/1hansı qayıdacaq keyword açarlar və ilk, faktiki dəyərlər kimi sıra adları ilə.

Siz də istifadə edə bilərsiniz get_in/2/pop_in/2 hər sətirdəki dəyərlərə aşağı səviyyəli giriş üçün.

App

Vela kimi proses vəziyyətində zaman seriyası önbelleği kimi son dərəcə faydalı ola bilər GenServer/Agent. Biz heç vaxt köhnə kurs dəyərlərindən istifadə etmək istəmirik və bunu etmək üçün prosesi sadəcə işlənmiş vəziyyətdə saxlayırıq Vela, aşağıda göstərilən validator ilə.

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

и Vela.purge/1 məlumatlara ehtiyac duyduğumuz zaman bütün köhnəlmiş dəyərləri sakitcə silir. Həqiqi dəyərlərə daxil olmaq üçün sadəcə zəng edirik Vela.slice/1, və kursun kiçik tarixçəsi tələb olunduqda (bütün seriya), biz onu sadəcə olaraq təsdiq edilmiş dəyərlərlə artıq sıralanmış şəkildə qaytarırıq.

Xoşbəxt vaxt seriyası keşləmə!

Mənbə: www.habr.com

Добавить комментарий