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

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

    本系統是獵豹移動基於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產品,使得我們可以有更多的美好的東西

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.