隨着如今線上社交場景和社交方式愈來愈多,在社交中溝通是一個必要的環節,愈來愈多的app應用將IM功能做爲必備核心功能之一,因此IM系統的設計也變得愈來愈重要,這裏給你們介紹IM系統一種推拉結合方式的實現。
IM系統具備的基礎功能有發送消息、查看消息、新消息推送、未讀消息數,對於消息羣主、消息已讀、消息撤回、從新編輯、消息刪除、對方正在輸入中這些功能都是IM系統的業務功能,這裏將會分開討論。android
展現層
多端展現功能,咱們但願實現最好的狀況是支持web端、android端、ios端的展現,因爲咱們但願在不一樣的客戶端都可以接入咱們的IM系統,因此咱們在鏈接層會支持不一樣的協議。
鏈接層
咱們支持web端,在鏈接層須要接入websocket,由於websocket推送的支持咱們才能更好地通知web端的用戶。
咱們支持android端,在鏈接層須要接入各個主流安卓廠商的推送,由於廠商的推送相對於其餘第三方推送廠商更可以保障咱們更高的推送到達率。
咱們支持ios端,在鏈接層須要接入蘋果apns推送,由於蘋果支持官方的apns推送。
咱們對於android端和ios端,除鏈接入廠商的推送,咱們要保障有更高的推送到達率,咱們還接入長鏈接推送(自開發)。
業務層
業務層主要功能是將私信複雜的業務進行聚合,與第三方服務和私信業務功能服務、私信基礎功能服務進行交互。
存儲接口層
存儲接口層是對存儲層基礎功能作的一層封裝,不涉及太多業務邏輯。ios
咱們這是一種推拉結合的方式實現的該系統,因此咱們這裏查看消息功能(新消息訂閱、歷史消息查看)實現是經過拉取的方式實現,不是經過直接推送的方式實現,咱們這裏以用戶A與用戶B的聊天場景進行簡單介紹。web
消息會話列表
用戶A對用戶B發起聊天產生的會話咱們在這裏會記錄爲一次會話記錄,用戶A對多個用戶造成的多個消息會話記錄造成的列表咱們這裏叫作會話列表。
首屏消息列表
當用戶B不在線,因爲咱們這裏使用的是推拉結合的方式,咱們存在用戶A對用戶B發送消息以後,這樣怎樣讓用戶B下次打開app的時候看到用戶A給本身發送的聊天消息呢?這樣就須要在用戶B打開這個會話時第一時間看到用戶A給本身發送的消息,看到一整屏的新消息,這裏獲取到的消息叫作首屏消息列表。
新消息列表
當用戶B在線時,咱們收到了用戶A發過來的新消息推送,這個時候用戶B就會主動獲取用戶A發給本身的新消息,這裏獲取到的消息叫作新消息列表。
歷史消息列表websocket