Vela โ†’ ์‹œ๊ณ„์—ด ๋“ฑ์„ ์œ„ํ•œ ์Šค๋งˆํŠธ ์บ์‹œ

ํ•€ํ…Œํฌ์—์„œ๋Š” ์ƒ๋‹นํžˆ ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ํ™˜์œจ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๊ฐ ์†Œ์Šค๋Š” ๋‚ด์ผ, ๋ชจ๋ ˆ, ๋‹ค์Œ ๋‹ฌ, ํ–ฅํ›„ XNUMX๋…„์— ๋Œ€ํ•œ ํ™˜์œจ์„ ์ถ”์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์ฒด ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ธˆ๋ฆฌ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฐ”๋ฅด๊ฒŒ, ์ด์ œ ์‚ฌ์—…์„ ๋‹ซ๊ณ  ์–ด๋ฆฌ์„๊ฒŒ ๋ˆ์„ ์•ž๋’ค๋กœ ๋ฐ”๊ฟ€ ์‹œ๊ฐ„์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์†Œ์Šค๋Š” ๋” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ณ  ์ผ๋ถ€ ์†Œ์Šค๋Š” ์™„์ „ํ•œ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ๊ฑฐ์˜ ์ •ํ™•ํ•œ ๊ฐ’์ด ๋“œ๋ฌผ๊ฒŒ ํฌํ•จ๋˜์ง€๋งŒ ์ด๊ตญ์ ์ธ ์ปคํ”Œ์—๊ฒŒ๋Š” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ž„๋ฌด๋Š” ์ดˆ๋‹น ์ˆ˜๋งŒ ๊ฐœ์˜ ๊ฐ’์„ ์„ ๋ณ„ํ•˜์—ฌ ๊ณ ๊ฐ์—๊ฒŒ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”Œ๋ผ๋ฐ๊ณ ๊ฐ€ ์ ์‹ฌ ์‹œ๊ฐ„์— ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์šฐ๋ฆฌ๋Š” ์ˆ˜๋งŽ์€ ํ™๊ณผ ๋ฏธ์‚ฌ์—์„œ ํ•˜๋‚˜์˜ ์ •ํ™•ํ•œ ๊ฐ’์„ ๊ฑธ๋Ÿฌ๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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, ์ฝ”์Šค์˜ ์ž‘์€ ๊ธฐ๋ก(์ „์ฒด ์‹œ๋ฆฌ์ฆˆ)์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒ€์ฆ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ–‰๋ณตํ•œ ์‹œ๊ณ„์—ด ์บ์‹ฑ!

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€