1. 程式人生 > >用消息隊列實現即時通訊2

用消息隊列實現即時通訊2

.com 查找 str 字段名 mob 獲取 callback 權限認證 過期

一、準備階段(需求設計)

鑒權

采用哪種權限認證模式,Cookie由於有域的限制,考慮到以後可能做桌面端,IPhone端等,所以決定采用token進行權限認證,客戶端通過token保存客戶驗證信息。而token則采用JWT進行(補充知識:JSON Web令牌)驗證,用token建議是最好不用查詢數據庫就能獲取一些常用信息,這樣就能節省一些訪問時間。

補充知識:

?JSON Web Token 入門教程 阮一峰

消息

前面說過采用MQTT進行消息傳輸,那麽怎樣定義消息,怎樣保存消息,以及離線消息怎麽拉取就是當前最大的問題,MQTT到底傳輸些什麽呢?

MQTT到底傳輸的是文本還是整個文件(如果有文件的話),參照jwt我們可以將消息分為正常內容以及載荷(payload),將視頻、文件等大體積的內容單獨發送到文件服務器,返回對應id然後放在載荷中,這樣傳輸的就只有全文本(json格式)了。

消息必須有發送者帳號、名稱以及接收者帳號、名稱,發送時間,以及消息類別,消息內容等;考慮到消息發布時先發布出去,再上傳到服務器,在消息中增加一個唯一標識字段msgId,在服務端推送來時可以區分,不會有重復消息。

消息內容分為兩大類,普通文本直接放在消息內容中,而其他消息(如文件、音頻、視頻等)則以json的方式保存在消息內容中。

消息類型:

類別

說明

備註

text

普通文本

Image

圖片

audio

語音

file

文件

location

位置

emotion

自定義表情

video

視頻

idcard

名片

其他消息(除文本消息外)類型結構:

名稱

類型

說明

備註

type

String

類型,也就是以上列出所有類型

path

String

如果是文件,則是對應的路徑

content

String

正文暫時預留

size

int

文件大小

mlength

int

語音,視頻長度

thumb

String

視頻縮略圖,路徑

消息數據庫

暫時考慮消息只保存一張表(如果數據過多,或時間過長影響效率的時候再考慮將這張表做為活動表,過期信息移到別的表中,這是後話,有機會再完善)。只有一張表的情況下,拉取離線消息也相對簡單,只要在客戶端記錄最後一次拉取的時間,在下次登錄的時候將時間發送後臺就可以拉取所有離線消息。

數據庫仍然只保存MQTT發送的消息內容,表結構:

字段名稱

類型

說明

備註

type

String

類型

系統消息,p2p,group

recAccount

String

接收者帳號

可以是組account,也可以是個人account,主要看type是group還是p2p

recName

String

接收者帳號

msgContentType

String

消息正文類型

對應image,text…

msgContent

String

消息正文

前面說明兩種,要麽就是正文,要麽是json

sender

ImAccount

發送者

senderTime

Date

發送時間

msgId

String

消息唯一值

is_callbacked

Boolean

是否撤回

add_time

Date

添加時間

update_time

Date

修改時間

文件上傳下載

開始直接使用Django的文件上傳下載,後來發現效率太低,下載會有問題。於是想使用分布式文件管理系統,在網上查找都是在Linux系統的,而我沒有Linux服務器,只能做其他想。於是決定使用Mongodb Gridfs進行文件管理,花了很長時間終於調通(這個會在後面具體實現中說明)。

帳號數據庫

主要使用到即時通訊表分別為帳號表,群組表,以及消息表(前面說過),以及相關聯表。帳號表除相關信息外,還有friends字段用於保存好友,groups字段用於保存群組列表。而同樣群組表,也有帳號列表字段用於保存群組的帳號信息。

表ImAccount

字段名稱

類型

說明

備註

account

String

帳號,唯一

mobile

String

手機號

name

String

昵稱

search

String

搜索鍵,保存account以及name的拼音搜索字段

email

String

郵箱

QQ

String

QQ號

is_active

Boolean

是否在線,暫時未使用

head

String

頭像對應路徑

add_time

Date

添加時間

update_time

Date

修改時間

friends

List<ImAccount>

好友列表

groups

List<ImGroup>

組列表

表ImGroup

字段名稱

類型

說明

備註

account

String

帳號

name

String

組名

desc

String

描述

creater

ImAccount

創建者

imAccounts

List<ImAccount>

組成員

head

String

組頭像

add_time

Date

添加時間

update_time

Date

修改時間

章,下一期專門講解消息隊列相關內容

技術分享圖片

用消息隊列實現即時通訊2