IM即时通信软件自我思考

作为一个IM系统,核心场景为单聊、群聊。单聊是1对1聊天;群聊是,多个人在一个群里聊天。
无论是单聊还是群聊,抽象出会话确实不错,单聊就是两个人在一个会话中聊天,群聊就是多个人在一个会话中聊天。假设会话模型叫做session,则应该有如下的特征:

对于单聊场景,
A发送消息给B,AB构成的会话ID由A/B两个账号ID确定,比如叫做session-a-b,则A发送消息给B可以理解为往会话session-a-b中新增一条消息。
无论是A发送消息给B,还是B发送消息给A,都是将消息放入session-a-b。

单聊会话数据模型设计:
session_id,为会话ID;
sender_account_id,为消息发送人账号ID;
receiver_account_id,为消息接收人账号ID;

假设不考虑消息查看功能,则理论上,只需要使用一个queue,将会话中的消息按照先来先进的顺序,逐个放入queue即可;
但因为考虑到消息查询,所以我们不能用queue存储,而是要使用比如RDS这种关系型数据库存储,

单聊会话消息的数据模型为:

session_id,会话ID;
message_id,为消息ID,全局唯一;
message_type,为消息类型;
message_body,为消息内容;
sequence,为消息在会话中的序号,全局自增;
time,为消息产生时间;

单聊会话的消息查询实现逻辑:
A/B中任何一个人要查询和对方的聊天记录,
1、客户端传给服务端session_id、要拉取会话消息的起始sequence,调用网关接口查询消息;
2、服务端通过session_id、sequence到上面的单聊会话消息数据表中查询session_id匹配,sequence大于给定sequence的消息记录,可以一次只返回有限的记录,客户端分批查看,因为有可能未读消息很多;

对于群聊场景,
是所有群成员都在向同一个群聊会话中发送消息,且群聊会话中的消息对所有群成员开放,也就是所有群成员看到的都是群聊会话中的同一份消息。

群聊会话数据模型:
session_id,为会话ID;
group_id,为群组ID;

群会话消息的数据模型:
我们发现,群会话消息模型和单聊会话的消息模型是一样的,只是会话类型不同,故我们扩展一下单聊会话消息的数据模型,增加一个会话类型,如下所示:

通用会话消息数据模型:
session_type,会话类型:单聊、群聊;
session_id,会话ID;
message_id,为消息ID,全局唯一;
message_type,为消息类型;
message_body,为消息内容;
sequence,为消息在会话中的序号,全局自增;
time,为消息产生时间;

群聊会话的消息查询实现逻辑:
群组中的任何一个群成员要查询群聊会话的聊天记录,
1、群成员客户端传给服务端session_id、要拉取会话消息的起始sequence,调用网关接口查询群会话消息;
2、服务端通过session_type、session_id、sequence到上面的群会话消息数据表中查询session_type、session_id匹配,sequence大于给定sequence的消息记录,可以一次只返回有限的记录,客户端分批查看,因为有可能未读消息很多;

关于群成员的数据模型设计:
group_id,群组ID;
group_member_account_id,群成员的账号ID,单个群内唯一;

通过以上的模型设计,无论是单聊还是群聊,客户端发送消息到服务端,服务端的处理逻辑只是在当前的会话中持久化一条消息即可。会话消息持久化完成后,通过消息推送服务(如个推),

对于单聊场景,如果收消息的人在线,则推送一条通知消息给收消息的人的所有在线的客户端设备;
对于群聊场景,则推送通知消息给群里所有其他在线成员的所有在线的客户端设备;

当然,服务端为了削峰填谷,我们可以在服务端收到客户端的发送消息的请求后,先发把消息发送到MQ(比如rocketmq),然后MQ的消费者异步的方式去持久化会话消息,以及推送通知给客户端设备。客户端设备收到通知后,向服务端发起新消息的查询请求,请求逻辑上面已经描述。

原文地址:https://www.cnblogs.com/netfocus/p/11249066.html

时间: 2024-08-29 22:29:20

IM即时通信软件自我思考的相关文章

你对金钱的态度是什么?自我思考

最近听<冬吴相对论>,节目里面提出了一个问题:“你对金钱的态度是什么?”,节目里主持人的态度就是要“敬畏金钱”.这个话题我很感兴趣,因为日常生活离不开钱这个字,但从未认真总结过. 我对金钱的态度很简单,做金钱的朋友,不要被你的贪婪吞噬自己,也不要被它引诱你失去自己,你要做的是了解自己,你就能知道你能吸引什么样的朋友.但发现简单的事情原来是最难做好的,就如佛祖说人们本来都是有无上的智慧,只是渐渐被尘世蒙蔽双眼,悟的过程其实是清楚地认识自我的过程,般若智慧原本就在你身上.小时候看香港的电影里面有个

分享一个Android版 仿QQ局域网即时通信软件(可发文件、语音、录音)

