Вела → паметна кеш меморија за временске серије и још много тога

У финтецх-у, често морамо да обрађујемо прилично велике количине података о курсу валута. Добијамо податке из различитих извора, а сваки од њих има своју идеју ​​како да екстраполира курсеве за сутра, прекосутра, наредни месец, па чак и наредне три године. Кад би неко могао да предвиди стопе исправно, било би време да затворите посао и само глупо мењате новац напред-назад. Неки извори су поузданији, неки испоручују комплетно смеће, са ретким укључцима скоро тачних вредности, али за егзотичне парове. Наш посао је да прегледамо ове десетине хиљада вредности у секунди и одредимо шта тачно да покажемо купцима. Морамо да филтрирамо једну тачну вредност из тона прљавштине и муља, баш као што фламингоси раде за ручком.

Вела → паметна кеш меморија за временске серије и још много тога

Посебна карактеристика фламингоса је њихов масивни надоле закривљен кљун, којим филтрирају храну из воде или блата.
 - Wiki

Тако је настала библиотека Vela, који чува кеш стања за више вредности у одређеним временским интервалима. Испод хаубе, филтрира лоше и застареле податке у ходу, а такође пружа приступ најновијим N валидиране вредности за сваки кључ (валутни парови, у нашем случају).

Рецимо да прикупљамо стопе за три валутна пара. Најједноставнија дефиниција Vela да сачувате тренутно стање изгледаће отприлике овако:

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

Ажурирање вредности

Vela.put/3 Функција ће урадити следеће у низу:

  • ће изазвати validator на вредност, ако је она дефинисана (погледајте погл Валидација испод);
  • ће додати вредност или у ред добрих вредности ако је валидација била успешна или у ред услуге :__errors__ иначе;
  • ће изазвати сортирање ако sorter дефинисано за дати кључ, или ће једноставно ставити вредност на чело листе (ЛИФО, види поглавље Сортировка испод);
  • ће исећи ред према параметру :limit пренео на стварање;
  • вратиће ажурирану структуру 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]}

Такође Vela имплементира Access, тако да можете користити било коју од стандардних функција за дубоко ажурирање структура из арсенала да бисте ажурирали вредности Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2, и Kernel.get_and_update_in/3.

Валидација

Валидатор се може дефинисати као:

  • екстерна функција са једним аргументом (&MyMod.my_fun/1), добиће само вредност за валидацију;
  • екстерна функција са два аргумента, &MyMod.my_fun/2, она ће добити пар serie, value за валидацију;
  • имплементација модула Vela.Validator;
  • конфигурациони параметар thresholdи - опционо - compare_by, види поглавље Поређење испод.

Ако је валидација успешна, вредност се додаје на листу под одговарајућим кључем; {serie, value} иде на :__errors_.

Поређење

Вредности сачуване у овим редовима могу бити било које. Подучавати Vela да их упоредимо потребно је пренети compare_by параметар у дефиницији серије (осим ако се вредности не могу упоредити са стандардом Kernel.</2); овај параметар мора бити типа (Vela.value() -> number()). Подразумевано је једноставно & &1.

Такође, можете проследити параметар дефиницији реда comparator за израчунавање делта вредности (min/max); на пример преношењем Date.diff/2 као компаратор, можете добити тачне делте за датуме.

Још један погодан начин рада је преношење параметра threshold, који дефинише максимално дозвољени однос нове вредности према {min, max} интервал. Пошто је наведено у процентима, чек се не користи comparatorали и даље користи compare_by. На пример, да бисте навели граничну вредност за датум времена, морате навести compare_by: &DateTime.to_unix/1 (да бисте добили целобројну вредност) и threshold: 1, што доводи до тога да нове вредности буду дозвољене само ако су у ±band интервал од тренутних вредности.

Коначно, можете користити Vela.equal?/2 да упореди два кеша. Ако вредности дефинишу функцију equal?/2 или compare/2, онда ће се ове функције користити за поређење, иначе ћемо глупо користити ==/2.

Добијање вредности

Обрада тренутног стања обично почиње позивом Vela.purge/1, који уклања застареле вредности (иф validator везани за timestamps). Тада можете позвати Vela.slice/1који ће се вратити keyword са именима редова као кључевима и првим, стварним вредностима.

Такође можете користити get_in/2/pop_in/2 за приступ на ниском нивоу вредностима у сваком реду.

апликација

Vela може бити изузетно корисно као кеш временске серије у стању процеса као што је GenServer/Agent. Желимо да никада не користимо застареле вредности курса, а да бисмо то урадили, једноставно одржавамо процес са стањем Vela, са валидатором приказаним испод.

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

и Vela.purge/1 тихо уклања све застареле вредности сваки пут када нам затребају подаци. Да бисмо приступили стварним вредностима, једноставно их позовемо Vela.slice/1, а када је потребна мала историја курса (цела серија), једноставно је враћамо - већ сортирану - са валидираним вредностима.

Срећно кеширање временских серија!

Извор: ввв.хабр.цом

Додај коментар