矽谷之路59:如何設計WhatsApp (二)
繼續設計WhatsAPP。
如果用戶當前不在線,發給他的消息怎麼辦呢?如果用戶換了一台設備,還可以查閱歷史記錄嗎?能不能搜索歷史記錄呢?
這些問題有沒有感覺似曾相識?之前有一期視頻講了Twitter架構的push和pull模型,Twitter架構實際上就實現了離線消息的發送和消息的檢索,所以我們可以把Twitter架構跟WhatsAPP架構相結合,就解決了離線消息發送和搜索歷史記錄的需求。
Twitter架構設計中講了非常通用的push/pull模型。push模型就是當用戶寫了新的tweet就發送給所有的follower;而pull模型就是用戶只寫在自己的timeline里,當follower查看消息的時候才從timeline里獲取數據。
這個push/pull模型是數據層面的,如果我們想實現新消息提醒這樣的功能,我們可以使用link層面的push/pull模型。link-pull是用戶和伺服器之間不建立長連接,而採用輪巡的策略,每隔幾秒check一下有沒有新消息;或者採用link-push模型,維護伺服器和用戶之間的長連接,這樣有新消息伺服器就可以直接push給用戶了。
那麼push和pull各有什麼優缺點呢?push比較快更及時,但是如果用戶並不需要經常check的話維護這麼多長連接是很浪費的。pull會有一些delay,而且如果用戶並沒有新消息,不斷輪巡其實也很浪費,還會耗費帶寬。
所以一種方式是將push/pull模型進行組合,可以push給用戶新消息的數目,當用戶想要查看的時候pull獲取所有消息。
還有一個問題是如何通知用戶上線/下線的消息呢?如果用戶上線/下線就立刻發送消息的話,網路狀況不穩定的時候可能會出現用戶不斷上線/下線的情況。
所以沒有必要通知地那麼及時,可以適當地lazy一點,等待5s再通知就避免了上述情況。
本文整理作者:Mengying Tian,查看完整視頻:http://www.bittiger.io/classes
更多內容,請訪問:BitTiger.io, 掃描下面二維碼,關注微信公眾賬號「論碼農的自我修養」
推薦閱讀:
※手機自帶的簡訊功能並不弱,人們為什麼還會使用 WhatsApp?
※Android 沒有沙盒保護機制嗎,WhatsApp 信息為何可被隨意訪問?