用消息队列实现即时通讯2
Posted wavaya
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用消息队列实现即时通讯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的主要内容,如果未能解决你的问题,请参考以下文章