IM系统中,特别是在企业应用场景下,消息的已读未读状态是一个强需求。

功能看起来很酷,但用起来是一言难尽(上班族心里苦.... )。实际上,技术实现也并不容易。

那么,对于已读未读状态:

1)如果是私聊:消息的阅读状态比较容易实现,在性能和存储上也不存在问题;

2)如果是群聊:考虑到存储和处理性能,特别当处于一个云环境时,如何高效地处理群聊的已读未读状态是一个非常值得探讨的话题。

这里提到的“高效”含3个方面:

1)存储空间;

2)处理速度;

3)传输字节数。

本文将从服务端的角度来探讨已读未读状态,在具体的技术实现上对于存储空间占用方面的思路差异。

已读未读状态交互流程

发送者发送的IM聊天消息,在接收者阅读消息后,是否要求阅读者通知已读,可能是由系统配置、组织配置、群组配置等决定,也可能由发送者根据业务需求决定。以下的讨论,均假设消息需要已读未读状态。

客户端与服务端之间,关于阅读状态的命令只需3个,每个命令含请求和应答。

通知消息已读(私聊、群聊通用)

当小宝阅读了一条或若干条消息,需向服务端发送消息已读通知:“众爱卿发的x+y+z消息,朕已阅”。

服务端收到小宝的已读通知时,需完成以下事项:

1)存储消息的已读状态;

2)返回应答给小宝;

3)向已读列表的消息的原始发送者通知消息已读。

对于第“3)”步:

1)私聊的场合,比较好理解,就是发送给私聊的对方;

2)群聊的场合,可很不一样:因为小宝发送的已读消息列表,可能是由众爱卿发送的。考虑这种假设:张三、李四、王五发出的群聊消息,被小宝一下都阅读了,那么小宝发出的已读通知包含的消息列表,需要被IMS分解成3个已读通知(3个不同的消息列表),分别通知给张三、李四、王五,通知内容是“爱卿(不含'"众")发的这些消息,朕已阅”。

查询消息的未读人数(私聊、群聊通用)

消息的发送者,加载消息列表到聊天窗口时,可能需要展示消息是否被已读。

对群聊而言,显示的信息可能是n人未读的提示,那么需要向服务端查询消息的未读人数,由于客户端可能在UI显示自己发出的多条消息,需支持一次请求查询多条消息。

以未读人数的方式来表示消息的阅读状态,统一了私聊、群聊的查询,使得客户端-服务端间的接口更简单,同时使客户端的实现逻辑更统一。

就像下面这样:

1)对于私聊:如果未读人数n>0,表示消息未读;

2)对于群聊:直接显示n人未读即可,当然,当n等于0时表示全部已读。

查询群消息的已读、未读人员清单(群聊)

当客户端希望显示某一条群聊消息的已读、未读人员列表,需向服务端发起查询。

几种具体的已读未读状态存储思路探讨

基本约定

群聊的阅读状态比私聊复杂,因此这里着重讨论群聊的阅读状态。

假设群成员数是n,各个客户端立即IM服务端发送已读通知。服务端需存储每个人的阅读状态,包括那些未读的成员。由于群的成员清单可能变化,比如今天增加了一个成员,则昨天发的消息、与今天发的消息,其接收者列表不一样。即时通讯聊天软件app开发可以加蔚可云咨询

即:

1)同一个群的不同消息,对应的接收者列表可能不一样。

2)换言之,每一条消息都需要记录完整的接收者列表和已读人员列表。

为了方便讨论,本章假设群成员有640人为前提。

存储思路1

每一条消息都维护:

1)接收人员列表receiver_list;

2)已读人员列表read_list。

具体是:

1)IM Server收到一条消息时,用全体群成员构建receiver_list;

2)IM Server收到群成员对这条消息的已读通知时,将此成员加入到read_list。

客户端获取此消息的数据:

1)当需要获取未读人数时,用receiver_list的个数减去read_list的个数;

2)当需要获取已读、未读人员列表时,需用receiver_list减去read_list得到未读人员列表。

那么,思路1每条消息的存储空间是:

640个ID + 不定数量的已读人员ID

存储思路2

每一条消息维护:

1)未读人员列表unread_list;

2)已读人员列表read_list。

具体是:

1)IM Server收到一条消息时,用全体群成员构建unread_list;

2)IM Server收到群成员对这条消息的已读通知时,将此成员从unread_list移出,同时加入到read_list。

客户端获取此消息的数据:

1)当需要获取未读人数时,直接计算unread_list的个数;

2)当需要获取已读、未读人员列表时,直接返回unread_list和read_list。

那么,思路2每条消息的存储空间是:

未读人员ID + 已读人员ID,合计640个ID

思路2的实现,占用的空间是案1的0.5倍~1.0倍。即案2占用的空间少,但在每次收到客户端的已读通知时,比案1多了一个操作:从unread_list进行减员。

