2010-04-25 24 views
2

我們最近對我們的旗艦產品進行了私人測試,並進行了小型啓動活動。不幸的是,場地有一個可怕的無線連接和數據包被丟棄左右中心造成嚴重的系統,基本上它根本無法工作!幸運的是,我們能夠切換到不同的網絡並挽救演示。這突出顯示了一些我知道已經是問題的事情,但並沒有意識到它可能存在多少問題。我們的系統在很大程度上依賴於BOSH,並且具有相當大的JavaScript代碼庫,現在在良好的網絡條件下工作得相當好。但是,我們需要在惡劣的網絡條件下也能很好地工作。使用BOSH處理JavaScript中丟失的消息

由於該XMPP工作,消防和忘記系統的方式,這是不容易的告訴你,如果發送,或者本應該收到一條消息,竟是發送或接收。例如,我們有一個報價系統,一個用戶會通過BOSH向另一個發送報價。當服務器接收到該消息時,消息被髮布給提供用戶offer_pre PEP節點並向接收用戶offer_received PEP節點發送類似消息。雖然發送用戶能夠判斷他們的報價是否相對容易地發送,但如果從未接收到接收用戶的通知,則該用戶永遠不會知道它錯過了一條消息。

約了JavaScript的設置有一點,它有4個主要層次:

  1. StropheJS
  2. 用於處理低級別的任務,並建立在
  3. 其中包含一個應用層的頂部
  4. 一個MVC框架應用邏輯路由,控制器模型等以及模型數據的瀏覽器緩存
  5. 接收事件並嚮應用層發佈事件並嚮應用層發佈事件的UI層
解決了丟失的郵件問題

一種方法是定期檢查,瀏覽器不知道新的數據PEP節點。如果發現新消息,瀏覽器緩存將失效,並且將從服務器請求所有新數據。我不確定這是最好的方式,它也不包括所有情況。我們當然不想進入發送消息的情況,以確認之前收到的消息在目的地,因爲這會使網絡流量增加一倍。

每天這個不斷增長的實時網站的數量是一定是被其他開發商所遇到的問題,就看它是如何被他人所解決的是有趣的。至於我可以看到有兩種情況下,消息就消失了:由於被丟棄

  • 涉及網頁間導航包

    1. 在連接不良消息無法發送或接收的消息被接收瀏覽器,但在頁面卸載之前未完全處理並存儲在本地緩存中。或消息添加到發送隊列,但該頁面被卸載

    從未發送我懷疑最難的問題來解決將是數字2。關於這個問題的任何想法,將不勝感激。

  • 回答

    1

    有這個沒有什麼好辦法,但有可行的解決方案。

    BOSH會話一直保持有效給定的時間(60秒,默認情況下,在大多數實現)。會話過期後,假c2s連接關閉,用戶必須重新登錄。

    雖然會話有效,但沒有消息應該丟失或無序到達。唯一的潛在損失是在允許HTTP重新打開連接的60秒窗口期間,並且如前所述,如果該窗口關閉,則必須創建新會話。如果在該窗口內創建了新的HTTP請求,則不會有任何內容丟失或無序到達。

    因爲您使用PEP作爲您的商店,所以無論何時創建會話時,客戶端都會掛鉤,您將從PEP節點獲取項目以初始化客戶端緩存(請參閱section 6.5 of XEP-0060)。

    如果您的BOSH客戶端成功接收到消息,但網頁已關閉或重新加載,然後才能成功處理,則消息仍可能丟失。但是,對於其他情況,您不應該再看到任何數據丟失,由於項目檢索的原因,在啓動期間只會有額外的滯後。

    +1

    我們已經實施了一項臨時解決方案,使我們的系統使用起來更加穩定。我們在每次加載頁面時請求來自PEP和PubSub節點的所有數據。雖然這不是理想的,但它增加了流量,它確實有效。 未來我們將實施BOSH ACKing(請參閱http://xmpp.org/extensions/xep-0124.html#acks),這將使我們能夠確保消息傳遞。由於這需要在客戶端和服務器端進行一系列工作,因此我們將在稍後的日期實施此操作,以便我們需要此優化。 – JamieD 2010-06-09 10:19:09

    1

    您應該使用請求&響應確認來解決此問題:http://xmpp.org/extensions/xep-0124.html#acks strophe.js作者已經提到,他將在未來某個時間爲此添加支持。

    +0

    您提供的鏈接轉到XEP的錯誤部分(lol),這裏是正確的url:http://xmpp.org/extensions/xep-0124.html#ack – fpsColton 2014-06-10 16:53:11