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، به فصل مراجعه کنید مقایسه در زیر

اگر اعتبارسنجی موفقیت آمیز باشد، مقدار به لیست زیر کلید مربوطه اضافه می شود، در غیر این صورت، تاپل {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

اضافه کردن نظر