伺服器端應如何設計才能實現「秒推」?
02-23
大家已經討論很多關於如何實現推送的方案,比如長連接、Apple Push Notification Service、XMPP、Microsoft Push Notification Service、Exchange ActiveSync 等等,但主要集中於客戶端與伺服器端之間這一段。我的提問僅指伺服器端的設計思路。
具體舉例比如,微博A網友給B網友發私信,假設B網友的客戶端已經和伺服器端建立了長連接在等待消息,但同一時刻掛在微博伺服器上等待的長連接數量應該是非常多的,伺服器端如何設計才能迅速找到B網友那個長連接,以快速的給那個長連接回復消息?2014/11/10補充:發現目前四個答案中三個有「軟廣告」嫌疑,所以強調一下討論的是實現原理。
很簡單,找好的推送服務商,測試下延遲,畢竟人家都是專業做推送的。我們測試下來的結果是個推最快,百度第二,極光慢一些。
可以參考手機網路,分層。
分很多個小的接入伺服器,根據客戶ID分配。收到消息後根據用戶ID查找記錄定位到接入伺服器,然後再找到用戶連接
謝邀!
嘗試聊下思路。
核心需要解決的問題是:
1. B 在不在線;2. B 在哪個接入伺服器上 online;
或者說,是路由問題。有 2 個基本思路:
1)分而治之,按 uid 分段。比如電信系統手機號是這樣。這種負載不太是問題;但靈活性不夠好。
2)集中路由表。
簡單高效,靈活性好。但這個模塊要做得性能足夠好,當然也還是要考慮分布問題。10 億也可以承擔。JPush 目前是這個思路做的。
利益相關:極光推送團隊成員。組了個團隊去做一個項目,結果發現推送方面團隊實力不是很足,做不到秒推,到達率和到達時間上都不是很理想。於是當時想到了國內幾個相對做得比較好的推送方,當時測試了小米推送、極光、個推和百度,測試下來還是個推相對穩定些,到達率和推送速度確實是要快上一些,也沒有分發量的限制
https://github.com/m0ver/tinystruct2.0/blob/master/src/tinystruct/examples/smalltalk.java
推薦閱讀:
※iPhone 的推送為什麼可以在網路沒有連接的情況下使用?
※我發郵件給 Kindle的郵箱,為什麼沒有推送到我的 Kindle 上去?
※mqtt各種broker如何選擇?
※知乎的 comet 實現機制是怎樣的?
TAG:推送Push |