Vela → уақыт серияларына арналған смарт кэш және т.б

Финтехте біз жиі валюта бағамы туралы деректердің өте үлкен көлемін өңдеуіміз керек. Біз әртүрлі дереккөздерден деректерді аламыз және олардың әрқайсысында ертең, ертеңгі күнге, келесі айға және тіпті келесі үш жылға валюта бағамдарын қалай экстраполяциялау керектігі туралы өз идеясы бар. Біреу тарифтерді болжай алса құқық, бұл бизнесті жауып, ақшаны ақымақтықпен алға-артқа ауыстыратын уақыт болар еді. Кейбір көздер сенімдірек, кейбіреулері дерлік дұрыс мәндердің сирек қосындылары бар толық қоқыспен қамтамасыз етеді, бірақ экзотикалық жұптар үшін. Біздің жұмысымыз секундына осы ондаған мың мәндерді електен өткізу және тұтынушыларға нақты не көрсету керектігін анықтау. Түскі ас кезінде қоқиқаздар сияқты, біз тонналай кір мен лайдан бір дұрыс мәнді сүзіп алуымыз керек.

Vela → уақыт серияларына арналған смарт кэш және т.б

Қоқиқаздардың ерекше ерекшелігі - олардың төмен қарай қисық массивтік тұмсығы, олар тамақты судан немесе балшықтан сүзеді.
 - 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, және курстың шағын тарихы қажет болғанда (барлық серия), біз оны расталған мәндермен сұрыпталған - жай ғана қайтарамыз.

Бақытты уақыт серияларын кэштеу!

Ақпарат көзі: www.habr.com

пікір қалдыру