변경 사항에 대한 휴식 자원을 모니터링하는 편안한 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/405950

  •  03-07-2019
  •  | 
  •  

문제

다른 클라이언트의 변경 또는 수정을 모니터링하고자하는 REST 리소스가있는 경우, 그렇게하는 가장 좋은 방법은 무엇입니까?

내가 그렇게했던 아이디어 중 하나는 리소스가 아직 존재하지 않는 경우 즉시 반환하기보다는 연결을 열어 두는 특정 리소스를 제공하는 것입니다. 예를 들어, 리소스가 주어지면 :

/game/17/playerToMove

이 자원의 "얻기"는 내 상대방이 움직일 차례라고 말할 수 있습니다. 이 자원을 지속적으로 폴링하여 이동할 차례가 언제인지 알아내는 대신 이동 번호 (예 : 5)에 주목하고 다음 이동을 검색하려고 시도 할 수 있습니다.

/game/17/move/5

"정상"REST 모델 에서이 URL에 대한 GET 요청은 404 (찾을 수 없음) 오류를 반환하는 것 같습니다. 그러나 대신, 서버는 상대방이 자신의 움직임을 연주 할 때까지 연결을 열어 두었습니다.

PUT /game/17/move/5

그런 다음 서버는 상대방이 해당 리소스에 넣은 내용을 반환 할 수 있습니다. 이것은 모두 내가 필요한 데이터를 제공 할뿐만 아니라 상대방이 폴링을하지 않고 움직일 때에 대한 일종의 알림을 제공 할 것입니다.

이런 종류의 계획이 편안합니까? 아니면 일종의 휴식 원칙을 위반합니까?

도움이 되었습니까?

해결책

제안 된 솔루션은 다음과 같습니다 긴 여론 조사, 정말 잘 작동 할 수 있습니다.

당신은 요청할 것입니다 /game/17/move/5 Move 5가 완료 될 때까지 서버는 데이터를 보내지 않습니다. 연결이 떨어지거나 타임 아웃이 발생하면 유효한 응답을받을 때까지 다시 연결됩니다.

이것의 이점은 매우 빠르다는 것입니다. 서버에 새로운 데이터가 있으면 클라이언트가 얻을 수 있습니다. 또한 연결을 삭제하는 것도 탄력적이며 클라이언트가 한동안 분리 된 경우 작동합니다 (요청할 수 있습니다. /game/17/move/5 이동 한 지 1 시간 후에 데이터를 즉시 가져온 다음 move/6/ 등등)

긴 폴링의 문제는 각 "폴링"이 서버 스레드를 연결하는 것입니다.이 스레드는 Apache와 같은 서버를 빠르게 분해합니다 (작업자 스레드가 부족하므로 다른 요청을 수락 할 수 없습니다). 장난 꾸러기 요청을 제공하려면 전문 웹 서버가 필요합니다. Python 모듈 twisted ( "이벤트 중심 네트워킹 엔진")는 이에 적합하지만 정기적 인 폴링보다 더 많은 작업입니다.

Jetty/Tomcat에 대한 귀하의 의견에 대한 답변으로 Java에 대한 경험이 없지만 둘 다 Apache에 비슷한 작업자 스레드 시스템을 사용하는 것 같습니다. 나는 찾았다 이 게시물 이 문제를 정확히 다루는 것 같습니다 (Tomcat의 경우)

다른 팁

나는 찾았다 이 기사 새로운 HTTP 헤더 인 "modified-affer"를 제안하는 것은 본질적으로 동일한 작업을 수행합니다. 서버는 기다려 자원이 수정 될 때까지 연결을 열어줍니다.

타임 스탬프 기반 접근 방식보다는 버전 기반 접근 방식을 선호합니다. 레이스 조건이 덜 쉬우 며 검색중인 내용에 대한 정보를 조금 더 제공하기 때문입니다. 이 접근법에 대한 생각이 있습니까?

의도 한 클라이언트가 웹 브라우저 인 경우 404를 제안합니다. 연결을 열어두면 클라이언트의 브라우저 요청을 동일한 도메인으로 적극적으로 차단할 수 있습니다. 고객에게 달려있는 것은 얼마나 자주 설문 조사 해야하는지에 달려 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top