本篇文章947字,讀完約2分鐘
阿里云國際站經(jīng)銷商,主營阿里云,騰訊云,華為云,亞馬遜aws,谷歌云gcp,微軟云az,免費(fèi)開戶,代充值優(yōu)惠大,聯(lián)系客服飛機(jī)@jkkddd
背景信息
消息服務(wù)MNS提供了LongPolling類型的接收消息的方法,在接收消息的時候把等待時間設(shè)置在1s~30s。使用LongPolling可以讓請求一直在服務(wù)器上運(yùn)行,等到有消息的時候才返回。既可以保證第一時間收到消息,又避免您發(fā)送大量無效請求。LongPolling是消息服務(wù)MNS的推薦用法。
LongPolling參數(shù)設(shè)置,請參見ReceiveMessage。
LongPolling需要HTTP層的長連接保持在服務(wù)器上,而對于服務(wù)器來說,HTTP層的長連接的資源是有限的。為了避免受到惡意攻擊,消息服務(wù)MNS對單用戶的每個Queue的連接數(shù)是有限制的。具體信息,請參見使用限制。
問題描述
您在單臺機(jī)器上開啟上百個線程,即發(fā)送上百個LongPolling的請求,同時訪問消息服務(wù)MNS服務(wù)器獲取消息。如果您使用了多臺機(jī)器,那么可能同時發(fā)送上千個LongPolling的請求。
此時隊(duì)列中沒有消息,如果您再次發(fā)起LongPolling,消息服務(wù)MNS服務(wù)器就會返回:消息不存在。
因此,如果您是在一個While循環(huán)里不停的做LongPolling請求,而沒有做異常處理,會導(dǎo)致您發(fā)送了大量的請求,不能達(dá)到使用LongPolling的預(yù)期效果。
解決方案
當(dāng)您打開上百個線程同時訪問消息服務(wù)MNS服務(wù)器時,如果隊(duì)列里已經(jīng)沒有消息,就不需要上百個線程同時運(yùn)行LongPolling。此時只需要打開1~N個線程運(yùn)行LongPolling。當(dāng)運(yùn)行LongPolling的線程發(fā)現(xiàn)隊(duì)列里有消息時,喚醒其他線程一起接收消息,達(dá)到快速響應(yīng)的目的。
長輪詢示例代碼是一個使用MessageReceiver獲取消息的最佳實(shí)踐。所有獲取消息的線程都新建了MessageReceiver,使用receiver.receiveMessage來獲取消息。
MessageReceiver內(nèi)部做了LongPolling的排他機(jī)制,只要有一個線程在做LongPolling,其它線程就需要等待。
標(biāo)題:阿里云賬號注冊,阿里云代理商代購
地址:http://www.pengfei-china.com/kfxw/64307.html