Vela → խելացի քեշ ժամանակային շարքերի համար և ավելին

Ֆինտեխում մենք հաճախ ստիպված ենք լինում մշակել արժույթի փոխարժեքի տվյալների բավականին մեծ ծավալներ։ Մենք տվյալներ ենք ստանում տարբեր աղբյուրներից, և նրանցից յուրաքանչյուրն ունի իր սեփական պատկերացումն այն մասին, թե ինչպես կարելի է արտարժույթի արտարժույթը վաղը, մյուս օրը, հաջորդ ամիսը և նույնիսկ հաջորդ երեք տարին: Եթե ​​միայն ինչ-որ մեկը կարողանա գուշակել տոկոսադրույքները ճիշտ, ժամանակն էր փակել բիզնեսը և ուղղակի հիմարաբար փող փոխել: Որոշ աղբյուրներ ավելի հուսալի են, ոմանք մատակարարում են ամբողջական աղբ, գրեթե ճիշտ արժեքների հազվադեպ ընդգրկումներով, բայց էկզոտիկ զույգերի համար: Մեր գործն է մաղել այս տասնյակ հազարավոր արժեքները վայրկյանում և որոշել, թե կոնկրետ ինչ ցույց տալ հաճախորդներին: Մենք պետք է զտենք մեկ ճիշտ արժեքը տոննաներով կեղտից և տիղմից, ճիշտ այնպես, ինչպես դա անում են ֆլամինգոները ճաշի ժամանակ:

Vela → խելացի քեշ ժամանակային շարքերի համար և ավելին

Ֆլամինգոների առանձնահատուկ տարբերակիչ հատկանիշը նրանց զանգվածային դեպի ներքեւ կոր կտուցն է, որով նրանք զտում են սնունդը ջրից կամ ցեխից։
 - Վիքի

Այսպես ծնվեց գրադարանը 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 սահմանված է տվյալ բանալիի համար, կամ պարզապես արժեքը կդնի ցուցակի գլխում (LIFO- ն, տես գլուխը Տեսակավորել ստորև);
  • կկտրի տողը ըստ պարամետրի :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 յուրաքանչյուր շարքի արժեքներին ցածր մակարդակի հասանելիության համար:

App

Vela կարող է չափազանց օգտակար լինել որպես ժամանակային շարքի քեշ այնպիսի գործընթացի վիճակում, ինչպիսին է GenServer/Agent. Մենք ուզում ենք երբեք չօգտագործել հնացած կուրսային արժեքներ, և դա անելու համար մենք պարզապես պետականորեն ընթացք ենք տալիս Vela, ստորև ներկայացված վավերացնողով:

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

и Vela.purge/1 հանգիստ հեռացնում է բոլոր հնացած արժեքները ամեն անգամ, երբ մեզ անհրաժեշտ են տվյալներ: Փաստացի արժեքներին մուտք գործելու համար մենք պարզապես զանգահարում ենք Vela.slice/1, և երբ պահանջվում է դասընթացի փոքր պատմություն (ամբողջ շարքը), մենք պարզապես վերադարձնում ենք այն՝ արդեն տեսակավորված, վավերացված արժեքներով։

Ուրախ ժամանակային շարքերի քեշավորում:

Source: www.habr.com

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