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 өгөгдсөн түлхүүрийн хувьд тодорхойлогдсон эсвэл зүгээр л утгыг жагсаалтын эхэнд тавина (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, бүлгийг үзнэ үү харьцуулалт доор.

Баталгаажуулалт амжилттай бол утгыг харгалзах түлхүүрийн доор жагсаалтад нэмнэ, эс тэгвээс tuple {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

сэтгэгдэл нэмэх