用消息隊列實現即時通訊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的拼音搜索字段 |
|
|
String |
郵箱 |
|
|
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