콘텐츠로 이동

프로세스 그룹

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

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

local pg = require("pg")

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

local group, err = pg.open("app:pg")
if err then
return nil, err
end
파라미터타입설명
idstring범위 엔트리 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")
파라미터타입설명
groupstring | string[]그룹 이름, 또는 배치 작업을 위한 이름 목록

반환: boolean, error

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

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

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

반환: 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}) -- 이 노드만
파라미터타입설명
groupstring대상 그룹
topicstring메시지 토픽
...any0개 이상의 페이로드 값

반환: 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})는 먼저 대기 중인 이벤트를 소진
파라미터타입설명
groupstring감시할 그룹

반환: 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

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

필드타입설명
systemstring항상 "pg"
kindstring"member.joined" 또는 "member.left"
pathstring그룹 이름
datatable{Group = string, PIDs = string[]} — 영향받는 멤버

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

group:release()

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

반환: boolean

권한메서드리소스
pg.openpg.open()범위 id
pg.joinjoin()그룹 이름
pg.leaveleave()그룹 이름
pg.get_membersget_members()그룹 이름
pg.get_local_membersget_local_members()그룹 이름
pg.which_groupswhich_groups()(범위)
pg.which_local_groupswhich_local_groups()(범위)
pg.broadcastbroadcast()그룹 이름
pg.broadcast_localbroadcast_local()그룹 이름
pg.monitormonitor()그룹 이름
pg.eventsevents()(범위)
조건종류
권한 거부됨errors.PERMISSION_DENIED
인수 누락 또는 빈 인수errors.INVALID
범위 찾을 수 없음errors.NOT_FOUND
멤버십 없는 그룹 탈퇴errors.INVALID
인스턴스 해제됨errors.INVALID

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