프로세스 그룹

프로세스 그룹을 사용하면 프로세스가 명명된 그룹에 참여하고 그룹에 주소된 브로드캐스트를 수신할 수 있으며, 멤버십은 클러스터의 모든 노드에서 추적됩니다. 모델은 Erlang/OTP pg를 따릅니다: 그룹은 첫 번째 참여 시 생성되고, 프로세스는 여러 그룹에 속할 수 있으며(한 그룹에 여러 번 참여 가능), 멤버십은 분산형입니다 — 각 노드가 자체 상태를 유지하고 노드 간 메시를 통해 피어와 조정합니다.

Lua API는 프로세스 그룹에 문서화되어 있습니다; 이 페이지는 범위 엔트리 종류와 설정을 다룹니다. 멤버십 모델은 클러스터 가이드를 참조하세요.

엔트리 종류

종류 설명
pg.scope 자체 멤버십 상태와 클러스터 메시를 가진 독립적인 프로세스 그룹 네임스페이스

각 범위는 격리됩니다: 한 범위의 그룹과 멤버는 다른 범위에서 보이지 않습니다. 프로세스는 엔트리 ID로 범위를 열고(pg.open("app:pg")) 그 안에서 작동합니다.

- name: pg
  kind: pg.scope
  lifecycle:
    auto_start: true

설정

모든 필드는 선택적이며 일반적인 클러스터에 맞게 조정된 기본값을 가집니다.

필드 타입 기본값 설명
protocol_timeout duration 5s 노드 간 sync/discover 작업의 타임아웃
broadcast_timeout duration 5s 단일 멤버에게 브로드캐스트 전달 타임아웃
anti_entropy_interval duration 30s 조정 루프 주기; 틱당 하나의 피어가 동기화됨 (0이면 비활성화)
circuit_breaker_failures int 3 서킷을 열기 전 노드에 대한 연속 전송 실패 횟수
circuit_breaker_reset_time duration 10s 열린 서킷이 테스트 전송을 위해 반개방으로 이동하기 전 대기 시간
max_retries int 3 실패한 브로드캐스트의 재시도 횟수 (0이면 재시도 비활성화)
retry_base_delay duration 100ms 재시도 간 초기 백오프 지연
retry_max_delay duration 1s 최대 백오프 지연
action_queue_size int 256 "용량 접근 중" 경고가 기록되는 깊이
action_queue_max_size int 1024 내부 이벤트 루프 큐의 하드 용량; 가득 차면 작업이 삭제됨
monitor_buffer int 64 구독별 이벤트 채널 용량; 버퍼가 가득 찬 구독자의 이벤트 삭제
max_groups int 0 최대 고유 그룹 수 (0 = 무제한)
max_members_per_group int 0 그룹당 최대 멤버 수, 다중 참여 포함 (0 = 무제한)
- name: pg
  kind: pg.scope
  anti_entropy_interval: 30s
  circuit_breaker_failures: 3
  max_members_per_group: 10000
  lifecycle:
    auto_start: true

작동 방식

단일 쓰기 상태. 각 범위는 단일 고루틴 이벤트 루프(gen_server 패턴)를 실행합니다. 모든 변경은 이를 통해 직렬화되고; 멤버와 그룹의 읽기는 원자적으로 발행된 스냅샷에서 제공되므로 루프를 차단하지 않습니다.

참여/탈퇴 전파. 로컬 참여 또는 탈퇴는 루프에 적용되고 나서 라이브 멤버십 피어와 이전에 발견된 원격 노드의 합집합으로 팬아웃됩니다. 그 합집합으로 전송하면 새로 참여하거나 아직 수렴하지 않은 노드도 변경을 수신하도록 보장합니다.

브로드캐스트. broadcast는 루프 내에서 전체 클러스터 멤버 목록의 스냅샷을 찍은 다음, 느린 수신자가 범위를 중단시키지 못하도록 루프 외부에서 각 멤버에게 전달합니다. broadcast_local은 같은 작업을 수행하지만 로컬 노드의 멤버에게만 합니다.

모니터와 이벤트. 구독과 현재 멤버 스냅샷은 하나의 이벤트 루프 틱에서 발생하므로 구독자가 구독과 경쟁하는 변경을 놓치거나 이중으로 카운트하지 않습니다. 구독자는 member.joined / member.left 이벤트를 받습니다; N번 참여한 프로세스의 탈퇴는 PID를 N번 보고하여 다중성을 보존합니다.

안티-엔트로피와 디스커버리. 시작 시, 범위가 피어의 작은 랜덤 부분 집합에 discover 메시지를 보냅니다(많은 노드가 동시에 재시작할 때 N² 폭풍을 피하기 위해 제한됨). 노드가 참여하면 전체 상태 동기화를 받습니다. 안티-엔트로피 루프는 주기적으로 한 번에 하나의 피어에게 전체 동기화를 푸시하므로, 피어가 놓친 브로드캐스트가 결국 수렴합니다. 수신자는 차등 동기화를 적용합니다 — 실제로 추가되거나 제거된 멤버만 이벤트를 발행합니다.

서킷 브레이커. 노드별 서킷 브레이커가 연속 전송 실패를 추적합니다. circuit_breaker_failures 실패 후 서킷이 열리고 해당 노드로의 전송이 circuit_breaker_reset_time이 경과할 때까지 건너뜁니다. 그 후 하나의 테스트 전송이 허용됩니다. 열린 브레이커에 부딪히는 참여/탈퇴 브로드캐스트는 max_retries까지 지수 백오프로 재시도됩니다.

관측성

활성 상태 헬스 체크(pg.broadcast_recent.<scope>)는 범위가 장기간 브로드캐스트 트래픽을 보지 못하면 비정상을 보고하여, 막힌 이벤트 루프나 지속적인 파티션을 표시합니다. 관측성 가이드를 참조하세요.

참고