如何快速開發一個IM系統

如何快速開發一個IM系統

來自專欄我是程序員59 人贊了文章

摘要:本文將會給大家介紹如何開發一個簡單的即時通訊系統(IM)。 Timeline 模型是 TableStore團隊針對消息數據場景所新創的一個數據模型,它的特色在於能夠滿足消息數據場景對消息保序、海量消息存儲、實時同步的特殊需求。

本文將會給大家介紹如何開發一個簡單的即時通訊系統(IM)。

為什麼不簡單

我們的站點加一個即時通訊(IM)的功能,那麼我們怎麼做?

在回家的路上,問了同是實習生(網路方向)的舍友這樣一個問題,他回答:「很簡單,只需要在服務端保存一個list,收到一個人的message後,我轉發給list中指定的另一個人就好啦」

接著,我們討論了一晚上下面的幾個問題

  1. 對方不在線怎麼辦?
  2. 內存里保存list的話,人多了怎麼辦?
  3. 怎麼查看歷史記錄?怎麼多端同步數據?
  4. 為什麼微信用戶只能建立有限個群,並且群聊功能很晚才開放?為什麼微信好友數是有上線的?
  5. 怎麼保證消息有序、不丟失數據?
  6. 如何保證消息的時效性?
  7. 如何承擔高並發流量?

最後討論的結果是:開發一個穩定高效的IM產品是相對困難的,上面這些難題,QQ、微信等產品都遇到過。而且IM產品一旦量達到一定程度,性能、穩定性、可用性等的挑戰會越來越大,開發維護都十分困難,需要不斷的打磨錘鍊,才能保證是一個可靠穩定的IM產品。

為什麼簡單

同樣是一個IM的小白,在看到 tableStore產品的 timeline模型後,只花了一個下午的時間,就理解了IM和做出一個可使用的demo。

Timeline 模型是 TableStore 團隊針對消息數據場景所新創的一個數據模型,它的特色在於能夠滿足消息數據場景對消息保序、海量消息存儲、實時同步的特殊需求。目前 Timeline 模型主要能夠解決以下場景的需求:

  1. IM : 如釘釘、微信
  2. Feed流:如微博、朋友圈
  3. IOT消息下推:如天貓精靈
  4. 無限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倉庫(github.com/aliyun/table)的測試用例里也有樣例代碼,不僅僅有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產品經常需要搜索數據,其中主要包括:

  1. 用戶、群的元數據搜索
  2. 歷史消息內容的搜索

這些功能將會在上線 TableStore 2.0的SearchIndex功能後一起發布,屆時Timeline模型將原生支持強大的搜索能力,滿足開發者不同的需求。

運行

大家可以嘗試自己運行一下代碼,很簡單的幾個步驟就把系統運行起來了。

1. 開通服務(免費)

tablestore有足夠多的免費額度,可以做很多事情。我們去官網 aliyun.com/product/ots 開通實例,通過控制台創建一個實例

  1. endpoint : 自己的實例的網址,類似 https://xxxxxx.cn-hangzhou.ots.aliyuncs.com
  2. instanceName :自己的實例的名字,即上面網址的前綴

2. 獲取AK

阿里雲所有的服務幾乎都是通過AccessKeyID 和AccessKeySecret來做鑒權的。我們點擊用戶的如下按鈕,按照提示獲取一個AccessKeyID 和AccessKeySecret。

3. 運行代碼

  1. 下載指定分支代碼從附件中下載源碼。
  2. 在源碼中編譯代碼

    1. linux下 ./gradlew build
    2. windows下: gradlew.bat build
    3. 提示:網路不好時間可能會比較久,如果自己本機安裝過gradle的話,也可以直接使用 gradle build 來進行編譯
  1. 啟動項目

    其中xxxx相關的要換成自己的阿里雲實際的配置。

    java -jar build/libs/im-demo.jar --aliyun.tablestore.endpoint="xxxxx" --aliyun.tablestore.AccessKeyID="xxxxx" --aliyun.tablestore.AccessKeySecret="xxxxx" --aliyun.tablestore.instanceName="xxxxx"
  2. 瀏覽器訪問 http://localhost:8081/ 自己多開幾個頁面孤獨聊天,或者將地址發給好友一起體驗!

感受

  1. tableStore提供的timeline模型,把IM的開發變得如此簡單,任何人都能夠簡單的使用,在並發、容量、消息順序等各種問題上都不用擔心。
  2. 簡單的demo開發很容易,但是一個功能完善的IM產品開發,還是需要開發人員了解Timeline如何和其他組件一起使用。Timeline僅僅是提供了IM產品的核心支持,作為一個企業級的IM產品支柱而存在。如果Timeline產品能提供補充IM產品的完整設計,那麼相信更多的人會感覺IM易如反掌。
  3. Demo的細節設計上目前都是從簡的,僅為了體驗Timeline模型。

本文作者:尋劍

原文鏈接

更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎

本文為雲棲社區原創內容,未經允許不得轉載。


推薦閱讀:

科技小製作——指南針
介面測試全流程掃盲
科學家使用 Reddit 上最恐怖的圖片訓練了一個反人類魔鬼 AI
深海傳說:你不知道的鮟鱇魚

TAG:科技 | 遊戲從業者 | 軟體開發 |