用消息队列实现即时通讯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的拼音搜索字段

 

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

修改时间

 

 

章,下一期专门讲解消息队列相关内容

技术分享图片

以上是关于用消息队列实现即时通讯2的主要内容,如果未能解决你的问题,请参考以下文章

IM即时通讯开发MQ消息队列

IPC之消息队列·即时通讯小程序

RabbitMQ实现即时通讯居然如此简单

多维度对比主流分布式MQ消息队列,妈妈再也不担心我的技术选型了

flutter即时通讯聊天下拉刷新更多消息思路及代码实现

分享5款主流分布式MQ消息队列对比