群聊消息的收发流程、消息送达保证、已读机制

微信扫一扫关注!

本文引用建筑师之路公众号作者沉健的文章。即时通讯网络对内容进行了更改。感谢原作者。

1、前言

我们平时在使用即时通讯应用的时候,每当我们发出聊天消息时,都希望对方能尽快看到并尽快回复,但对方真的看到了吗?我不知道。

一个残酷的现实是,很多时候对方其实已经看到消息很久了,但由于种种原因(大家都明白)怎么查询一年前的微信聊天记录,他们通常都是默默地回——假装没看到(如下图)的感觉——简单直接,冷酷无情)。

timg.jpeg

▲“读不懂”,你是这样的人吗?

在产品设计理念上,微信等熟人社交工具不提供在线状态、阅读回执等隐私相关功能,以维护用户隐私。里面没有消息“读取”功能吗?”。但是很多时候,尤其是商务办公场合,特别需要一个反馈能力强的工具,这对打造高效团队很有帮助(虽然员工很反感,但是老板很喜欢这样的功能,哈哈)。

目前市面上主流的手机IM中,提供阅读回执的主要有阿里的钉钉、网易的易信、阿里的旺旺,如下图:

22.jpg

11.jpg

33.jpg

▲ 上图从左到右:钉钉、宜信、旺旺(千牛)

以阿里的钉钉为例。钉钉的产品定位是用于商务沟通。其“必读回执”功能,让职场人“假不在线”“假不收”无所遁形。更重要的是,钉钉的“强制阅读回执”功能甚至可以知道谁读了消息,谁没有读到消息(老板的福音)。

那么如何实现群聊消息收发流程、消息传递保障、阅读回执机制呢?这就是今天要讨论的话题。

退出微信聊天群记录怎么恢复_怎么查询一年前的微信聊天记录_微信怎么发记录聊天

推荐阅读:《从存储空间的角度谈IM群聊消息的已读和未读功能的实现》。

2、IM开发干货系列文章

本文是系列文章的第 14 篇。一般内容如下:

更多群聊技术文章:

另外,如果您是IM开发的初学者,强烈建议您先阅读《初学者指南就够了:从零开始开发手机IM》。

3、简介

首先,我们需要了解组消息的设计、传递过程和可达性保证机制。因为不是本文的重点,我们尽量简明扼要。有关更多详细信息,请参阅下面的推荐文章列表。

如果您对聊天消息的发送和发送机制不了解,可以先阅读本系列的以下文章,帮助您详细掌握这方面的内容:

4、如何设计群消息?

下面我们就跟着楼主的步伐,一步一步来看如何设计群发消息。

核心问题1:群发消息只有一份?或者,每个成员保存一份?

答:保留一份,为每个成员建立一个群消息队列。会有大量的数据冗余,这是不合适的。

核心问题2:如果只有一个群消息,你怎么知道每个成员都阅读了哪些消息?

答:可以用群消息的偏序关系来记录每个成员的()。此消息之前的消息已被阅读,而此消息之后的消息尚未被阅读。这种解决方案意味着对于组中的每个用户,只需要记录一个值。

回答完以上两个核心问题,就很容易得到群消息的核心数据结构了。

怎么查询一年前的微信聊天记录_退出微信聊天群记录怎么恢复_微信怎么发记录聊天

群消息表:记录群消息

(msgid, gid,, 时间, );

每个字段的含义是:消息ID、组ID、发送者UID、发送时间、发送内容。

群成员表:记录群内成员及每个成员最后收到的群消息

(gid, uid, );

每个字段的含义是:群ID,群成员UID,群成员最后收到的群消息ID。

5、了解群发消息流程

核心数据结构设计好后,我们来看看群消息发送的过程(本系列文章《IM群聊消息这么复杂,如何保证不丢失不重复?》对这个过程进行了说明详细,你可以深入阅读。)。

业务场景:

1.jpg

