ElGraph.Signal.Dedup (ElGraph v0.3.0)

Copy Markdown View Source

멱등 수신용 경계 있는(bounded) 중복 id 집합 (SPEC §6, at-least-once 안전).

분산(:pg) 전달은 best-effort라 netsplit 회복 등에서 같은 시그널이 재전달될 수 있다. 수신 측이 이 구조로 Signal.id를 추적하면 재전달을 안전하게 한 번만 처리한다.

순수 함수형(별도 프로세스 없음)이라 어느 GenServer 상태에든 박아 쓴다. 메모리는 max개로 제한되며, 초과 시 가장 오래된 id를 잊는다(경계 트레이드오프 — 아주 오래 전 id는 다시 새로 보일 수 있다). ElGraph.Agentdedup: max 옵션으로 자동 사용.

d = Dedup.new(1024)
{:new, d}       = Dedup.put(d, signal.id)   # 처음 본 id
{:duplicate, d} = Dedup.put(d, signal.id)   # 재전달 → 무시

Summary

Functions

최대 max개 id를 기억하는 빈 dedup을 만든다.

id를 기록한다. 처음 보면 {:new, dedup}, 이미 봤으면 {:duplicate, dedup}. 새 id 추가로 max를 넘으면 가장 오래된 id를 제거한다.

Types

t()

@type t() :: %ElGraph.Signal.Dedup{
  count: non_neg_integer(),
  max: pos_integer(),
  order: [term()],
  seen: MapSet.t()
}

Functions

new(max \\ 1024)

@spec new(pos_integer()) :: t()

최대 max개 id를 기억하는 빈 dedup을 만든다.

put(dedup, id)

@spec put(t(), term()) :: {:new | :duplicate, t()}

id를 기록한다. 처음 보면 {:new, dedup}, 이미 봤으면 {:duplicate, dedup}. 새 id 추가로 max를 넘으면 가장 오래된 id를 제거한다.