2012-09-04 3 views
0

크롬 클라이언트의 백본 컬렉션에 대한 모델 변경을 스트리밍하는 웹 앱이 있습니다. 업데이트 유형과 검토 대상에 따라 페이지의 일부를 렌더링 할 수도 있고 렌더링하지 않을 수도있는 몇 가지 백본보기가 있습니다. 예를 들어, 모델에 대한 일부 변경 사항은 다시 렌더링되는 컬렉션에 대한 뷰가되고 업데이트되는 모델에 대한 상세 패널 뷰가 열릴 수도 있고 그렇지 않을 수도 있습니다. 이러한 모델 변경은 서버 측 워크 플로가 모델에 대해 매우 상세하고 신속한 변경을 필요로하므로 매우 빠르게 발생할 수 있습니다.스로틀 웹 소켓 연결에 대해 선호되는 방법은 무엇입니까?

다음과 같은 문제가 있습니다. WebSocket 연결이 아직 끝나고 readyState이 여전히 1 (OPEN)이지만 클라이언트에 메시지를 보낼 때 웹 서버 프로세스에서 많은 수의 errno 파이프 깨짐 메시지가 나타납니다.

나는 무슨 일이 일어나고 있는지 알기 위해 다음 메시지가 들어올 때까지 다양한보기가 onmessage 콜백에서 렌더링을 완료하지 못했다. stdout에서 이러한 추적을 얻은 후에도 websocket 연결은 계속 작동 할 수 있으며 UI는 여전히 업데이트됩니다.

eventlet.sleep(0.02)을 메시지 대기열에서 모델 변경 사항을 읽고 websocket에 보내는 루프에 넣으면 깨진 파이프 메시지가 사라지지만 실제 솔루션은 아니며 불쾌한 해킹처럼 느껴집니다.

websocket의 onmessage 기능이 너무 많은 작업을하고 다음 메시지가 수신 될 때 여전히 바쁘다는 비슷한 문제가있는 사람이 있습니까? 누구나 해결책이 있습니까?

답변

0

가장 효과적인 방법은 클라이언트 응용 프로그램이 서버에 무엇을 표시하고 있는지 알려주는 것입니다. 서버는 이것을 추적하여 현재 표시된 객체에만 변경 사항을 보내고 해당 클라이언트에만 변경 사항을 보냅니다.

이 작업을 수행하는 방법은 "Who Watch What"목록을 사용하는 것입니다. 항목은 두 가지 방법으로 인덱싱됩니다. 클라이언트 ID와 각 데이터 객체 내부의 isVievedBy 체인리스트 (데이터와 섞어 보이지는 않지만 매우 효율적 임)가 있습니다. 또한 각 데이터 객체에 대해 lastupdate 타임 스탬프가 필요합니다.

클라이언트가보기를 변경하면 서버에 "버전 - 타임 스탬프 -"메시지가 나타납니다. 서버는 타임 스탬프를 확인하고 필요한 경우 객체를 다시 보냅니다. 또한 쓸모없는 "Who Watch What"(클라이언트 ID로 액세스) 항목을 제거하고 새 항목을 만듭니다.

데이터 개체가 업데이트되면이 개체의 isVievedBy 체인 목록을 반복하여 어떤 클라이언트를 업데이트해야하는지 알 수 있습니다. 이것을 각 클라이언트에 대한 메시지 버퍼에 넣고 수동으로 버퍼를 플러시하십시오 (여러 항목을 동시에 업데이트하는 경우 하나의 큰 메시지가 전송됩니다).

이것은 많은 작업이지만, 많은 객체와 많은 클라이언트가 있어도 앱은 효율적이고 확장됩니다. 그것은 유용한 메시지 만 전송하며 너무 많은 메시지가있을 가능성은 거의 없습니다.

onMessage 문제에 대해서는 데이터를 대기열에 저장하고 비동기 적으로 처리합니다.