即时通讯-6-已读回执的方案设计

背景-为什么展示已读未读

部分即时通讯软件会选择展示给用户已读未读, 主要是快速感知对方的阅读状态, 感觉到自己受重视, 方便做下一步操作
如果要带点高度的讲,满足软件所代表的关键用户的诉求

什么场景下要展示已读回执

  1. toB的场景
    如钉钉, 企业微信。已读未读, 是为了满足企业运作核心效率(即老板视角)的诉求, 已读未读, 有一种压迫感,用户A看了用户B的消息, 是需要快速响应的。
  2. 客服的场景。
    电商客服, 售后服务。 已读未读。 是为了满足消费者的快速响应的诉求, 已读未读, 也是有一种压迫感, 客服看了用户的反馈信息, 是需要快速给出响应的。

既然有诉求, 开发便需要设计和实现。在开发之前, 需要定义清楚什么是已读未读?

什么是已读未读?

不同的产品形态, 对于已读未读的定义是不同的。

  1. 用户看到的最新消息以及以前的消息都算作已读: 对于已读未读定义不严格时,用户看到最新的消息,便认作历史消息都当做已读。
  2. 用户点击的消息才算作已读: 像一些通知类的消息,用户真正点击了消息, 才当做是已读。
  3. 用户看到的消息才算作已读,没有看到的不算已读: 像钉钉这样的产品, 消息真正曝光到用户的屏幕上, 才算是已读。

如何设计实现

针对定义的已读未读的三种定义, 实现起来整体可以分为两类。

  1. 会话级别的已读未读:用户看到的最新消息以及以前的消息都算作已读
  2. 消息级别的已读未读: 用户点击的消息才算作已读 + 用户看到的消息才算作已读,没有看到的不算已读

实现会话级别的已读未读

上报时机: 在消息上屏后, 检查接收的最新消息的最新时间戳是否与已经存储的阅读的时间戳的关系即可。如果大于, 更新屏幕上的消息的状态为已读。并且同步到server, 否则,不做调整。
上报存储:由于已读只是一个时间戳, 并且是跟用户+会话, 一一对应, 因而消息的已读未读, 存储在会话中即可。 每个用户的每个会话有自己的已读的时间戳。
在这里插入图片描述
更新消息已读状态的方案
针对会话级别的已读更新消息的方案, 简单做的话, 可以直接单会话完整信息的更新(即此会话的完整模型信息更新, 如会话的title, lastMsg, 已读的position等完整信息, 推拉均可)的topic, 而复杂做, 可以将会话更新的topic进行二级细分,如仅拉取/推送会话的已读情况。 非高并发,大容量的case下,建议直接采用单会话的完整信息的推送/拉取。

server侧的存储: server侧, 单聊的case由于同一个会话, 两人记录的均是对方的消息的最新时间戳, 因而是不一致的。 需要存储到两人私有信息中。 群聊的case下, 同单聊, 记录最新的接收消息的时间戳也是可以的, 记录到个人的会话的收件箱中。

实现消息级别的已读未读

消息级别根据上文, 存在两种情况, “用户点击的消息才算作已读” + “用户看到的消息才算作已读,没有看到的不算已读”
上报时机: 消息曝光/消息点击时, 检查消息的已读未读状态,针对未读的消息, 上报给server即可。
上报存储: 由于是单条消息级别的, 消息是跟用户+会话+消息, 一一对应的, 因而每条消息的已读未读,存储在用户的单聊消息中即可。
在这里插入图片描述
更新消息已读状态的方案*
同会话级别的已读未读方案, 有消息完整内容更新, 以及消息局部更新(即仅更新消息的已读未读)。
对于不复杂的业务, 可以采用消息完整内容更新。 但是对于复杂的业务, 建议采用消息局部更新或者消息合并更新的策略。

server侧的存储由于消息已读未读,是一个公众的状态, 因而是可以被大家都阅读到的。 对于单聊, 记录到公众的消息中, 对于非单聊, 可以采用的会话中, 仅记录消息的已读任务, 未读人数,而不记录具体的人是那些,采用分表的方式, 单独记录到消息的已读表中以及未读表中。对于企业级的千人群, 万人群的特殊case, 还有特殊的优化逻辑。可以参考下企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/6676.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

462. 最小操作次数使数组元素相等 II——【Leetcode每日一题】

462. 最小操作次数使数组元素相等 II 给你一个长度为 n 的整数数组 nums ,返回使所有数组元素相等需要的最小操作数。 在一次操作中,你可以使数组中的一个元素加 1 或者减 1 。 示例 1: 输入:nums [1,2,3] 输出:2 …

微信小程序获取手机号47001 data format error hint的完美解答(restTemplate发送post请求)

发现问题 这几天正在搞微信小程序获取手机号功能开发,发现发送post请求接口时候,接口返回如下错误: {"errcode": 47001,"errmsg": "data format error hint: [******] rid: ******" } post请求的url为&…

动态代理原理

一、案例分析 1、引出问题 回到Spring之初控制事务繁琐的问题。 回到Spring之初控制事务繁琐的问题. 考虑一个应用场景∶需要对系统中的某些业务方法做事务管理,拿简单的save和update操作举例。没有加上事务控制的代码如下。 加上事务代码,如下&#x…

大数据平台开发——使用Java和Python调用Shell脚本

大数据平台开发——使用Java和Python调用Shell脚本 背景 在大数据平台开发中,经常会遇到需要调用Shell脚本的场景,倒不是说只能用Shell,毕竟大数据开发到头来一定是个语言无关的事情: 从Hive源码解读大数据开发为什么可以脱离S…

