泰安做網(wǎng)站哪家好企業(yè)網(wǎng)站制作方案
先直接拋出業(yè)務(wù)背景!
有一款游戲,日活躍量(DAU)在兩千左右,雖然 DAU 不高,但這兩千用戶的忠誠度非常高,而且會持續(xù)為游戲充值;為了進一步提高用戶體驗,繼續(xù)增強用戶的忠誠度,老板想要在該款游戲中引入聊天功能,同時探索和驗證游戲用戶對 IM 的需求和依賴度。IM 需要在兩周后上線,如果你是這個 IM 項目的架構(gòu)師,帶著兩名經(jīng)驗尚欠的程序員,你如何設(shè)計并落地該 IM 系統(tǒng)?
業(yè)務(wù)背景并不復(fù)雜,簡單總結(jié)一下:
-
用戶規(guī)模小:DAU 在兩千左右,同時在線人數(shù)高峰期不到200;
-
開發(fā)人員少:一名架構(gòu)師加兩名程序員;
-
開發(fā)時間短:一周開發(fā)加一周測試,只有兩周時間。
這種情況下,研發(fā)策略通常是:怎么簡單就怎么做,怎么快就怎么來!
所以對該 IM 系統(tǒng)采用【單體架構(gòu)】的方式進行設(shè)計,見下圖。
前端是運行安卓系統(tǒng)和 IOS 系統(tǒng)的移動設(shè)備,游戲 APP 內(nèi)嵌 IM 的客戶端,由前端同學(xué)負責(zé)開發(fā)。
后端是 Server 節(jié)點,通過多進程多機器部署的方式,避免 “單點”; 這個地方需要注意:【單體架構(gòu)】并非 “單點架構(gòu)” ,單體架構(gòu)仍然是分布式架構(gòu)的一種,通過集群的方式提供高可用和高吞吐的服務(wù);對多個 Server 節(jié)點的訪問通過 Nginx 來做反向代理;Server節(jié)點由后端同學(xué)負責(zé)開發(fā)。
存儲部分包括數(shù)據(jù)庫和緩存,數(shù)據(jù)庫中分別創(chuàng)建 “消息表”、“離線消息表”、“聯(lián)系人表” 和 “用戶表”; 緩存用來記錄用戶的在線信息;數(shù)據(jù)庫和緩存由 DBA 同學(xué)負責(zé)維護。
單體架構(gòu)的系統(tǒng),最大的優(yōu)勢就是在項目前期開發(fā)簡單、部署簡單、測試簡單、運維簡單,開發(fā)同學(xué)幾乎可以將所有的注意力全部放在業(yè)務(wù)邏輯上,實現(xiàn)真正的【快速落地】。
下面分別討論一下關(guān)鍵的技術(shù)選型:前端與后端的通訊協(xié)議、后端的編程語言、數(shù)據(jù)庫選型。
一、通訊協(xié)議
前端與后端之間的通訊協(xié)議,有四種選擇,見下表。
IM 系統(tǒng)通常會選擇 “長連接” 類型的協(xié)議;但是 WebSocket 協(xié)議因為剛推出不久,成熟度不高;TCP 協(xié)議屬于傳輸層協(xié)議,較為復(fù)雜,如果沒有豐富的 TCP 網(wǎng)絡(luò)編程經(jīng)驗的話,在研發(fā)時間非常緊張的情況下,建議不要選擇 TCP。
所以,這里我們選擇最簡單和最容易落地的協(xié)議—Http;對于編程經(jīng)驗尚欠的應(yīng)屆生來講,Http編程也不會有太大難度。
分析到這里,相信大家肯定有這樣的疑惑:Http 是短連接的無狀態(tài)協(xié)議,如何進行消息的即時通訊呢?難道是通過客戶端周期性的輪詢訪問嗎? 是的,同時在線人數(shù)只有幾百的情況下,客戶端周期性輪詢是完全沒有問題的,況且Server是多節(jié)點部署,完全可以 Cover 客戶端周期輪詢的壓力。
二、編程語言
Server 端編程語言,也有四種選擇(公司內(nèi)部正在使用的技術(shù)棧),見下表。
C++、Java、PHP、Go 四門編程語言都有非常成熟的并發(fā)編程模型,這里我們選擇公司和團隊最熟悉的語言—Go,使用最熟悉的語言才會帶來更高的編程效率和更快的問題解決速度。
三、數(shù)據(jù)庫
數(shù)據(jù)庫選型有三種選擇,分別是關(guān)系型 SQL 數(shù)據(jù)庫—MySQL、非關(guān)系型 NoSQL 數(shù)據(jù)庫—MongoDB、已經(jīng)新興的NewSQL 數(shù)據(jù)庫—TiDB,見下表。
在該單體架構(gòu)的 IM 系統(tǒng)中,數(shù)據(jù)庫需要提供強事務(wù)能力,來保證業(yè)務(wù)的完整邏輯;同時,數(shù)據(jù)庫需要做到更低成本的運維;這里我們選擇滿足需求和容易運維的數(shù)據(jù)庫—MySQL。
最后,總結(jié)文中關(guān)鍵:
1、業(yè)務(wù)背景:用戶規(guī)模小、開發(fā)人員少、開發(fā)時間短;
2、研發(fā)策略:怎么簡單怎么做,怎么快怎么來;
3、 IM單體架構(gòu): 前端(APP)+ Server + 數(shù)據(jù)庫
單體架構(gòu)最大的優(yōu)勢就是在項目前期開發(fā)簡單、部署簡單、測試簡單、運維簡單。
4、技術(shù)選型:
選擇最簡單和最容易落地的協(xié)議—Http,
選擇公司和團隊最熟悉的語言—Go,
選擇滿足需求和容易運維的數(shù)據(jù)庫—MySQL。
提出一個思考問題,我們會在下篇技術(shù)短文中進行分析:
基于該IM單體架構(gòu),如何實現(xiàn)用戶的登錄和收發(fā)消息呢?Server 節(jié)點是無狀態(tài)化的嗎?