2012-10-16 11 views
1

我剛剛發現Twitter流式端點支持某種方式檢測到慢速連接。套接字隊列(Twitter流作爲參考)

參考:https://dev.twitter.com/docs/streaming-apis/parameters#stall_warnings(和頁面底部)

想法是通過一個套接字發送大概會處理數據之一。它知道客戶端何時接收到一個數據包,因此它可以維護隊列並始終知道它的大小。

客戶端爲每個客戶端發送一些確認數據包很簡單。但Twitter流媒體API並非如此 - 這是一種單向傳輸。

我的問題是:他們是如何實現這一目標的?沒有一些非常低級別的原始套接字支持,我看不到一種方法 - 但我可能在這裏忘記了一些東西。有了一些低級別的支持,我們可能會爲每個數據包獲得ACK。這甚至有可能嗎?可以以某種方式跟蹤ACK?

任何其他想法如何做到這一點? 任何方式來做到這一點,例如在Python中?或者任何其他語言的例子,將不勝感激。

或者,也許我在這裏頭,它只是用來跟蹤有多少字節還沒有通過socket.send處理?但是,這不是一個客戶端連接的糟糕跡象嗎?

回答

2

我開始按照你的思路思考,但我認爲實現實際上比我們所期望的要容易得多。

Twitter的API文檔狀態: - 。

「客戶端讀取數據的速度太慢每個流的連接是通過消息隊列支持被髮送到客戶端。如果此隊列隨着時間的推移變得太大時,連接將被關閉。「 - https://dev.twitter.com/docs/streaming-apis/connecting#Disconnections

基於以上我想象Twitter將有被推的tweets到隊列和長期HTTP連接到客戶端(保持打開while循環)線程彈出一個消息從隊列和在每次循環迭代期間將數據寫入http響應。

現在,如果您想象在while循環內發生了什麼,並且您認爲就緩衝區而言,Twitter會從隊列中彈出一個項目,然後將tweet數據寫入某種輸出緩衝區,該緩衝區將被刷新,然後填充建立TCP緩衝區以傳輸到客戶端。

如果客戶機從它的TCP緩衝區慢慢讀取數據,然後將服務器的 TCP發送緩衝區將填補這意味着當服務器的輸出緩衝區刷新,將因爲數據不能被寫入TCP緩衝區這意味着while循環不會像往常一樣從隊列中推出推文(因爲當數據被刷新時它被阻塞)導致推文隊列填滿。

現在,您只需在每次循環迭代開始時檢查一下,以檢查Tweet隊列是否達到了某個預定義閾值。

+0

這就是我最後的結局。感謝您的好評! – arkens