멱등 수신용 경계 있는(bounded) 중복 id 집합 (SPEC §6, at-least-once 안전).
분산(:pg) 전달은 best-effort라 netsplit 회복 등에서 같은 시그널이 재전달될 수 있다.
수신 측이 이 구조로 Signal.id를 추적하면 재전달을 안전하게 한 번만 처리한다.
순수 함수형(별도 프로세스 없음)이라 어느 GenServer 상태에든 박아 쓴다.
메모리는 max개로 제한되며, 초과 시 가장 오래된 id를 잊는다(경계 트레이드오프 —
아주 오래 전 id는 다시 새로 보일 수 있다). ElGraph.Agent는 dedup: 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
@type t() :: %ElGraph.Signal.Dedup{ count: non_neg_integer(), max: pos_integer(), order: [term()], seen: MapSet.t() }
Functions
@spec new(pos_integer()) :: t()
최대 max개 id를 기억하는 빈 dedup을 만든다.
id를 기록한다. 처음 보면 {:new, dedup}, 이미 봤으면 {:duplicate, dedup}.
새 id 추가로 max를 넘으면 가장 오래된 id를 제거한다.