Vela → แคชอัจฉริยะสำหรับอนุกรมเวลาและอื่น ๆ

ในฟินเทค เรามักจะต้องประมวลผลข้อมูลอัตราแลกเปลี่ยนเงินตราจำนวนมหาศาล เราได้รับข้อมูลจากแหล่งต่างๆ และแต่ละแหล่งก็มีแนวคิดของตัวเองว่าจะคาดการณ์อัตราแลกเปลี่ยนสำหรับวันพรุ่งนี้ วันมะรืนนี้ เดือนหน้า และแม้แต่สามปีข้างหน้าเป็นของตัวเอง หากมีเพียงใครสักคนเท่านั้นที่สามารถทำนายอัตราได้ ได้อย่างถูกต้องถึงเวลาปิดกิจการแล้วก็แค่เปลี่ยนเงินกลับไปกลับมาอย่างโง่เขลา แหล่งข้อมูลบางแห่งมีความน่าเชื่อถือมากกว่า บางแห่งจัดหาขยะโดยสมบูรณ์ โดยมีค่าเกือบถูกต้องซึ่งหาได้ยาก แต่สำหรับคู่รักที่แปลกใหม่ งานของเราคือการกรองค่านับหมื่นต่อวินาทีและตัดสินใจว่าจะแสดงอะไรให้กับลูกค้าอย่างแน่นอน เราจำเป็นต้องกรองค่าที่ถูกต้องหนึ่งค่าออกจากสิ่งสกปรกและตะกอนจำนวนมาก เช่นเดียวกับที่นกฟลามิงโกทำในมื้อกลางวัน

Vela → แคชอัจฉริยะสำหรับอนุกรมเวลาและอื่น ๆ

ลักษณะพิเศษที่โดดเด่นของฟลามิงโกคือจะงอยปากโค้งลงขนาดใหญ่ซึ่งใช้กรองอาหารจากน้ำหรือโคลน
 - วิคกี้

ห้องสมุดจึงถือกำเนิดขึ้น 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และเมื่อจำเป็นต้องมีประวัติเล็กน้อยของหลักสูตร (ทั้งชุด) เราก็เพียงส่งคืน - จัดเรียงแล้ว - ด้วยค่าที่ผ่านการตรวจสอบแล้ว

แคชอนุกรมเวลาแห่งความสุข!

ที่มา: will.com

เพิ่มความคิดเห็น