Java进阶

注解 什么是注解 Java注解(Annotation)又称Java标注,是JDK5.0引入的一种注释机制。 Java语言中类、方法、变量、参数和包等都可以被标注。Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Ja…

【Python实操】一行代码就可以自动画出这种艺术画?(详细教程)

文章目录前言一.准备阶段二、开始使用 Discoart1.引入库2.显示/保存/加载配置总结前言 DiscoArt 是一个很牛逼的开源模块,它能根据你给定的关键词自动绘画。 绘制过程是完全可见的,你可以在 jupyter 页面上看见这个绘制的过程: 一.准备阶段…

零拷贝内存 固定内存

一、总览 虚拟内存是一种计算机内存管理的技术,它让程序认为程序自身有一段完整的连续可用的内存(一个地址空间)。当程序运行时所占的内存空间大于物理空间容量,操作系统可以将暂时不用的数据放入到磁盘,用的时候再拿出…

Linux--高级IO--select--0326

目录 IO为什么低效? 1.快速理解五种IO模式 2.五种IO模型 3.非阻塞IO fcntl() 4.IO多路转接 select select fd_set类型 struct timeval*类型 5.Select的代码测试 5.1 问题一:一开始,我们只有一个listen套接字 5.2 问题二&#xff1…

《项目管理知识体系指南(PMBOK)》第7版之8大绩效域

项目绩效域被定义为一组对有效交付项目成果至关重要的相关活动。 《项目管理知识体系指南(PMBOK)》第7版将项目管理划分为干系人、团队、开发方法和生命周期、规划、项目工作、交付、测量、不确定性共8大绩效域。 一、干系人绩效域 解决与干系人相关的…

【对YOLOv8(ultralytics)打印测试结果的调整】(1)使得map值打印显示从0.551变为55.08 (2)打印出FPS

目录1. 最终打印效果2. 做两处更改2.1 修改map显示,在ultralytics-main/ultralytics/yolo/v8/detect/val.py中操作2.2 打印FPS,在ultralytics-main/ultralytics/yolo/engine/validator.py中操作❗❗❗ 兄弟姐妹们,如果看习惯了运行train.py时…

PMP应该如何备考?

PMP现在是新考纲,PMP新版大纲加入了 ACP 敏捷管理的内容,而且还不少,敏捷混合题型占到了 50%,前不久官方也发了通知 8月启用第七版《PMBOK》,大家都觉得考试难度提升了,我从新考纲考完下来,最开…

Moonbeam隆重推出您的个人开发小助手 — — Kapa.ai

Moonbeam为开发者提供内容详细的开发者文档和全天候的Discord支持。但假如:有人可以24/7查看Discord并在15秒之内就回复您的问题 — — 新推出的Kapa.ai机器人使这个假如成为现实。Kapa.ai是一款由ChatGPT支持的AI机器人,可以回答关于在Moonbeam上构建的…

【redis】单线程redis为什么这么快

本文以收录专栏 redis核心技术 前言 本专栏为了帮助大家更好的了解学习redis,同时也是自己记录学习redis的内容,包含了大部分的redis核心技术,分布式锁,主从复制等 目录 专题2-单线程redis为什么这么快 2.1redis只有单线程吗&a…

剑指offer-替换空格

替换空格一、解题思想二、代码的实现三、总结一、解题思想 题目:请实现一个函数 ,把字符串中的每个空格替换成”%20“。例如:输入”We are happy.“,则输出”We%20are%20happy.“。 看到这个题目,我第一想到的是&#…

博客1:YOLOv5车牌识别实战教程:引言与准备工作

摘要:本篇博客介绍了本教程的目标、适用人群、YOLOv5简介和车牌识别的意义和应用场景。为后续章节打下基础,帮助读者了解YOLOv5和车牌识别的相关背景知识。 正文: 车牌识别视频 引言 欢迎来到YOLOv5车牌识别实战教程!在这个教程中,我们将一步步教你如何使用YOLOv5进行车…

【Git Bash】项目开发过程中需要知道 git stash 的用法

目录1. git stash的应用场景2. 常用git stash命令2.1 git stash2.2 git stash save "message"2.3 git stash list2.4 git stash show2.5 git stash show -p2.6 git stash apply2.7 git stash pop2.8 git stash drop stash{num}2.9 git stash clear3. stash只会保存已…

简单记录一下软著申请流程

模板我就不放了,网上很多,随便下几个结合就行了 总体来说,我是2023.2.19号寄出,2023.4.6看到成功了,总共50天左右。 大家确实不需要网上买那种服务,我也是第一次申请,感觉还是挺简单的。只要按…

洛谷B2038奇偶ASCII值判断

洛谷B2038 题目描述 任意输入一个字符,判断其 ASCII 是否是奇数,若是,输出 YES,否则,输出 NO 。 例如,字符 A 的 ASCII 值是 65,则输出 YES,若输入字符 B(ASCII 值是 66)&#xff0…

从零开始学习Kotlin,带你快速掌握该编程语言

前言 Kotlin是一种跨平台的静态编程语言,它可以在JVM、Android、浏览器、iOS等多个平台上运行。Kotlin的语法简洁易懂,具有高度的可读性和可维护性,同时还具有Java所不具备的许多优点。 Kotlin是一种静态类型、面向对象、函数式编程语言&am…

iOS 项目嵌入Flutter 运行

一 创建Flutter 模块命令行flutter create --template module my_flutter创建完成后,该模块和普通的Flutter项目一直,可以通过Android Studio或VSCode打开、开发、运行;和之前项目不同的iOS和Android项目是一个隐藏文件,并且我们…
最新文章