프로세스 그룹

프로세스를 명명된 그룹에 참여시키고 클러스터 전체의 모든 멤버에게 브로드캐스트합니다. Erlang/OTP pg를 모델로 합니다: 그룹은 동적이고, 프로세스는 여러 그룹에 속할 수 있으며, 멤버십은 gossip을 통해 클러스터 전체에서 추적됩니다.

범위 엔트리 종류와 설정은 프로세스 그룹을 참조하세요. 더 넓은 클러스터링 모델은 클러스터 가이드를 참조하세요.

로딩

local pg = require("pg")

범위 열기

프로세스 그룹은 범위pg.scope 레지스트리 엔트리 — 안에 존재합니다. 범위를 열어 작업할 인스턴스를 가져옵니다:

local group, err = pg.open("app:pg")
if err then
    return nil, err
end
파라미터 타입 설명
id string 범위 엔트리 ID (형식: "namespace:name")

반환: pg.Instance, error

권한: 범위 id에 대한 pg.open

프로세스가 종료되면 인스턴스가 자동으로 해제됩니다; 더 일찍 해제하려면 release()를 호출하세요. 다른 모든 작업은 인스턴스의 메서드이며, :로 호출됩니다.

참여 및 탈퇴

local ok, err = group:join("workers")           -- 단일 그룹
local ok, err = group:join({"workers", "all"})  -- 배치
local ok, err = group:leave("workers")
파라미터 타입 설명
group string | string[] 그룹 이름, 또는 배치 작업을 위한 이름 목록

반환: boolean, error

프로세스는 동일한 그룹에 여러 번 참여할 수 있으며, 완전히 탈퇴하려면 같은 횟수만큼 탈퇴해야 합니다(다중 참여 시맨틱). leave는 배치에서 최선 노력 방식이며, 프로세스가 명명된 그룹 중 어느 것의 멤버도 아닌 경우에만 오류를 반환합니다.

권한: 각 그룹 이름에 대한 pg.join / pg.leave

멤버 목록 조회

local members, err = group:get_members("workers")        -- 모든 노드
local local_members, err = group:get_local_members("workers")  -- 이 노드만
파라미터 타입 설명
group string 그룹 이름

반환: string[], error — PID 문자열 배열 (알 수 없는 그룹의 경우 빈 배열)

권한: 그룹 이름에 대한 pg.get_members / pg.get_local_members

그룹 목록 조회

local groups, err = group:which_groups()         -- 클러스터의 모든 그룹
local local_groups, err = group:which_local_groups()  -- 로컬 멤버가 있는 그룹

반환: string[], error — 현재 멤버가 하나 이상 있는 그룹 이름

권한: pg.which_groups / pg.which_local_groups

브로드캐스트

그룹의 모든 멤버에게 메시지를 전송합니다. 각 멤버는 호출 프로세스로부터 topic 아래에서 수신합니다 — process.listen(topic)으로 처리하세요.

local ok, err = group:broadcast("workers", "task", {id = 42})   -- 모든 노드
local ok, err = group:broadcast_local("workers", "task", {id = 42})  -- 이 노드만
파라미터 타입 설명
group string 대상 그룹
topic string 메시지 토픽
... any 0개 이상의 페이로드 값

반환: boolean, error

권한: 그룹 이름에 대한 pg.broadcast / pg.broadcast_local

그룹 모니터링

monitor는 하나의 그룹에 대한 참여/탈퇴 이벤트를 구독하고 현재 멤버를 원자적으로 반환합니다 — 스냅샷과 구독 사이에서 멤버십 변경이 누락될 수 없습니다.

local sub, members, err = group:monitor("workers")
if err then
    return nil, err
end

for _, pid in ipairs(members) do
    -- 구독 시점의 현재 멤버
end

local ch = sub:channel()
local event = ch:receive()  -- {kind = "member.joined" | "member.left", path = "workers", data = {...}}

sub:close()  -- 구독 해제; sub:close({flush = true})는 먼저 대기 중인 이벤트를 소진
파라미터 타입 설명
group string 감시할 그룹

반환: pg.Subscription, string[], error — 구독과 현재 멤버의 스냅샷

권한: 그룹 이름에 대한 pg.monitor

모든 그룹 감시

events는 범위의 모든 그룹에 걸쳐 멤버십 변경을 구독하고 모든 그룹의 멤버에 대한 스냅샷을 반환합니다.

local sub, snapshot, err = group:events()
-- snapshot: { ["workers"] = {pid, ...}, ["all"] = {pid, ...} }

local event = sub:channel():receive()
sub:close()

반환: pg.Subscription, table, error

권한: pg.events

이벤트 필드

구독 채널에서 전달되는 이벤트는 다음을 포함합니다:

필드 타입 설명
system string 항상 "pg"
kind string "member.joined" 또는 "member.left"
path string 그룹 이름
data table {Group = string, PIDs = string[]} — 영향받는 멤버

구독 채널은 버퍼링됩니다(용량 64); 느린 소비자가 버퍼를 가득 채우면 해당 구독에 대한 추가 이벤트는 삭제됩니다.

해제

group:release()

인스턴스를 즉시 해제합니다. 멱등합니다; 해제 후 모든 메서드는 오류를 반환합니다. 프로세스 종료 시 정리도 자동으로 실행됩니다.

반환: boolean

권한

권한 메서드 리소스
pg.open pg.open() 범위 id
pg.join join() 그룹 이름
pg.leave leave() 그룹 이름
pg.get_members get_members() 그룹 이름
pg.get_local_members get_local_members() 그룹 이름
pg.which_groups which_groups() (범위)
pg.which_local_groups which_local_groups() (범위)
pg.broadcast broadcast() 그룹 이름
pg.broadcast_local broadcast_local() 그룹 이름
pg.monitor monitor() 그룹 이름
pg.events events() (범위)

에러

조건 종류
권한 거부됨 errors.PERMISSION_DENIED
인수 누락 또는 빈 인수 errors.INVALID
범위 찾을 수 없음 errors.NOT_FOUND
멤버십 없는 그룹 탈퇴 errors.INVALID
인스턴스 해제됨 errors.INVALID

에러 처리는 에러 처리를 참조하세요.

참고