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

1、準備階段(需求設計)node

 

鑑權數據庫

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

 

補充知識:服務器

        ​JSON Web Token 入門教程 阮一峯分佈式

消息ide

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

     MQTT到底傳輸的是文本仍是整個文件(若是有文件的話),參照jwt咱們能夠將消息分爲正常內容以及載荷(payload),將視頻、文件等大致積的內容單獨發送到文件服務器,返回對應id而後放在載荷中,這樣傳輸的就只有全文本(json格式)了。設計

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

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

     消息類型:

類別

說明

備註

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

修改時間

 

 

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

相關文章
相關標籤/搜索