一.支持的功能有文字信息交互.语音聊天.发送文件和录音 源码会在后面附上. 二.UI展示图 三.经过我的测试,是非常成功的.只是有一点不足就是语音实时通话的时候声音会回声甚至死机. 文件传送和文字,录音都比较成功. 四.本软件是用Java编码,在安卓平台上的应用.使用了UDP协议和TCP协议. 大家可以学习这两部分的代码. 里面注释还是比较多. 五.当然我只是个学生,这个只是学生版本,仅供大家学习借鉴之用.绝对不能用于商业拿去直接卖,或者改改就上架某市场. 六.宣传下本人的小制作: 单机斗地主-

科聊——即时通信软件原型设计

原型展示地址:科聊 原型设计工具:墨刀 运行环境:Android,Web浏览器(Chrome测试) 安卓下载: 说明:产品原型是整个产品面市之前的一个框架设计,本产品原型对框架结构做出了基本搭建,未注重图标的美化和细节的布局. Need 科聊,顾名思义,做我们科大自己的即时通信软件,方便校园内部的沟通联系,完成点对点的即时通讯,极大满足科大用户需求. Approach 潜心慎虑,暂定平台基于Android实现,原因有几点: 1.移动设备便于携带,切合即时通信工具的本意 2.Android面向大量

测试数据真假难辨-IT精英自我思考

为什么对于测试数据这么重视呢? 故事背景:之前Java版ITOO验收的时候,由于是分模块开发的,大家对于整体或许有一个全局观的把握,但是对于其它人的模块的细节部分就不是了解的那么深刻了!当两个不同的功能写上同样的描述,又或者本来就陌生的字段,你用111,333等不明确的寓意来表示的话,会导致什么样的恶果呢?? 会议结束之后,回到自己的座位上,就开始开始自我反思,列举了那么多早就该改掉的坏习惯,看看自己是否有一条"没有命中"呢? 看自己开发的模块的数据库:本来应该是课程名称的,但是日积月

一种基于Storm的可扩展即时数据处理架构思考

问题引入 使用storm可以方便的构建一种集群式的数据框架,并通过定义topo来实现业务逻辑. 但使用topo存在一个缺点, topo的处理能力来自于其启动时设置的worker数目,在很多情况下,我们需要能够根据业务压力来调整集群的处理能力,这时候单一的topo就无法解决这个问题了. 为了能够更加灵活的定义处理能力,可以考虑将原有的topo根据业务域进行拆分,做到互不干扰,灵活控制,而且为了能够更加经济的利用处理资源,可以考虑引入worker资源池的概念,达到对资源的充分利用. 但使用这种多to

随笔 | 对计算机专业的自我思考

随笔的想法来自博客https://www.cnblogs.com/greyzeng/p/9581624.html,对当中的提问作出一些自己的思考. 前言 在写下这篇随笔之前,我分别看了有关上课态度和师生关系的两篇博客文章,想在前言说一下自己的感想.我认为当一个学生,无论这门课你是否感兴趣,是否学习很困难,上课的时候都必须认真参与.尤其像大学专业的课程,即使不同的课程是学习不同的技术,可是它们之间仍然存在着关联.譬如,我喜欢学习Android的课程,可是我的Java课没有好好听,导致Android

自我思考

这次找工作明显能力和野心配不上,都怪自己玩了两年,不学习,特别悔恨,所以现在要好好的学习,比我优秀的人还比我努力,现在只有抓紧赶上,永远不要忘了自己的初心. 2017/2/24

即时通信服务器架构的一些思考

对于一个即时通信服务器来说,在用户量少的时候,一台服务器就足以提供所有的服务.而这种架构也最简单,举个例子,用户A与用户B互为好友,A向B发消息,服务器接收到消息时,解析出接收消息的人,直接转发给B即可.可是当用户数量越来越多时,一台服务器已经无法所有用户的需求,这时就要进行服务扩容,进行分布式部署 如图所示,不同的用户可能登录到不同的服务器上,那么用户A给用户B发消息时,服务器收到消息,首先判断B是否也登录在本服务器上,如果是,那么直接转发消息即可.如果B不在本服务器上,那应该往哪里转发这条消

开发汉澳即时通信网,2006年上线,QQ死期到了

为汉澳sinox用户打造即时通信网让大家用上即时通信软件 最近腾讯关闭了linuxQQ登录,汉澳 sinox也登陆不上,非windows用户再也不能用上即时通信软件了!这是多么可悲的事,但是我们必须化悲痛为力量,打造汉澳即时通信网,让每个人都用上即时通信.即时通信是继www,email,ftp后最具潜力的应用,称IM. 目前开始研发即时通信软件,有个teamtalk开源软件比较好的帮助开发汉澳即时通信网.预计2006年底汉澳即时通信网上线.采用几台汉澳矩阵服务器为数百万用户提供服务.为了减少服务