這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
本系統是獵豹移動基於go語言開發的一套訊息推送系統,源碼地址:https://github.com/Terry-Mao/goim
一、架構圖
二、功能簡介
1.comet
長串連伺服器,支援長輪訓、tcp、websocket串連,有逾時機制
2.logic
邏輯處理伺服器,訊息推送入口,通過userId在router伺服器中尋找對應的comet伺服器,將serverId和訊息一起儲存到kafka隊列,logic是無狀態服務器,可以隨意增刪,因為comet需要串連logic,所以在comet伺服器中需要串連logic的通過LVS的虛IP,LVS加了real server後不會斷開,所以需要在comet服務觸發SIGHUP,重新load設定檔。
3.router
路由伺服器,儲存userId和serverId的關係,serverId指的是comet伺服器位址,userId和roomId的關係,註冊使用者roomId為固定1,非註冊使用者roomId為-1,註冊和非註冊的區分是我猜的,獵豹IM的同學可以確認下。logic串連router需要一致性hash,所以不能隨意添加router伺服器。不選擇redis代替router作者解釋是因為有同一userId多次串連序號分配問題以及原子操作,我覺得通過key:userId來記錄自增,key:userId:seq來記錄每個串連,這樣也是可以的。
4.job
訊息轉寄伺服器,從kafka隊列中擷取訊息,發送給comet伺服器,無狀態服務器可以隨意增刪。
三、推送服務具有的特性
1.支援一個端的多個串連,比如同一使用者在不同的電腦上登入可以同時接收到訊息;
2.不支援用戶端的區分(pc/wap/ios/android)
3.目前沒有查詢某個使用者是否線上,某些業務上有顯示線上狀態的需求,這個可以在logic伺服器中添加一個介面;發送訊息時如果不線上可能會通過其他推送服務(如信鴿推送),這個可以通過修改push介面的傳回值來判斷
4.群發只能是線上才能收到,如果不線上就丟棄此訊息,當然使用者可以下次登入時再通過未讀訊息介面擷取
5.在長串連的時候comet->logic->router,而不是comet->router,這樣是為了可以在邏輯伺服器中擷取其他使用者狀態、未讀訊息等,這樣確實使得comet簡單了,且不會有一致性問題。
6.支援群發功能,所有使用者或按照roomId來群發,這個功能太爽了,效率不是提高一點半點鐘。
在此感謝獵豹的同學開源IM產品,使得我們可以有更多的美好的東西
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。