我們最近對我們的旗艦產品進行了私人測試,並進行了小型啓動活動。不幸的是,場地有一個可怕的無線連接和數據包被丟棄左右中心造成嚴重的系統,基本上它根本無法工作!幸運的是,我們能夠切換到不同的網絡並挽救演示。這突出顯示了一些我知道已經是問題的事情,但並沒有意識到它可能存在多少問題。我們的系統在很大程度上依賴於BOSH,並且具有相當大的JavaScript代碼庫,現在在良好的網絡條件下工作得相當好。但是,我們需要在惡劣的網絡條件下也能很好地工作。使用BOSH處理JavaScript中丟失的消息
由於該XMPP工作,消防和忘記系統的方式,這是不容易的告訴你,如果發送,或者本應該收到一條消息,竟是發送或接收。例如,我們有一個報價系統,一個用戶會通過BOSH向另一個發送報價。當服務器接收到該消息時,消息被髮布給提供用戶offer_pre PEP節點並向接收用戶offer_received PEP節點發送類似消息。雖然發送用戶能夠判斷他們的報價是否相對容易地發送,但如果從未接收到接收用戶的通知,則該用戶永遠不會知道它錯過了一條消息。
約了JavaScript的設置有一點,它有4個主要層次:
- StropheJS 用於處理低級別的任務,並建立在
- 其中包含一個應用層的頂部
- 一個MVC框架應用邏輯路由,控制器模型等以及模型數據的瀏覽器緩存
- 接收事件並嚮應用層發佈事件並嚮應用層發佈事件的UI層
一種方法是定期檢查,瀏覽器不知道新的數據PEP節點。如果發現新消息,瀏覽器緩存將失效,並且將從服務器請求所有新數據。我不確定這是最好的方式,它也不包括所有情況。我們當然不想進入發送消息的情況,以確認之前收到的消息在目的地,因爲這會使網絡流量增加一倍。
每天這個不斷增長的實時網站的數量是一定是被其他開發商所遇到的問題,就看它是如何被他人所解決的是有趣的。至於我可以看到有兩種情況下,消息就消失了:由於被丟棄
- 在連接不良消息無法發送或接收的消息被接收瀏覽器,但在頁面卸載之前未完全處理並存儲在本地緩存中。或消息添加到發送隊列,但該頁面被卸載
從未發送我懷疑最難的問題來解決將是數字2。關於這個問題的任何想法,將不勝感激。
我們已經實施了一項臨時解決方案,使我們的系統使用起來更加穩定。我們在每次加載頁面時請求來自PEP和PubSub節點的所有數據。雖然這不是理想的,但它增加了流量,它確實有效。 未來我們將實施BOSH ACKing(請參閱http://xmpp.org/extensions/xep-0124.html#acks),這將使我們能夠確保消息傳遞。由於這需要在客戶端和服務器端進行一系列工作,因此我們將在稍後的日期實施此操作,以便我們需要此優化。 – JamieD 2010-06-09 10:19:09