வேலா → நேரத் தொடர் மற்றும் பலவற்றிற்கான ஸ்மார்ட் கேச்

fintech இல், நாம் அடிக்கடி நாணய மாற்று வீதத் தரவின் மிகப் பெரிய அளவுகளை செயலாக்க வேண்டும். நாங்கள் வெவ்வேறு மூலங்களிலிருந்து தரவைப் பெறுகிறோம், மேலும் அவை ஒவ்வொன்றும் நாளை, நாளை மறுநாள், அடுத்த மாதம் மற்றும் அடுத்த மூன்று ஆண்டுகளுக்கும் கூட மாற்று விகிதங்களை எவ்வாறு விரிவாக்குவது என்பது பற்றிய அதன் சொந்த யோசனையைக் கொண்டுள்ளது. யாராவது விகிதங்களை கணிக்க முடிந்தால் சரியாக, வணிகத்தை மூடிவிட்டு, முட்டாள்தனமாக பணத்தை முன்னும் பின்னுமாக மாற்றுவதற்கான நேரம் இது. சில ஆதாரங்கள் மிகவும் நம்பகமானவை, சில முழுமையான குப்பைகளை வழங்குகின்றன, கிட்டத்தட்ட சரியான மதிப்புகளின் அரிதான சேர்த்தல்களுடன், ஆனால் கவர்ச்சியான ஜோடிகளுக்கு. வினாடிக்கு இந்த பல்லாயிரக்கணக்கான மதிப்புகளைப் பிரித்து, வாடிக்கையாளர்களுக்கு சரியாகக் காட்டுவதைத் தீர்மானிப்பதே எங்கள் வேலை. ஃபிளமிங்கோக்கள் மதிய உணவில் செய்வது போல, டன் கணக்கில் அழுக்கு மற்றும் வண்டல் மண்ணிலிருந்து ஒரு சரியான மதிப்பை வடிகட்ட வேண்டும்.

வேலா → நேரத் தொடர் மற்றும் பலவற்றிற்கான ஸ்மார்ட் கேச்

ஃபிளமிங்கோக்களின் ஒரு சிறப்பு தனித்துவமான அம்சம் அவற்றின் பாரிய கீழ்நோக்கி வளைந்த கொக்கு ஆகும், இதன் மூலம் அவை தண்ணீர் அல்லது சேற்றில் இருந்து உணவை வடிகட்டுகின்றன.
 - விக்கி

இவ்வாறு நூலகம் உருவானது 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, அத்தியாயத்தைப் பார்க்கவும் ஒப்பீடு கீழே.

சரிபார்ப்பு வெற்றிகரமாக இருந்தால், மதிப்பு தொடர்புடைய விசையின் கீழ் பட்டியலில் சேர்க்கப்படும்; இல்லையெனில், டூப்பிள் {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

கருத்தைச் சேர்