2012-10-16 4 views
1

방금 ​​느린 연결 탐지를 지원하는 트위터 스트리밍 끝점을 알게되었습니다.소켓 대기열 (참고로 트위터 스트리밍)

참조 : https://dev.twitter.com/docs/streaming-apis/parameters#stall_warnings (그리고 페이지 하단)

아이디어 하나가 소켓 전송 것 아마 프로세스 데이터입니다. 그리고 그것은 하나의 패킷이 클라이언트에 의해 언제 수신되는지를 알기 때문에 큐를 유지할 수 있고 항상 그것의 크기를 알 수 있습니다.

클라이언트가 각각에 대해 확인 패킷을 보내는 것이 쉽습니다. 그러나 트위터 스트리밍 API의 경우는 그렇지 않습니다. 단방향 전송입니다.

내 질문은 : 어떻게 달성 했습니까? 매우 낮은 수준의 원시 소켓 지원 없이는이 작업을 수행 할 수있는 방법을 찾을 수 없습니다. 그러나 여기에서는 무언가를 잊어 버릴 수도 있습니다. 낮은 수준의 지원을 통해 각 패킷에 대해 ACK를 얻을 수 있습니다. 그게 가능한가? ACK가 어떻게 든 추적 될 수 있습니까?

다른 아이디어는 어떻게 되었습니까? 이를 수행 할 수있는 방법은 무엇입니까? 파이썬에서? 또는 다른 언어 예제도 인정 될 것입니다.

어쩌면 나는 내 머리 위로 끝나고 단순히 얼마나 많은 바이트가 아직 socket.send를 통해 처리되지 않았는지 추적하는 데 사용됩니까? 하지만 고객의 연결 상태를 제대로 나타내지 못했습니까?

답변

2

나는 당신과 같은 생각을하기 시작했지만 구현은 우리가 기대하는 것보다 훨씬 쉽습니다.

트위터의 API 문서 상태 : -..

는 "A 클라이언트가 너무 느리게 모든 스트리밍 연결이 메시지 큐에 의해 백업 된 데이터를 클라이언트에 보냄을 읽고 큐가 시간이 지남에 너무 큰 성장 경우, 연결이 닫힙니다. " - https://dev.twitter.com/docs/streaming-apis/connecting#Disconnections

위의 내용을 토대로 트위터에는 대기열에 트윗을 올려 놓고 대기열에 메시지를 보내는 클라이언트 (긴 루프로 열어 둔 상태)에 긴 수명의 HTTP 연결이 있고, 각 루프 반복 동안 http 응답에 데이터를 씁니다.

이제 while 루프 내부에서 무슨 일이 일어나고 버퍼로 생각하면 트위터가 항목을 대기열 밖으로 비우고 일종의 출력 버퍼에 트윗 데이터를 쓰고 그 버퍼가 플러시 된 다음 채 웁니다 클라이언트로 전송할 TCP 버퍼를 늘리십시오.

는 클라이언트는 서버의 TCP의 전송 버퍼는 서버의 출력 버퍼 플러시 때 블록 데이터가 TCP 버퍼에 기록 할 수없는 것이기 때문에 의미 채울 것의 TCP 버퍼에서 천천히 데이터를 읽는 경우 따라서 while 루프는 (데이터가 플러시 될 때 차단되기 때문에) 큐에서 트윗을 자주 터지지 않아 트윗 큐가 가득 찼다는 것을 의미합니다.

이제 각 루프 반복의 시작 부분에서 짹짹 큐가 미리 정의 된 임계 값에 도달했는지 여부를 확인하기 만하면됩니다.

+0

그게 제가 끝내 준 것입니다. 좋은 답변 주셔서 감사합니다! – arkens

관련 문제