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


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

 

鑒權

     采用哪種權限認證模式,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

修改時間

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM