如何快速開發一個IM系統
來自專欄我是程序員59 人贊了文章
摘要:本文將會給大家介紹如何開發一個簡單的即時通訊系統(IM)。 Timeline 模型是 TableStore團隊針對消息數據場景所新創的一個數據模型,它的特色在於能夠滿足消息數據場景對消息保序、海量消息存儲、實時同步的特殊需求。
本文將會給大家介紹如何開發一個簡單的即時通訊系統(IM)。
為什麼不簡單
我們的站點加一個即時通訊(IM)的功能,那麼我們怎麼做?
在回家的路上,問了同是實習生(網路方向)的舍友這樣一個問題,他回答:「很簡單,只需要在服務端保存一個list,收到一個人的message後,我轉發給list中指定的另一個人就好啦」
接著,我們討論了一晚上下面的幾個問題
- 對方不在線怎麼辦?
- 內存里保存list的話,人多了怎麼辦?
- 怎麼查看歷史記錄?怎麼多端同步數據?
- 為什麼微信用戶只能建立有限個群,並且群聊功能很晚才開放?為什麼微信好友數是有上線的?
- 怎麼保證消息有序、不丟失數據?
- 如何保證消息的時效性?
- 如何承擔高並發流量?
最後討論的結果是:開發一個穩定高效的IM產品是相對困難的,上面這些難題,QQ、微信等產品都遇到過。而且IM產品一旦量達到一定程度,性能、穩定性、可用性等的挑戰會越來越大,開發維護都十分困難,需要不斷的打磨錘鍊,才能保證是一個可靠穩定的IM產品。
為什麼簡單
同樣是一個IM的小白,在看到 tableStore
產品的 timeline
模型後,只花了一個下午的時間,就理解了IM和做出一個可使用的demo。
Timeline
模型是 TableStore
團隊針對消息數據場景所新創的一個數據模型,它的特色在於能夠滿足消息數據場景對消息保序、海量消息存儲、實時同步的特殊需求。目前 Timeline
模型主要能夠解決以下場景的需求:
- IM : 如釘釘、微信
- Feed流:如微博、朋友圈
- IOT消息下推:如天貓精靈
- 無限Topic的隊列
具體的文章可以參考:
- TableStore Timeline:輕鬆構建千萬級IM和Feed流系統
- TableStore數據模型 - WideColumn和Timeline
介紹
接下來我們來完成這樣的一個即時通訊產品的demo。正因為是一個demo,我們關注核心功能,所以在設計和其他功能上都會從簡,方便大家理解和閱讀。
1. 設計功能
- 一對一私聊
- 群聊
2. 表結構
目前版本的 timeline
只解決消息存儲和同步問題,其他元數據相關的表還是需要我們自己來完成的。下面所有的表都使用tableStore
這款NoSQL分散式資料庫進行存儲,存儲量和並發不用擔心。
1.User 表
主要包含用戶相關的信息。雖然大部分信息在demo中並沒有使用。
private String userName; //用戶名,為了簡化,我們使用userName作為id,在tablestore中作為pk private int age; //年齡 private String gender; //性別 private String sign; //個性簽名
2.Group 表
主要包括群組的信息。demo中實際上我們僅僅使用了 groupName
private String groupName; //群名,為了簡化,我們使用groupName作為id,在tablestore中作為pk private String groupType; //群標籤,群類別 private String groupDescription; //群描述
3.groupUser 表
主要記錄了一個群中包含哪些群成員,這樣當收到一條群消息就知道了同步給哪些成員。在 tablestore中這樣設計。
3. 工程結構
工程採用springboot做的後端框架,前端用了vue.js用來簡單展示數據,具體代碼附件中。
4. 核心代碼邏輯
工程上其實主要在使用框架(springboot、vue.js),這裡就不在一一列舉,下面主要介紹timeline相關的一些使用。而這些核心代碼在官方的github倉庫(https://github.com/aliyun/tablestore-timeline)的測試用例里也有樣例代碼,不僅僅有IM相關的,還有朋友圈、微博這種feed流場景的樣例代碼,而我作為一個使用者只需要拿過來直接用就好啦,十分方便!
4.1 給指定好友發送消息
/** * 發送個人消息 */public void sendPersonalMessage(String userNameFrom, String userNameTo, IMessage message) { //創建發送方的timeline Timeline sender = new Timeline(userNameFrom, store); //存儲消息:發送者存到自己的發件箱 sender.store(message); //創建接收者的timeline Timeline receiver = new Timeline(userNameTo, sync); //同步消息:存到接收者的收件箱 receiver.store(message); logger.debug("【" + userNameFrom + "】send Message to 【" + userNameTo + "】");}
4.2 群發消息
/** * 發送群組消息 */public void sendGroupMessage(String groupName, IMessage message) { //獲取該群組所有的人員列表 List<String> groupMembers = userAndGroupService.listGroupMembers(groupName); logger.debug("Begin send Message to " + groupMembers.size() + " members"); //存儲消息:存到自己的發件箱 Timeline sender = new Timeline(groupName, store); sender.store(message); //同步消息:給群里的所有人發一份, for (String user : groupMembers) { Timeline receiver = new Timeline(user, sync); receiver.store(message); } logger.debug("End send Message to " + groupMembers.size() + " members");}
4.3 元數據、消息內容搜索
IM產品經常需要搜索數據,其中主要包括:
- 用戶、群的元數據搜索
- 歷史消息內容的搜索
這些功能將會在上線 TableStore 2.0的SearchIndex功能後一起發布,屆時Timeline模型將原生支持強大的搜索能力,滿足開發者不同的需求。
運行
大家可以嘗試自己運行一下代碼,很簡單的幾個步驟就把系統運行起來了。
1. 開通服務(免費)
tablestore有足夠多的免費額度,可以做很多事情。我們去官網 https://www.aliyun.com/product/ots 開通實例,通過控制台創建一個實例
- endpoint : 自己的實例的網址,類似
https://xxxxxx.cn-hangzhou.ots.aliyuncs.com
- instanceName :自己的實例的名字,即上面網址的前綴
2. 獲取AK
阿里雲所有的服務幾乎都是通過AccessKeyID 和AccessKeySecret來做鑒權的。我們點擊用戶的如下按鈕,按照提示獲取一個AccessKeyID 和AccessKeySecret。
3. 運行代碼
- 下載指定分支代碼從附件中下載源碼。
- 在源碼中編譯代碼
- linux下
./gradlew build
- windows下:
gradlew.bat build
- 提示:網路不好時間可能會比較久,如果自己本機安裝過gradle的話,也可以直接使用
gradle build
來進行編譯
- 啟動項目其中xxxx相關的要換成自己的阿里雲實際的配置。java -jar build/libs/im-demo.jar --aliyun.tablestore.endpoint="xxxxx" --aliyun.tablestore.AccessKeyID="xxxxx" --aliyun.tablestore.AccessKeySecret="xxxxx" --aliyun.tablestore.instanceName="xxxxx"
- 瀏覽器訪問
http://localhost:8081/
自己多開幾個頁面孤獨聊天,或者將地址發給好友一起體驗!
感受
- tableStore提供的timeline模型,把IM的開發變得如此簡單,任何人都能夠簡單的使用,在並發、容量、消息順序等各種問題上都不用擔心。
- 簡單的demo開發很容易,但是一個功能完善的IM產品開發,還是需要開發人員了解Timeline如何和其他組件一起使用。Timeline僅僅是提供了IM產品的核心支持,作為一個企業級的IM產品支柱而存在。如果Timeline產品能提供補充IM產品的完整設計,那麼相信更多的人會感覺IM易如反掌。
- Demo的細節設計上目前都是從簡的,僅為了體驗Timeline模型。
本文作者:尋劍
原文鏈接
更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎
本文為雲棲社區原創內容,未經允許不得轉載。
推薦閱讀:
※科技小製作——指南針
※介面測試全流程掃盲
※科學家使用 Reddit 上最恐怖的圖片訓練了一個反人類魔鬼 AI
※深海傳說:你不知道的鮟鱇魚