Vela → cache intelligent pour les séries chronologiques et pas seulement

Dans la fintech, nous devons souvent traiter des quantités assez massives de données sur les taux de change. Nous obtenons des données de différentes sources, et chacune d'elles a sa propre idée de la façon d'extrapoler les taux pour demain, après-demain, le mois suivant et même les trois prochaines années. Si quelqu'un savait comment prédire correctement les cours, il serait juste de fermer l'entreprise et de simplement changer bêtement de l'argent d'avant en arrière. Certaines sources sont plus fiables, certaines fournissent complètement des déchets, avec de rares inclusions de valeurs presque correctes, mais pour les couples exotiques. Notre travail consiste à passer au crible ces dizaines de milliers de valeurs par seconde et à déterminer ce qu'il faut montrer aux clients. Nous devons filtrer la seule valeur correcte d'une tonne de saleté et de limon, comme le font les flamants roses au dîner.



Flamant



Une caractéristique particulière des flamants roses est leur bec massif et incurvé, à l'aide duquel ils filtrent la nourriture de l'eau ou du limon.

 -  wiki

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, and Kernel.get_and_update_in/3.





:



  • (&MyMod.my_fun/1), ;
  • , &MyMod.my_fun/2, serie, value ;
  • , Vela.Validator;
  • threshold,  —  — compare_by, . Comparison .


, , {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, ( ),  —  — .








!




All Articles