手機(jī)郵件實(shí)時推送:推動(Push)模式和拉動(Pull)模式
push:保持長連接(采用異步socket建立tcp連接),能實(shí)時無延遲的收到服務(wù)推送過來的消息。服務(wù)器的域名不會改變,客戶端能夠找到服務(wù)器,而手機(jī)客戶端是用的是移動運(yùn)營商的網(wǎng)絡(luò),若30分鐘(不同省份的運(yùn)營商設(shè)置的可能不同,大部分運(yùn)營商設(shè)置的是30分鐘)用戶不使用網(wǎng)絡(luò),運(yùn)營商可能把這個IP分配給其它的用戶,所以服務(wù)器一般不能實(shí)時的找到手機(jī)客戶端。所要要實(shí)現(xiàn)push,那么就要再服務(wù)器和手機(jī)客戶端建立長連接。由于手機(jī)客戶端需要連接服務(wù)器的連接很多,通常服務(wù)器要支持集群,畢竟一臺服務(wù)器要實(shí)現(xiàn)少沖突的分配長連接端口號,那么就最好不超過20000個連接。Push的好處是實(shí)時,維護(hù)通道的流量超少,只需要每30分鐘維護(hù)一次通道(為保持安全穩(wěn)定最好每14分鐘維護(hù)一次通道,就是發(fā)送一次請求,應(yīng)用前后臺切換時有繼續(xù)讓線程僵死,所以應(yīng)用前后切換時要維護(hù)一次通道)就可以。個推的透傳和蘋果APNS本質(zhì)就時push長連接,所以他們很省點(diǎn),也較快。只所以它們沒有做到想象的那么實(shí)時是因?yàn)樘O果運(yùn)營的手機(jī)是海量的,APNS連接也是海量的,消息的調(diào)度是很費(fèi)時間的。個推的連接比蘋果少,但是再少也是海量級別的。所以個推付費(fèi)能提高響應(yīng)速度,但不能從根本上解決問題。想解決響應(yīng)慢的問題只有你自己實(shí)現(xiàn)push長連接才更安全可能,畢竟是消息隊(duì)列調(diào)度問題還是連接問題你都實(shí)時的知道,可以用http請求的方案替代暫時連接異常。大部分郵箱和郵箱客戶端都不真正的支持push。微軟的exchange服務(wù)器的imap idle從實(shí)現(xiàn)機(jī)制上它是push。
個推的付費(fèi)用戶也不是單獨(dú)給你搭建一個服務(wù)器,而是調(diào)整給你有消息隊(duì)列插隊(duì)的的特權(quán)。如:你是付費(fèi)用戶,個推服務(wù)器有1億條消息在排隊(duì),又一次性來1000萬條消息,其中有5000條消息是付費(fèi)用戶的,那么這5000條消息肯定排列在1億條消息緊挨著的后面,至于這5000條消息的那么就靠誰先來誰就在前面了。若一條消息處理時間是x毫秒,那么你的等待時間最快就是1億*x毫秒。所以你可以看到你的個推消息響應(yīng)時間不但于你的應(yīng)用使用量,也取決于這個時間段消息擁堵狀況,其它人使用個推發(fā)送消息的瞬時情況,個推的透傳可能發(fā)送很快(長連接大部分情況正常,無需建立通道的時間)但是它們大部分時間被耽誤在消息排隊(duì)上了。蘋果的APNS服務(wù)器也是一樣,只是沒有插隊(duì)的后門而已。自己在服務(wù)器上實(shí)現(xiàn)蘋果的APNS的通信功能,不但在要求這方面的技術(shù),最關(guān)鍵的是它不支持類似的安卓手機(jī)遠(yuǎn)程。而是個推集成了iOS和android這兩方面的遠(yuǎn)程推送,所以你若想用不依賴于手機(jī)是否開啟都推送消息,最簡單的方法是使用個推。個推的APNS遠(yuǎn)程遠(yuǎn)沒有個推的透傳來的快,畢竟少了,在個推推送到蘋果APNS服務(wù),在哪里排隊(duì)的時間,蘋果的連接可是海量的。個推的付費(fèi)用戶對你的及時性有所提高,但是也沒有你想象的那么及時,必定要在個推那里進(jìn)行大量消息排隊(duì)。自己實(shí)現(xiàn)push長連接,只排隊(duì)等待自己應(yīng)用的消息和其它應(yīng)用的消息無關(guān),所以響應(yīng)最快最準(zhǔn)確,不用擔(dān)心消息丟失率的問題。
Pull:就是定時獲取。優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,技術(shù)難點(diǎn)和異常很少。缺點(diǎn)不夠?qū)崟r,若獲取的時間間隔太短,設(shè)備的耗電量超快。還有一種實(shí)現(xiàn)方案是結(jié)合push和pull兩者的優(yōu)缺點(diǎn),具有實(shí)時收到消息,實(shí)現(xiàn)簡單,耗電量界于兩者間。具體的是建立長連接,卻是10秒維護(hù)一次通道(服務(wù)器或客戶端不夠強(qiáng)大,沒有實(shí)現(xiàn)監(jiān)控兩者間異常的機(jī)制,才頻繁的發(fā)送心跳消息來代替這種異常監(jiān)控機(jī)制)。這種方案的優(yōu)點(diǎn)是基本做到了push的省去了發(fā)送請求才建立tcp通道的時間,達(dá)到了實(shí)時發(fā)送。它可以是異步socket也可以是同步socket。同步socket的優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,異常較少;缺點(diǎn)是阻塞連接線程,異步socket的優(yōu)點(diǎn)是實(shí)時發(fā)現(xiàn)異常,不阻塞連接線程;缺點(diǎn)是實(shí)現(xiàn)相對復(fù)雜,異常較多。綜上所述push的實(shí)現(xiàn)方案最優(yōu),pull的實(shí)現(xiàn)方案最簡單,兩者結(jié)合的方案是兩者的折中,具體實(shí)現(xiàn)那種實(shí)現(xiàn)方案,根據(jù)自己技術(shù)團(tuán)隊(duì)的技術(shù)水平和項(xiàng)目緊急水平。金笛郵件系統(tǒng)支持推送方式,用最小的心跳包減少手機(jī)的電力消耗,同時又保證的消息的及時性。