im即时通讯开发:群聊消息的已读未读功能相关推荐

  1. IM即时通讯开发群聊消息的已读回执功能该怎么实现?

    我们平时在使用即时通讯应用时候,每当发出一条聊天消息,都希望对方尽快看到,并尽快回复,但对方到底有没有真的看到?我却并不知道.一个残酷的现实是,很多时候对方其实是早就已经看到了这条消息,但出出种种原因 ...

  2. IM群聊消息的已读未读功能在存储空间方面的实现思路探讨

    1.引言 IM系统中,特别是在企业应用场景下,消息的已读未读状态是一个强需求. 以阿里的钉钉为例,钉钉的产品定位是用于商务交流,其"强制已读回执"功能,让职场人无法再"假 ...

  3. im即时通讯开发:IM群聊消息的已读回执功能

    我们平时在使用即时通讯应用时候,每当发出一条聊天消息,都希望对方尽快看到,并尽快回复,但对方到底有没有真的看到?我却并不知道. 一个残酷的现实是,很多时候对方其实是早就已经看到了这条消息,但出出种种原 ...

  4. IM消息重试机制Java实现_IM群聊消息的已读回执功能该怎么实现?

    本文引用了架构师之路公众号作者沈剑的文章,内容有改动,感谢原作者. 1.前言我们平时在使用即时通讯应用时候,每当发出一条聊天消息,都希望对方尽快看到,并尽快回复,但对方到底有没有真的看到?我却并不知道 ...

  5. 大公司面试考细节,设计群聊消息的已读未读功能你说说怎么做?

    一朋友和我讨论他前段时间面试某大公司的一题目 : 企业IM比如企业微信.钉钉里面的群消息的有个已读未读的功能,发送者刚发出消息时,当前群里其他群成员都是未读状态,陆陆续续有人看了这个消息,这时候消息的 ...

  6. 面试官:群聊消息的已读未读功能,你来设计一个?

    欢迎关注方志朋的博客,回复"666"获面试宝典 一朋友和我讨论他前段时间面试某大公司的一题目 : 企业IM比如企业微信.钉钉里面的群消息的有个已读未读的功能,发送者刚发出消息时,当 ...

  7. 面试题:群聊消息的已读未读设计

    点击上方"Java之间",选择"置顶或者星标" 你关注的就是我关心的! 作者:小猿学习笔记 一朋友和我讨论他前段时间面试某大公司的一题目 : 企业IM比如企业微 ...

  8. im即时通讯开发:离线消息、历史消息的实践

    在如今的移动互联网时代,IM类产品已是我们生活中不可或缺的组成部分.像微信.钉钉.QQ等是典型的以 IM 为核心功能的社交产品.另外也有一些应用虽然IM功能不是核心,但IM能力也是其整个应用极其重要的 ...

  9. 即时通讯开发Android端消息推送总结

    为什么要研究Android推送技术? 主要还是毕业设计要做一个即时通信app, 我是不喜欢做什么社交app的, 也就象牙塔里的人想得出来, 说实话有这功夫还不如钻研一个小技术点, 把一个点研究透彻, ...

  10. im即时通讯开发:群聊消息如此复杂,如何保证不丢不重

    群聊已经成为主流IM软件的基本功能,不管是QQ群.还是微信群,一个群友在群内发了一条消息,那么对于IM服务器来说需要保证: 在线的群友能第一时间收到消息: 离线的群友能在登陆后收到消息. 常见的群消息 ...

最新文章

  1. (最新最全)windows使用anaconda安装pytorch进行深度学习并使用GPU加速
  2. VTK:Rendering之MotionBlur
  3. hession调用json解析异常 com.caucho.hessian.io.HessianProtocolException: expected integer at 0x74 java.util
  4. CKEditor 富文本编辑器转PDF
  5. spark概念、编程模型和模块概述
  6. 关于单利模式的几种实现方式
  7. Ubuntu Amarok乱码解决方案
  8. 第12章 正则表达式与文件格式化处理
  9. 学习使用DCMTK工具
  10. 北京市城八区廉租住房和经济适用住房保障家庭收入、住房、资产标准已确定
  11. 初一网络计算机基础知识,初一计算机基础知识复习题da.docx
  12. 布控球可接入电网安全接入平台及电网统一视频
  13. Word多级列表不显示和奇数页显示章节标题问题
  14. Android 的录音分享特性
  15. Django 链接sqlserver 简单教程
  16. vue路由传参的三种方式/含页面刷新参数丢失解决方案(详细)
  17. PMP-33项目质量管理
  18. 《中文核心期刊要目总览(2014年版)》——计算机、自动化类
  19. arm汇编总结---让汇编不再神秘
  20. linux升级补丁包,linux 升级补丁

热门文章

  1. vue PC项目实现 支付宝支付(跳转至支付界面)
  2. 马尔可夫不等式、切比雪夫不等式、柯西-施瓦茨不等式
  3. 领导的这些职场暗语,你一定要知道!
  4. matlab 函数变量保存在工作区,Matlab中保存函数内部中间变量到工作空间的两种方法...
  5. 编程中如何不使用中间变量的情况下将两个变量的值进行交换
  6. 《论持久战》的主要原则
  7. Mybatis Plus 3 oracle 自增序列
  8. J-Flash使用方法
  9. 零基础想快点入行软件测试是不是非得参加培训班?
  10. 高效能人士的七个习惯(一)由内而外全面造就自己