用訊息佇列實現即時通訊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 |
修改時間 |
希 望 大 家 能 繼 續 關 注 後 期 文 章,下一期專門講解訊息佇列相關內容
請 關 注 公 眾 號 有 更 多 精 彩 等 你 :