HTTP 202 허용 (HTTP / 1.1)
당신은 HTTP 202 Accepted
상태를 찾고 있습니다. RFC 2616 참조 :
처리 요청이 승인되었지만 처리가 완료되지 않았습니다.
HTTP 102 처리 (WebDAV)
RFC 2518 은 다음을 사용하도록 제안합니다 HTTP 102 Processing
.
102 (처리 중) 상태 코드는 서버가 완료 요청을 수락했지만 아직 완료하지 않았 음을 클라이언트에 알리는 데 사용되는 임시 응답입니다.
그러나주의 사항이 있습니다.
요청이 완료된 후 서버는 반드시 최종 응답을 보내야합니다.
마지막 문장을 해석하는 방법을 잘 모르겠습니다. 서버가 처리하는 동안 아무것도 보내지 않아야 하고 완료 후에 만 응답해야 합니까? 아니면 처리 가 끝날 때만 응답을 강제 종료합니까? 진행 상황을보고하려는 경우 유용 할 수 있습니다. HTTP 102를 보내고 바이트 단위로 (또는 라인 단위로) 응답을 플러시합니다.
예를 들어 길지만 선형적인 프로세스의 경우 각 문자 다음에 플러시하여 100 개의 점을 보낼 수 있습니다. 클라이언트 측 (예 : JavaScript 응용 프로그램)이 정확히 100자를 예상해야한다는 것을 알고 있으면 진행률 표시 줄과 일치시켜 사용자에게 표시 할 수 있습니다.
다른 예는 여러 비선형 단계로 구성된 프로세스와 관련이 있습니다. 각 단계 후에 최종 사용자가 프로세스 진행 상황을 알 수 있도록 사용자에게 표시되는 로그 메시지를 플러시 할 수 있습니다.
점진적 플러싱 문제
이 기술에는 장점 이 있지만 권장하지는 않습니다 . 그 이유 중 하나는 연결을 강제로 열어 두어야하기 때문에 서비스 가용성 측면에서 문제가 생길 수 있으며 확장이 잘되지 않기 때문입니다.
더 나은 접근 방식은 응답을 처리 HTTP 202 Accepted
하고 나중에 사용자에게 다시 돌아와서 처리가 종료되었는지 여부를 결정하도록 /process/result
하는 것입니다 ( 예 : 프로세스까지 HTTP 404 Not Found 또는 HTTP 409 충돌로 응답 하는 지정된 URI를 반복해서 호출하여) 메시지 큐 서비스 ( 예 :) 또는 WebSocket을 통해 클라이언트를 다시 호출 할 수있는 경우 처리가 완료되면 사용자에게 알리거나 처리가 완료된 경우 사용자에게 알립니다 .
실제 예
비디오를 변환하는 웹 서비스를 상상해보십시오. 진입 점은 다음과 같습니다.
POST /video/convert
HTTP 요청에서 비디오 파일을 가져 와서 마술을합니다. 마술은 CPU를 많이 사용하므로 요청을 전송하는 동안 실시간으로 수행 할 수 없다고 가정 해 봅시다. 즉, 파일이 전송되면 서버는 HTTP 202 Accepted
JSON 콘텐츠로 응답 합니다. "예, 비디오를 받았으며 작업 중입니다. 향후 어딘가에 준비 될 것이며 ID 123을 통해 이용 가능할 것입니다.”
클라이언트는 처리가 완료되면 알림을 받기 위해 메시지 큐를 구독 할 수 있습니다. 완료되면 클라이언트는 다음으로 이동하여 처리 된 비디오를 다운로드 할 수 있습니다.
GET /video/download/123
이는 리드 HTTP 200
.
클라이언트가 알림을 받기 전에이 URI를 쿼리하면 어떻게됩니까? HTTP 404
실제로 서버는 비디오가 존재하지 않기 때문에 서버가 응답 합니다. 현재 준비 중일 수 있습니다. 요청되지 않았을 수 있습니다. 과거에는 일정 시간이 지난 후 나중에 제거 될 수 있습니다. 중요한 것은 결과 비디오를 사용할 수 없다는 것입니다.
이제 클라이언트가 최종 비디오뿐만 아니라 진행 상황 (메시지 대기열 서비스 또는 이와 유사한 메커니즘이없는 경우 더 중요)에 관심이 있다면 어떻게해야합니까?
이 경우 다른 엔드 포인트를 사용할 수 있습니다.
GET /video/status/123
다음과 비슷한 응답이 발생합니다.
HTTP 200
{
"id": 123,
"status": "queued",
"priority": 2,
"progress-percent": 0,
"submitted-utc-time": "2016-04-19T13:59:22"
}
계속해서 요청하면 다음과 같은 진행 상황이 표시됩니다.
HTTP 200
{
"id": 123,
"status": "done",
"progress-percent": 100,
"submitted-utc-time": "2016-04-19T13:59:22"
}
이러한 세 가지 유형의 요청간에 차이를 만드는 것이 중요합니다.
POST /video/convert
작업을 대기열에 넣습니다. 한 번만 호출해야합니다. 다시 호출하면 추가 작업이 대기됩니다.
GET /video/download/123
작업 결과 와 관련이 있습니다 . 리소스 는 비디오입니다. 요청 이전에 요청과 독립적으로 실제 결과 를 준비 하기 위해 처리 과정에서 발생했던 처리 는 여기와 관련이 없습니다. 한 번 또는 여러 번 호출 할 수 있습니다.
GET /video/status/123
처리 자체에 관한 것이다 . 아무것도 큐에 넣지 않습니다. 결과 비디오에 대해서는 신경 쓰지 않습니다. 리소스 처리 자체이다. 한 번 또는 여러 번 호출 할 수 있습니다.