Vela β†’ vaqt seriyalari va boshqalar uchun aqlli kesh

Fintechda biz ko'pincha juda katta hajmdagi valyuta kursi ma'lumotlarini qayta ishlashimiz kerak. Biz turli manbalardan ma'lumotlarni olamiz va ularning har biri ertaga, ertaga, keyingi oy va hatto keyingi uch yil uchun valyuta kurslarini qanday ekstrapolyatsiya qilish haqida o'z fikriga ega. Agar kimdir stavkalarni bashorat qilsa o'ng, biznesni yopish va faqat ahmoqona pulni oldinga va orqaga almashtirish vaqti keldi. Ba'zi manbalar ishonchliroq, ba'zilari esa deyarli to'g'ri qiymatlarning kamdan-kam qo'shilishi bilan to'liq axlat bilan ta'minlaydi, ammo ekzotik juftliklar uchun. Bizning vazifamiz soniyada o'n minglab qiymatlarni elakdan o'tkazish va mijozlarga aniq nimani ko'rsatishni aniqlashdir. Tushlik paytida flamingolar qilganidek, biz tonnalab axloqsizlik va loydan bitta to'g'ri qiymatni filtrlashimiz kerak.

Vela β†’ vaqt seriyalari va boshqalar uchun aqlli kesh

Flamingolarning o'ziga xos ajralib turadigan xususiyati ularning katta pastga egri tumshug'i bo'lib, ular oziq-ovqatni suv yoki loydan filtrlaydi.
 - Wiki

Shunday qilib, kutubxona tug'ildi Vela, u belgilangan vaqt oralig'ida bir nechta qiymatlar uchun davlat keshini saqlaydi. Kaput ostida u yomon va eskirgan ma'lumotlarni tezda filtrlaydi, shuningdek, eng so'nggi ma'lumotlarga kirishni ta'minlaydi N har bir kalit uchun tasdiqlangan qiymatlar (valyuta juftlari, bizning holatlarimizda).

Aytaylik, biz uchta valyuta juftligi uchun stavkalarni yig'amiz. Eng oddiy ta'rif Vela joriy holatni saqlash uchun u shunday ko'rinadi:

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

Qiymatlarni yangilash

Vela.put/3 Funktsiya ketma-ketlikda quyidagilarni bajaradi:

  • sabab bo'ladi validator qiymat bo'yicha, agar aniqlangan bo'lsa (bo'limga qarang Tasdiqlash quyida);
  • Agar tekshirish muvaffaqiyatli bo'lsa, qiymatni yaxshi qiymatlar qatoriga yoki xizmat qatoriga qo'shadi :__errors__ aks holda;
  • saralashga sabab bo'ladi, agar sorter berilgan kalit uchun belgilangan yoki shunchaki qiymatni ro'yxatning boshiga qo'yadi (LIFO, bobga qarang saralash quyida);
  • parametrga muvofiq qatorni kesadi :limit yaratilishdan o'tgan;
  • yangilangan tuzilmani qaytaradi 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]}

Bundan tashqari Vela asboblar Access, shuning uchun siz qiymatlarni yangilash uchun arsenaldan tuzilmalarni chuqur yangilash uchun har qanday standart funktsiyalardan foydalanishingiz mumkin Kernel: Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3, Kernel.pop_in/2va Kernel.get_and_update_in/3.

Tasdiqlash

Validator quyidagicha ta'riflanishi mumkin:

  • bitta argumentli tashqi funksiya (&MyMod.my_fun/1), u faqat tekshirish uchun qiymat oladi;
  • ikki argumentli tashqi funktsiya, &MyMod.my_fun/2, u juftlik oladi serie, value tasdiqlash uchun;
  • modulni amalga oshirish Vela.Validator;
  • konfiguratsiya parametri threshold, va - ixtiyoriy - compare_by, bobga qarang qiyoslash quyida ko'rsatilgan.

Agar tekshirish muvaffaqiyatli bo'lsa, qiymat mos keladigan kalit ostidagi ro'yxatga qo'shiladi; aks holda, kortej {serie, value} boradi :__errors_.

Taqqoslash

Ushbu qatorlarda saqlangan qiymatlar har qanday bo'lishi mumkin. O'rgatish Vela ularni solishtirish uchun o'tkazish kerak compare_by seriya ta'rifidagi parametr (agar qiymatlarni standart bilan taqqoslab bo'lmasa). Kernel.</2); bu parametr turi bo'lishi kerak (Vela.value() -> number()). Odatiy bo'lib, bu oddiy & &1.

Bundan tashqari, qator ta'rifiga parametr o'tkazishingiz mumkin comparator delta qiymatlarini hisoblash uchun (min/max); masalan, uzatish orqali Date.diff/2 taqqoslash sifatida siz sanalar uchun to'g'ri deltalarni olishingiz mumkin.

Ishlashning yana bir qulay usuli - parametrni o'tkazish threshold, bu yangi qiymatning maksimal ruxsat etilgan nisbatini belgilaydi {min, max} interval. U foiz sifatida ko'rsatilganligi sababli, chek ishlatilmaydi comparatorlekin hali ham ishlatadi compare_by. Masalan, sana vaqtlari uchun chegara qiymatini belgilash uchun siz belgilashingiz kerak compare_by: &DateTime.to_unix/1 (butun qiymatni olish uchun) va threshold: 1, yangi qiymatlarga faqat ular mavjud bo'lganda ruxsat berilishiga olib keladi Β±band joriy qiymatlardan interval.

Nihoyat, siz foydalanishingiz mumkin Vela.equal?/2 ikkita keshni solishtirish uchun. Agar qiymatlar funktsiyani aniqlasa equal?/2 yoki compare/2, keyin bu funktsiyalar taqqoslash uchun ishlatiladi, aks holda biz ahmoqona foydalanamiz ==/2.

Qadriyatlarni olish

Joriy holatni qayta ishlash odatda qo'ng'iroq qilishdan boshlanadi Vela.purge/1, bu eskirgan qiymatlarni olib tashlaydi (agar validator ga bog'langan timestamps). Keyin qo'ng'iroq qilishingiz mumkin Vela.slice/1qaysi qaytib keladi keyword kalit sifatida qator nomlari va birinchi, haqiqiy qiymatlar bilan.

Siz ham foydalanishingiz mumkin get_in/2/pop_in/2 har bir satrdagi qiymatlarga past darajadagi kirish uchun.

ariza

Vela kabi jarayon holatida vaqt seriyali kesh sifatida juda foydali bo'lishi mumkin GenServer/Agent. Biz hech qachon eskirgan kurs qiymatlaridan foydalanmaslikni istaymiz va buning uchun jarayonni qayta ishlangan holatda ushlab turamiz Vela, quyida ko'rsatilgan validator bilan.

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

ΠΈ Vela.purge/1 har safar ma'lumotlar kerak bo'lganda barcha eskirgan qiymatlarni jimgina olib tashlaydi. Haqiqiy qiymatlarga kirish uchun biz shunchaki qo'ng'iroq qilamiz Vela.slice/1, va kursning kichik tarixi kerak bo'lganda (butun seriya), biz uni allaqachon saralangan holda tasdiqlangan qiymatlar bilan qaytaramiz.

Vaqt seriyasini keshlash baxtli!

Manba: www.habr.com

a Izoh qo'shish