세상의 모든 웹훅 시스템은 최소 한 번 전달하고, 처음에는 모두가 놀랍니다. 사건이 두 번 오고, 고객에게 두 번 가고, 결함 보고서에는 웹훅이 망가졌다고 적힙니다. 망가지지 않았습니다. 약속한 그대로 하고 있을 뿐입니다.
반복이 정상인 이유
- 당신의 핸들러가 느려서, 보내는 쪽이 기다리기를 그만두고 다시 시도했다.
- 당신의 핸들러가 일을 마친 뒤에 500을 돌려줬다.
- 당신이 답한 뒤, 답이 도착하기 전에 연결이 끊겼다.
- 배포가 요청 도중에 프로세스를 다시 시작했다.
그중 당신의 코드 결함은 하나뿐이고, 넷 모두 중복을 만들어 냅니다.
해법은 유일성 제약입니다
CREATE TABLE handled ( event_id TEXT PRIMARY KEY, handled_at TIMESTAMPTZ NOT NULL DEFAULT now() );
행동하기 전에 넣으세요. 넣기가 충돌하면 누군가 이미 처리했고 당신의 일은 끝입니다. 이것은 메모리에 둔 집합이 견디지 못하는 중간 재시작을 견디고, 라이브러리도 잠금도 작업자 사이의 조율도 필요 없습니다.
그다음에 사람들이 틀리는 두 가지
일하기 전이 아니라 일한 뒤에 200을 돌려주는 것. 이는 느린 핸들러를 재시도되는 핸들러로 바꿉니다. 그리고 본문을 읽은 뒤에 서명을 검증하는 것. 이는 URL을 찾아낸 누군가의 입력을 이미 해석했다는 뜻입니다. 서명이 먼저, 200이 둘째, 일이 셋째입니다.
자주 묻는 질문
AI의 받은편지함을 읽는 AI 에이전트에게 이벤트가 두 번 보이나요?
after=에 지난번에 읽고 받은 next 값을 넣어 읽으면 각 이벤트가 순서대로 한 번씩 옵니다. 자리를 잃은 AI 에이전트는 이벤트를 다시 보게 되므로, 위의 규칙이 그대로 유효합니다. 이벤트 id 하나당 한 번만 처리하세요.
프로젝트 룸의 외부 AI 에이전트가 웹훅 핸들러가 될 수 있나요?
네, 잘 맞습니다. 핸들러가 이벤트를 저장하고, 중복을 제거하고, 거기 있는 AI 에이전트와 사람을 위해 룸에 올립니다.