2011-12-23 3 views
0

서버의 항목 대기열을 고려하십시오. 그런 다음 클라이언트는 REST 웹 서비스를 사용하여 대기중인 10 개의 항목을 한 번에 읽습니다. 당연히 클라이언트가 이러한 항목을 소비하면 서버는 서버 측에서 제거해야합니다.RESTful 웹 서비스의 결과를 소비 한 후 ACK를 보냅니 까?

Q : 견고성, 네트워크 부하 및 안정성을 모두 고려할 때 가장 좋은 방법은 무엇입니까?

나는 세 가지 솔루션을 생각할 수 있습니다 :

클라이언트는 새 항목을 요청합니다. 그러면 서버가 ...

  1. 은 항목 1..10 (GET)을 보내고 즉시 제거합니다. 바라건대 아이템이 클라이언트에 도착했기를 바랍니다.
  2. 은 항목 1..10 (GET)을 보내고 클라이언트는 1.10 (DELETE)의 ACK를 보내고 서버는 항목을 제거합니다.
  3. 은 항목 1..10 (GET)을 보냅니다. 다음에 클라이언트가 11..20 (GET)을 요청하면 이전 항목이 서버에서 제거됩니다.

나는 # 1과 # 3 모두가 편안한 원리를 위반한다고 생각합니다. 예 : DELETE 메서드 만 개체를 ​​삭제할 수 있습니다. 그러나 둘 다 ACK 명령에 대한 데이터 트래픽을 피합니다.

가장 좋은 점은 확실하지 않습니다. 아마도 더 나은 해결책이있을 것입니다.

+0

클라이언트와 서버 사이에 제안 된 요청/응답을보다 자세히 설명하는 것이 유용 할 수 있습니다. 예를 들어, 클라이언트가 "새로운 아이템을 요청할 것"이라고 가정한다면 ** GET을 발행하고 서버는 응답 할 것이고 ('200 Ok' ???), 혼란이 없을 것입니다. 여부 "항목이 클라이언트에 도착". 질문이 제기되는 방식으로 REST 스타일의 상호 작용을 설명하는 것처럼 들리지는 않습니다. 그래서 아마도 나는 뭔가를 놓치고 있습니다. – toddsundsted

+0

물론입니다. 그러나 서버가 200OK로 응답하면 해당 정보는 클라이언트에게도 전송되어야합니다. 맞습니까? 서버가 데이터를 출력한다고해서 클라이언트가받은 것을 의미하지는 않습니까? – l33t

+1

아니, 네 말이 맞아. 그래서'GET'은 멱등수 (idempotent) 여야합니다. 이것은 1과 3에서 문제가되는 것입니다. 내가 보았던 일반적인 접근법은 'GET'이 'DELETE'를 따르는 것입니다. 성공한. 그러나 그것은 두 번의 왕복입니다.따라서 고객에게 보장 된 배달으로 검색 및 삭제가 가능한 것을 찾고 있습니까? – toddsundsted

답변

0

여기에 답변이 있습니다. 귀하의 옵션을 좀더 명확하게하는 데 도움이되기를 바랍니다.

REST 스타일 아키텍처에서 API not change the implementation of any underlying protocols의 구현이 중요합니다.이 경우 GET 요청이 멱등수가되어야 함을 의미합니다. 멱등 원은 기본 리소스가 변경되거나 영원히 사라지는 것을 의미하지는 않지만 (GET의 직접 또는 간접적 인 결과로 발생하는 것은 프로토콜의 정신에 위배되는 것으로 보입니다).

메시지 배달을 보장하는 시스템은 의도 된 수신자가 메시지를 성공적으로 수신했는지 확인하기 위해 일종의 핸드 셰이크가 필요합니다. HTTP가 문제의 프로토콜이면 두 요청을 의미합니다. GET의 동작이 지연되어 자원을 삭제하도록 수정 된 경우에도 핸드 셰이크가 계속 존재합니다. 다시 말하지만 HTTP가 질문의 프로토콜 인 경우 기존 핸드셋을 검색하고 삭제하기 위해 GET 및 그 다음 DELETE이라는 기존 방법을 사용하는 것이 가장 좋습니다. 그 결과는 어떠한 동등한 접근보다 네트워크에 과세하지 않아야합니다.

관련 문제