Vela → убакыт сериялары үчүн акылдуу кэш жана башкалар

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

Vela → убакыт сериялары үчүн акылдуу кэш жана башкалар

Фламинголордун өзгөчө бир айырмалоочу өзгөчөлүгү – алардын ылдый карай ийилген чоң тумшугу, алар тамак-ашты суудан же ылайдан чыпкалайт.
 - Vicki

Ошентип китепкана пайда болду 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 ар бир саптагы баалуулуктарга төмөн деңгээлде кирүү үчүн.

арыз

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

Комментарий кошуу