511
汽車大全
長輪詢__最佳實踐_消息服務-阿裏雲
背景知識
MNS提供了LongPolling類型的ReceiveMessage的方法,隻需要在ReceiveMessage的時候把WaitSecond設為一個1-30之間的數就可以了。使用LongPolling可以讓Request一直掛在Server上,等到有Message的時候才返回,在保證了第一時間收到消息的同時也避免用戶發送大量無效Request。LongPolling也是MNS的推薦用法。
LongPolling是需要掛HTTP層的長連接在Server上,而對於Server來說,HTTP層的長連接的資源是比較有限的。為了避免受到一些惡意攻擊,所以MNS對單用戶的LongPolling連接數是有限製的。
問題描述
有一些用戶在單台機器上開了上百個線程同時訪問MNS Server獲取消息,遇到隊列中沒有消息的時候,單台機器上就掛了上百個LongPolling的Request。如果用戶還同時使用了比較多的機器,那麼這些用戶就可能會需要同時發上千個LongPolling的請求。
這種情況下,用戶在發LongPolling的Request的時候,就會比較容易遇到: MNS的Server直接返回“消息不存在”,而不是Request一直掛在Server端等待消息。
這會導致用戶不能得到預期的LongPolling的效果。有一些用戶是在一個While循環裏麵做不停的LongPolling請求而沒有做一些異常處理,然後一夜醒來發現發出了極大量的請求。
解決方案
在開了上百個線程同時訪問的情況下,如果隊列裏已經沒有消息了,那麼其實不需要上百個線程都同時掛LongPolling。隻需要有1-N個線程掛LongPolling就足夠了。掛LongPolling的線程在發現隊列裏有消息時,可以喚醒其他線程一起來取消息以達到快速響應的目的。
長輪詢示例代碼是一個使用MessageReceiver獲取消息的BestPractice。所有取消息的線程,都是new了一個MessageReceiver,然後使用receiver.receiveMessage來獲取消息。
Receiver內部做了LongPolling的排他機製,隻要有一個線程在做LongPolling,那麼其他線程隻需要Wait就可以了。
最後更新:2016-11-23 17:16:08
上一篇:
消息處理時長自適應__最佳實踐_消息服務-阿裏雲
下一篇:
消息加密傳輸__最佳實踐_消息服務-阿裏雲
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