Финтекийн хувьд бид ихэвчлэн маш их хэмжээний валютын ханшийн мэдээллийг боловсруулах шаардлагатай болдог. Бид өөр өөр эх сурвалжаас мэдээлэл авдаг бөгөөд тус бүр нь маргааш, нөгөөдөр, дараагийн сар, тэр байтугай дараагийн гурван жилийн ханшийг хэрхэн экстраполяци хийх талаар өөрийн гэсэн санаатай байдаг. Хэрэв хэн нэгэн хувь хэмжээг урьдчилан таамаглаж чадвал баруун, энэ нь бизнесийг хааж, зүгээр л тэнэг мөнгө нааш цааш солих цаг болсон байх болно. Зарим эх сурвалжууд илүү найдвартай, зарим нь бүрэн хог хаягдлыг нийлүүлдэг, бараг зөв үнэ цэнийг ховор оруулдаг, гэхдээ чамин хосуудын хувьд. Бидний ажил бол секундэд хэдэн арван мянган утгыг шүүж, хэрэглэгчдэд яг юу харуулахыг тодорхойлох явдал юм. Үдийн хоолондоо фламинго хийдэг шиг бид олон тонн шороо, шавар дундаас нэг зөв утгыг шүүж авах хэрэгтэй.
Фламингогийн өвөрмөц онцлог нь доошоо муруйсан том хошуу бөгөөд хоол хүнсийг ус эсвэл шавраас шүүдэг.
-Wiki
Ингээд номын сан үүссэн Vela
Гурван хос валютын ханшийг цуглууллаа гэж бодъё. Хамгийн энгийн тодорхойлолт 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