基於go語言的消息推送系統架構分析

 本系統是獵豹移動基於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

路由服務器,保存userIdserverId的關係,serverId指的是comet服務器地址,userIdroomId的關係,註冊用戶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產品,使得我們可以有更多的美好的東西


其他類似的軟件有:

moonmq:http://blog.csdn.net/siddontang/article/details/22889495

RocketMQ :http://blog.csdn.net/a19881029/article/details/34446629

Beanstalkd:http://blog.csdn.net/xcl168/article/details/47705725

FishChat:https://github.com/oikomi/FishChatServer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章