Вела → паметна кеш меморија за временске серије и још много тога
У финтецх-у, често морамо да обрађујемо прилично велике количине података о курсу валута. Добијамо податке из различитих извора, а сваки од њих има своју идеју како да екстраполира курсеве за сутра, прекосутра, наредни месец, па чак и наредне три године. Кад би неко могао да предвиди стопе исправно, било би време да затворите посао и само глупо мењате новац напред-назад. Неки извори су поузданији, неки испоручују комплетно смеће, са ретким укључцима скоро тачних вредности, али за егзотичне парове. Наш посао је да прегледамо ове десетине хиљада вредности у секунди и одредимо шта тачно да покажемо купцима. Морамо да филтрирамо једну тачну вредност из тона прљавштине и муља, баш као што фламингоси раде за ручком.
Посебна карактеристика фламингоса је њихов масивни надоле закривљен кљун, којим филтрирају храну из воде или блата.
- 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
конфигурациони параметар 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, са валидатором приказаним испод.
и Vela.purge/1 тихо уклања све застареле вредности сваки пут када нам затребају подаци. Да бисмо приступили стварним вредностима, једноставно их позовемо Vela.slice/1, а када је потребна мала историја курса (цела серија), једноставно је враћамо - већ сортирану - са валидираним вредностима.