閱讀511 返回首頁    go 汽車大全


長輪詢__最佳實踐_消息服務-阿裏雲

背景知識

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

  上一篇:go 消息處理時長自適應__最佳實踐_消息服務-阿裏雲
  下一篇:go 消息加密傳輸__最佳實踐_消息服務-阿裏雲