Vela → caché inteligente para series temporales y no solo

En fintech, a menudo tenemos que procesar cantidades bastante masivas de datos sobre el tipo de cambio. Obtenemos datos de diferentes fuentes, y cada uno de ellos tiene su propia idea de cómo extrapolar las tasas para mañana, pasado mañana, el próximo mes e incluso los próximos tres años. Si alguien supiera predecir los cursos correctamente, sería correcto cerrar el negocio y cambiar estúpidamente el dinero de un lado a otro. Algunas fuentes son más confiables, algunas suministran completamente basura, con raras inclusiones de valores casi correctos, pero para parejas exóticas. Nuestro trabajo es examinar estas decenas de miles de valores por segundo y determinar qué mostrar a los clientes. Necesitamos filtrar el único valor correcto de una tonelada de tierra y limo, como lo hacen los flamencos en la cena.



Flamenco



Una característica distintiva especial de los flamencos es su pico masivo y curvado, con el que filtran los alimentos del agua o el cieno.

 -  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