1. 연결
연결하면 req:hello 를 자동 전송합니다. 서버에 GATEWAY_REQUESTER_TOKEN 이 설정돼 있지 않으면 토큰은 비워도 됩니다.
2. 요청 만들기 — req:submit
반복 횟수를 2 이상으로 하면 jobId 뒤에 -1, -2 … 를 붙여 동시에 제출합니다(부하/분배 확인용).
3. 결과
| 시각 | jobId | action | 결과 | status | 소요 | 오류 |
|---|
(아직 결과 없음)
4. 메시지 로그
REST 인그레스 테스트
WS 없이 HTTP 로 같은 작업을 제출합니다(워커 REST 계약 그대로). 성공 시 gzip JSON, 가용 봇 없음/타임아웃 시 503 text/plain.
(아직 응답 없음)
1. 실제 요청 분석 — 봇으로 흘러가는 파라미터 관측
게이트웨이가 최근 받은 req:submit 샘플에서 payload 의 최상위 키를 모아 보여줍니다.
긴 값은 절삭되어 보관됩니다(GATEWAY_RECENT_JOBS_VALUE_MAX). admin 토큰이 필요합니다.
버퍼에 쌓인 action — 클릭하면 그 action 으로 바꿉니다
관측된 payload 파라미터 — 마우스를 올리면 값 예시
최근 샘플 — 행을 클릭하면 아래 요청 폼에 채웁니다
| 시각 | jobId | payload |
|---|---|---|
| 불러오지 않음 | ||
2. 요청 만들기 — req:submit (WS /requester)
운영 중인 봇으로 실제 작업이 나갑니다 — 한 번에 1건만 보냅니다. 소켓은 WebSocket /requester 탭에서 먼저 연결해야 합니다.
3. 응답 — GraphQL 뷰
data
errors GraphQL 오류 — HTTP 200 이어도 실패입니다
(아직 결과 없음)
4. 이 탭에서 보낸 요청
| 시각 | jobId | 결과 | status | 소요 | 오류코드 |
|---|---|---|---|---|---|
| 아직 보낸 요청 없음 | |||||
현재 처리 가능한 action
봇이 bot:register 에서 신고한 capability 중, healthy + ready 인 봇이 가진 것만 실제로 배정됩니다.
봇 서버
| botId | 상태 | READY | inflight/최대 | capabilities | 처리(성공/총) | 지연ms |
|---|---|---|---|---|---|---|
| 불러오지 않음 | ||||||
요청자 프로토콜 (/requester)
| 방향 | type | 설명 |
|---|---|---|
| → | req:hello | 최초 1회. { type, token? } |
| ← | gw:hello | { ok, serverTime }. 실패 시 4401 로 종료 |
| → | req:submit | { jobId, action, payload, timeoutMs?, maxAttempts? } — jobId 는 멱등 키 |
| ← | gw:result | { jobId, success, status, body, error } |
| → | req:result_ack | { jobId } — 반드시 보내야 봇 캐시가 비워짐 |
| → | req:heartbeat | ← gw:heartbeat_ack |
오류 코드
| code | retryable | 의미 |
|---|---|---|
INVALID_PAYLOAD | false | jobId/action 누락 |
QUEUE_FULL | true | 내부 큐 상한 초과 |
NO_ELIGIBLE_BOT | true | 해당 action 가능한 봇 없음 |
JOB_TIMEOUT | true | timeoutMs 내 결과 없음 |
ACK_TIMEOUT | true | 봇이 3초 내 ack 안 함 |
BOT_REJECTED | true | 봇이 수신 거부 |
BOT_DISCONNECTED | true | 수행 중 봇 연결 끊김 |
BOT_RECONNECT | true | 수행 중 봇이 재등록 |
retryable: true 는 게이트웨이가 이미 maxAttempts 만큼 재배정한 뒤의 최종 통지입니다. 요청자는 같은 jobId 로 재전송하면 됩니다(멱등).