ElGraph.Signal.Bus.Pg (ElGraph v0.3.0)

Copy Markdown View Source

:pg 기반 분산 시그널 버스 transport (SPEC §6).

버스 이름이 :pg scope가 된다. 구독은 패턴을 그룹키로 :pg.join하고, 발행은 scope의 모든 그룹 중 시그널 타입에 매칭되는 것의 멤버에게 send_signal한다. :pg가 클러스터 전체 멤버십을 동기화하므로 발행은 원격 노드의 Agent에도 닿는다.

함수 구독은 지원하지 않는다 (fun은 노드 경계를 넘지 못한다) — ElGraph.Signal.Bus가 거부.

분산 운영 (SPEC §6)

  • 클러스터 형성 — ElGraph는 코어 의존성 0 원칙상 클러스터러를 번들하지 않는다. 호스트 앱이 libcluster로 노드를 잇는다(예: Cluster.Strategy.Gossip). 노드가 연결되면 :pg가 같은 scope의 멤버십을 자동 동기화한다.
  • 전달 보장:pg 발행은 best-effort다. netsplit 회복 시 멤버십 재동기화로 같은 시그널이 재전달될 수 있다. ElGraph.Signal은 발행 시 id가 스탬프되므로, 수신 측은 ElGraph.Signal.Dedup(또는 ElGraph.Agentdedup: max 옵션)으로 at-least-once를 멱등하게 처리한다 — 재전달은 한 번만 실행된다.
  • netsplit — 분단 중에는 각 파티션이 자기 멤버에게만 닿는다(전달 손실 가능 — best-effort). 회복 후 :pg가 멤버십을 재조정하며, 중복 전달은 위 멱등 수신으로 흡수된다.

멀티노드 fan-out 검증: test/el_graph/signal/bus_multinode_test.exs(:distributed, :peer 2노드).