整个消息发送流程1-4如上图所示:

在这个过程中,只要完成了消息登陆的第二步,就可以保证群消息不会丢失。

核心问题三:如何保证接收方一定能收到群消息?

答:每收到一条消息后,需要修改每个群的成员,告诉系统确认收到消息。

在线消息和离线消息的修改是不同的。

微信怎么发记录聊天_怎么查询一年前的微信聊天记录_退出微信聊天群记录怎么恢复

2.jpg

对于在线群友,收到群消息后,会第一时间确认并修改。

3.jpg

对于离线群友,下次登录时,所有未读的离线群消息将被拉取并修改为最新的。

核心问题4:如果ack丢了,群友会拉重复的群消息吗?

答:可以,根据msgid可以在客户端本地完成。即使在系统层面收到重复消息,仍然可以保证良好的用户体验。

以上过程只能保证接收方收到消息。发件人仍然不知道谁在线阅读了邮件,谁没有离线阅读邮件,也没有实现已读回执。已读回执对系统设计有何影响?影响如何?

6、已读回执流程的设计

我们已经了解了上一节中的基本知识。在本节中,我们将讨论本文的重点内容,即如何设计群聊的阅读回执流程。

对于发送者发送的任何群消息,都需要知道有多少人阅读了这条消息,有多少人没有阅读过这条消息,需要一个基本的表来记录这种关系。

消息回执表:用于记录消息的已读回执

(, msgid,, gid,);

每个字段的含义是:发件人UID、消息ID、回执UID、组ID、回执标记。

添加阅读回执逻辑后,群消息的流程会略有变化,如下图所示:

4.jpg

微信怎么发记录聊天_退出微信聊天群记录怎么恢复_怎么查询一年前的微信聊天记录

然后,收到消息后,除了:

此外,您还需要:

5.jpg

收件人修改后的流程将变为:

如果发件人不在线,他将在下次登录:

这里的初步结论是:

7、已读回执流程优化方案

再详细分析下,群消息阅读回执的“消息风暴扩散系数”,假设每个群有200个用户,20%的用户在线,也就是40个用户在线。

那么,每次群用户发送群消息时,都会有:

可见其新闻风暴扩散系数非常大。

同时:

随着群组数量、群组好友数量、群组消息数量的增加,存储也会成为问题。

有优化计划吗?

群消息推送可以改成接收者的轮询拉吗?

答:不可以,消息接收和实时性能是核心指标。

退出微信聊天群记录怎么恢复_微信怎么发记录聊天_怎么查询一年前的微信聊天记录

对于修改,我真的需要确认每条群消息吗?

答:其实没有必要。可以批量确认,接收N组消息(例如10条),然后向服务器发送修改请求。同时修改本次请求之前所有请求的读回执,使40次发送到服务器的ack请求数减少到原来的1/10。

它会带来什么副作用?

答:功能是记录接收方最近取到的一条群消息。如果不是实时更新,可能会导致一些群消息在异常退出前被更新,这样下次登录时会得到重复的群。信息。但这不是问题,客户端可以根据msgid去重,不影响用户体验。

发件人在线时,真的需要实时推送已读回执吗?

答:其实没必要。发件人每次发送消息时,都会收到 40 条已读回执。使用轮询(例如每分钟一次,每小时 60 个请求)可以大大减少请求量。

(画外音:或者直接放在应用层请求中,实现0附加请求增加。)

它会带来什么副作用?

答:已读回执不是实时更新的。在最坏的情况下,更新收据需要 1 分钟。当然怎么查询一年前的微信聊天记录,这个轮询时间可以配置为基于性能和产品体验的折衷方案。

如何减少数据量?

答:收据数据不是核心数据

8、本文摘要

对于群消息已读回执,一般来说:

如果你想优化,你可以:

物理删除已读回执数据,定期删除或归档非核心历史数据。

(原文链接:点此进入,有改动)