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


修改时间

 

希望大家能继续关注后期文章,下一期专门讲解消息队列相关内容

请关注公众号有更多精彩等你:

原文地址:https://www.cnblogs.com/wavaya/p/10325815.html

时间: 2024-12-29 14:58:41

用消息队列实现即时通讯2的相关文章

用消息队列实现即时通讯3

消息队列(MQTT) 前面讨论过消息队列传输的具体内容,那我们该用哪种方式进行呢?通过查阅网络资料,发现有两个方式值得借鉴. 第一种方式每个帐号订阅自己的Inbox,而其他人都向这个Inbox发布信息,这种方式接收比较方便,但是发布时就比较麻烦.如群组有50人的话,一条消息就要发布50次,这和Http推拉信息有点类似. 第二种方式,也是我正在使用的方式.每个帐号只订阅自己的个人聊天信息,以及加入的群聊.主题以"/"进行分隔,个人聊天p2p/帐号,群聊group/组帐号.这种方式发送群消

消息队列实现即时通讯

</pre>发送端和接收端都可以发送和接收信息,只是发送和接收消息的类型不同,一个是1,一个是2.具体代码如下:<p></p><p></p><pre code_snippet_id="666150" snippet_file_name="blog_20150513_3_8263799" name="code" class="cpp"><pre cod

消息队列简介

一.概述 计算机科学中,消息队列和邮箱是用于进程间或者线程与同一进行间通讯的软件工程组件.他们都是消息传传输控制队列. 消息队列是发布/订阅模型的变种,是较大的面向消息的中间件的一部分.多数消息系统支持发布/订阅和消息队列模型的API,如JMS(Java Message Service). 消息队列提供异步的通讯协议,这就意味着消息发送者和消息接收者不需要在同一时间与消息队列交互.消息入队直到接收者来读取.消息队列都有单条消息大小的限制,入队消息的数目也有限制. 消息队列的主要应用是在不同计算机

阿里云消息队列Kafka商业化:支持消息无缝迁移到云上

列Kafka彻底解决了开源产品稳定性不足的痛点,可用性达99.9%,数据可靠性99.999999%,并且支持消息无缝迁移到云上. 7月25日,阿里云宣布正式推出消息队列Kafka,全面融合开源生态.在兼容Apache生态的基础上,阿里云消息队列Kafka彻底解决了开源产品稳定性不足的痛点,可用性达99.9%,数据可靠性99.999999%,并且支持消息无缝迁移到云上. Kafka是一个分布式.高吞吐量.高可扩展性的消息队列服务,广泛用于日志收集.监控数据聚合.流式数据处理.在线和离线分析等大数据

MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制

最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2M和物联网IoT的连接协议,采用轻量级发布和订阅消息传输机制.Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用. 基本概念 [MQTT协议特点]——相比于RESTful架构的物联网系统,MQ

系统通讯之RPC VS 消息队列

文前声明:本人只是知识的搬运工,文中许多知识和观点大多数都是来自于网络或书本,因为没有记录的习惯学习研究完,便忘记名称了,如若还记得,在文后自会添加备注. 个人观点,对于这两种通讯方式我是支持消息队列的! 原由且听我分析: 通讯方式 RPC 消息队列 优点 舒适感非常好,直接远程调用,无需关注通讯协议等等细节 (除了这个,我还真不知道RPC还有什么优点) 1.解耦 2.冗余 3.可扩展 4.可恢复 5.交易缓冲 6.消息投递保证 7.异步通信(支持同步) 8.提高系统吞吐.健壮性 缺点 1.对开

linux_c 开发(5-5)进程间通讯_消息队列

进程间通讯_消息队列 定义: UNIX早起通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便.消息队列(也称报文队列)则克服了这些缺点. 发展: 消息队列就是一个消息的链表.可以把消息看做一个记录,**具有特定的格式.进程可以向中按照一定的规则添加新消息:另一些进程则可以从消息队列中读取消息. 分类: 目前主要有两种类型的消息队列:POSIX消息队列 以及系统V消息队列,系统V消息队列目前被大量使用. 持续性:系统V消息队列是随内核持续的,只有在

[Python]实现XMPP协议即时通讯发送消息功能

#-*- coding: utf-8 -*- __author__ = 'tsbc' import xmpp import time #注意帐号信息,必须加@域名格式 from_user = '[email protected]' password = 'a1b2c3d4' #可以添加多个接收人 to_user = ['[email protected]'] msg = "您好!这是条测试信息!" def to_msg(): """ 基于xmpp协议的即时

进程组间通讯(消息队列)

1.所有进程共用一个消息队列组. 2.消息队列组里面包含一个发送消息队列和一个接收消息队列. 3.请求进程主动向发送消息队列发送消息,从接收消息队列接收消息.处理进程从发送消息队列读取请求,向接收队列发送处理结果. 4.同一进程组都是相同的进程. 5.处理进程组内的所有进程以竞争的方式从消息队列内读取请求. 5.要实现的功能是向进程组发送消息,得到处理结果.从发送请求的进程的角度来说,只需要知道发送给哪个进程组即可.从接收进程的角度来说,需要知道请求是从哪一个进程发来的才能准确地把请求结果返回.