用消息队列实现即时通讯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

 

修改时间

     

 

文件上传下载

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygyxg.html