ในฟินเทค เรามักจะต้องประมวลผลข้อมูลอัตราแลกเปลี่ยนเงินตราจำนวนมหาศาล เราได้รับข้อมูลจากแหล่งต่างๆ และแต่ละแหล่งก็มีแนวคิดของตัวเองว่าจะคาดการณ์อัตราแลกเปลี่ยนสำหรับวันพรุ่งนี้ วันมะรืนนี้ เดือนหน้า และแม้แต่สามปีข้างหน้าเป็นของตัวเอง หากมีเพียงใครสักคนเท่านั้นที่สามารถทำนายอัตราได้ ได้อย่างถูกต้องถึงเวลาปิดกิจการแล้วก็แค่เปลี่ยนเงินกลับไปกลับมาอย่างโง่เขลา แหล่งข้อมูลบางแห่งมีความน่าเชื่อถือมากกว่า บางแห่งจัดหาขยะโดยสมบูรณ์ โดยมีค่าเกือบถูกต้องซึ่งหาได้ยาก แต่สำหรับคู่รักที่แปลกใหม่ งานของเราคือการกรองค่านับหมื่นต่อวินาทีและตัดสินใจว่าจะแสดงอะไรให้กับลูกค้าอย่างแน่นอน เราจำเป็นต้องกรองค่าที่ถูกต้องหนึ่งค่าออกจากสิ่งสกปรกและตะกอนจำนวนมาก เช่นเดียวกับที่นกฟลามิงโกทำในมื้อกลางวัน
ลักษณะพิเศษที่โดดเด่นของฟลามิงโกคือจะงอยปากโค้งลงขนาดใหญ่ซึ่งใช้กรองอาหารจากน้ำหรือโคลน
-วิคกี้
ห้องสมุดจึงถือกำเนิดขึ้น 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
และเมื่อจำเป็นต้องมีประวัติเล็กน้อยของหลักสูตร (ทั้งชุด) เราก็เพียงส่งคืน - จัดเรียงแล้ว - ด้วยค่าที่ผ่านการตรวจสอบแล้ว
แคชอนุกรมเวลาแห่งความสุข!
ที่มา: will.com