默认

IM群聊消息的已读回执功能该怎么实现?

查看数: 231203 | 评论数: 24 | 收藏 15
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-05-23 12:20

正文摘要:

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

评论

moyiran 发表于 12 天前
引用:laojichuxin 发表于 2019-07-26 18:14
消息风暴扩散系数 , 我考虑,能不能做个消息偏移量的处理方式,已读更新消息读取偏移量。

这个方式只指位图吗?例如某一条群聊消息的ack,可以通过位图,给群成员对应的偏移量位置置为1,这样一条消息的ack就只用存储一条了?
69443245 发表于 3 个月前
向各位老师请教一下:
a)  如果群消息存储方案照文中说的,消息存储一份,并为每位用户存储一个last_ack_msg_id
b)  群里依次发送了消息1、2、3,
c)  在推送给某位用户的时候,由于网络问题,该用户只收到3并回复了ack,没有收到1、2,此时服务器会将last_ack_msg_id标记为3,

那对于该用户来说,1、2两条消息不就丢失了吗?

http://www.52im.net/thread-753-2-1.html 中有关于此问题的讨论,但是其中也没有可行的方案。可否有老师指点一二,感谢
JackJiang 发表于 8 个月前
引用:blackheyan 发表于 2024-03-08 15:53
发送方在线时,对于已读回执的发送,真的需要实时推送么?
答:其实不需要,发送方每发一条消息,会收到40 ...

这个看产品定义吧,已读回执实时性要求没那么高,做出的效果差不多就可以了
blackheyan 发表于 8 个月前
发送方在线时,对于已读回执的发送,真的需要实时推送么?
答:其实不需要,发送方每发一条消息,会收到40个已读回执,采用轮询拉取(例如1分钟一次,一个小时也就60个请求),可以大大降低请求量。
======================================================
轮询拉取,一次拉多少条数据是个问题吧?是所有的都拉还是拉取某一段时间的?
Frank 发表于 1 年前
站长威武!
Frank 发表于 1 年前
引用:ZJoker 发表于 2022-11-04 15:28
已读回执的记录写入会不会有问题。群200个人,一个消息来了就要写200个未读回执记录?

可以分批处理,刚发完消息例如5秒内算一批;写入记录也分批算一条写入就可以了.
ZJoker 发表于 2 年前
已读回执的记录写入会不会有问题。群200个人,一个消息来了就要写200个未读回执记录?
吾心_XePPa 发表于 3 年前
引用:dangxy 发表于 2018-09-06 11:24
**** 作者被禁止或删除 内容自动屏蔽 ****

钉钉是打开对话窗口后标记为已读 ,按照笔者的描述是已读 其实应该是已收到信 (钉钉:当不再对话窗口是可以实时收到消息并查看,但并不是已读)
JackJiang 发表于 4 年前
引用:danielstock 发表于 2020-06-08 16:05
群成员表:记录群里的成员,以及每个成员收到的最后一条群消息
group_users(gid, uid, last_ack_msgid);
...

你这种,就应该以客户端记录的last_ack_msgid为准了,不然会把服务端搞复杂
danielstock 发表于 4 年前
群成员表:记录群里的成员,以及每个成员收到的最后一条群消息
group_users(gid, uid, last_ack_msgid);

如果需要支持多种客户端怎么设计呢,比方说需要同时支持手机和pc端,上面这个表是否要改为:
group_users (gid, uid, uid_type, last_ack_msgid)

@JackJiang 谢谢!
JackJiang 发表于 5 年前
引用:laojichuxin 发表于 2019-07-26 18:14
消息风暴扩散系数 , 我考虑,能不能做个消息偏移量的处理方式,已读更新消息读取偏移量。

是的,你的点子不错,而且很符合客户端跟UI的配合实现方式
laojichuxin 发表于 5 年前
消息风暴扩散系数 , 我考虑,能不能做个消息偏移量的处理方式,已读更新消息读取偏移量。
JackJiang 发表于 5 年前
引用:weixiaoyao 发表于 2019-01-04 18:35
写的很清晰,受益良多。
主动轮询回执的流程中,假设1分钟内发了10条消息,那么一次拉取便要获取400个回执 ...

是的,其实回执本身就是消息的冗余分身,不过好在它是专用指令,可以针对性优化,但不管怎么说要实现它会降低整体系统的有效消息吞吐量,这就是代价。谁让老板拍瞎拍脑袋,就做就得做呢
weixiaoyao 发表于 5 年前
写的很清晰,受益良多。
主动轮询回执的流程中,假设1分钟内发了10条消息,那么一次拉取便要获取400个回执数据,相比实时推送虽然大大减少了整体请求数,但可能某次请求会传输较大数据量。根据前面几篇文章的处理方式,此处也可使用分页的方式,虽多了几次请求,但比起推送的方式仍是少的多了。
再一个觉得回执本身就是一个大数据量的业务场景,一个群在线用户N个的系统,平均每群每天M条消息,一天光存储回执就N * M 条数据了,百万在线用户,百条消息,这就日均亿级了
JackJiang 发表于 6 年前
引用:dangxy 发表于 2018-09-06 11:24
这个ack表示的是消息已经到了客户端,但是读没读是用户的行为吧,或者说当消息在屏幕上划过时,才能叫已读 ...

是这个意思
dangxy 发表于 6 年前
这个ack表示的是消息已经到了客户端,但是读没读是用户的行为吧,或者说当消息在屏幕上划过时,才能叫已读吧,前者叫已收,后者叫已读
JackJiang 发表于 6 年前
引用:wucan_dan 发表于 2018-06-15 15:06
一条群消息就一条回执,回执里面用一个字段来存所有已读用户Id集合,这样是否可行?

不可行,如果1000个人已读,那1000个id的集合,这数据量对于一条im协议报文来说算是很大了
wucan_dan 发表于 6 年前
一条群消息就一条回执,回执里面用一个字段来存所有已读用户Id集合,这样是否可行?
只是路过 发表于 6 年前
写的不错

返回顶部