默认
发表评论 19
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
请教大佬,IM中聊天消息msgid是由客户端生成还是服务端生成?
阅读(50081) | 评论(19 收藏 淘帖1
大佬们,请教下:

发送消息的时候,msgid是client-A发给服务器的时候,client-A就已经把msgid生成好了直接发给im-server服务器?

还是服务器收到client-A的消息之后,服务器把消息保存到数据库后,生成一条msgid,然后服务器给clent-A发送一个ack应答包,ack应答包里包含服务器生成的msgid,大佬更推荐哪种方案呢?

我们在会议上从这一步出现了分歧:客户端一致认为 是服务端保存消息到数据库后,拿到插入的数据id当做msgid回传给客户端,这样可以保证client-A和client-B之间重试发送消息的时候 两个client之间都知道发送的是同一条数据,这样可以保证2个客户端之间的数据一致性,然后客户端和服务端之间的分歧就这么产生了

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:Android端处理接收的IM消息过慢导致消息丢失,客户端到底该如何处理大量接收呢?下一篇:求助,IM离线消息在什么情况下保存比较合适呢?

本帖已收录至以下技术专辑

推荐方案
评论 19
这个im的通信底层,是你们自已从零开发的?没有经验的话,会走很多弯路啊。

这个id,放在客户端生成最合理,如果你同事不信的话,可以看看微信是怎么做的《IM消息ID技术专题(一):微信的海量IM聊天消息序列号生成实践(算法原理篇)
引用:JackJiang 发表于 2020-09-24 14:37
这个im的通信底层,是你们自已从零开发的?没有经验的话,会走很多弯路啊。

这个id,放在客户端生成最合 ...

客户端和服务端应该都是基于通信框架来开发的,不过服务端是php,服务端和客户端之间用的是websocket协议
引用:wzyl 发表于 2020-09-24 14:52
客户端和服务端应该都是基于通信框架来开发的,不过服务端是php,服务端和客户端之间用的是websocket协议

然后还得逼着你们客户端这边,再费劲巴拉的去找支持WebSocket库,原本是为Web端准备的WebSocket协议。。。。哈哈
引用:JackJiang 发表于 2020-09-24 14:55
然后还得逼着你们客户端这边,再费劲巴拉的去找支持WebSocket库,原本是为Web端准备的WebSocket协议。。 ...

额 实在是木有办法啊,我们客户端还有个浏览器端,浏览器的话貌似只能使用websocket协议了
引用:wzyl 发表于 2020-09-24 14:56
额 实在是木有办法啊,我们客户端还有个浏览器端,浏览器的话貌似只能使用websocket协议了

最low的办法都是这样的。最佳实践就是服务端支持不同协议的接入,必竟app原生代码,tcp udp协议久经考验,技术资源丰富
引用:JackJiang 发表于 2020-09-24 15:10
最low的办法都是这样的。最佳实践就是服务端支持不同协议的接入,必竟app原生代码,tcp udp协议久经考验 ...

一语惊醒梦中人= = 醍醐灌顶
顶群主
签名: 该会员没有填写今日想说内容.
引用:JackJiang 发表于 2020-09-24 14:37
这个im的通信底层,是你们自已从零开发的?没有经验的话,会走很多弯路啊。

这个id,放在客户端生成最合 ...

大佬,弱弱的问一句 客户端生成的msgid你会保存到聊天记录表里面吗?一条消息对应一条msgid,这样客户端在拉取离线消息的时候方便去重

但是这样有个问题,如何保证android和ios两个不同的客户端在生成msgid的时候不会出现生成一样的呢?

或者说这个msgid你会不会保存呢?如果不保存的话,那客户端在拉取离线消息的时候,通过啥来去重呢?
引用:wzyl 发表于 2020-09-25 08:50
大佬,弱弱的问一句 客户端生成的msgid你会保存到聊天记录表里面吗?一条消息对应一条msgid,这样客户端 ...

你的问题,其实是有一个全局唯一的msgid就不存在问题。我建议你们起步不需要搞的这么高端,直接用UUID来作msgid。全局唯的情况下,你就随便存了。
引用:JackJiang 发表于 2020-09-25 11:19
你的问题,其实是有一个全局唯一的msgid就不存在问题。我建议你们起步不需要搞的这么高端,直接用UUID来 ...

用UUID来生成客户端发送消息的msgid,这样客户端给服务端发送消息的时候,服务端也保存这个msgid到对应的聊天表里 ,一条消息对应一条msgid,这样客户端无论是在线去重还是拉取离线消息的时候去重,都会有一个一条消息对应的msgid,是这个意思吧
引用:wzyl 发表于 2020-09-25 11:27
用UUID来生成客户端发送消息的msgid,这样客户端给服务端发送消息的时候,服务端也保存这个msgid到对应的 ...

是的

明白了 感谢大佬
肯定要服务端生成啊, 而且还得自增,可以不连续。 要不然客户端怎么判断消息列表从哪里继续
引用:magicnana999 发表于 2020-11-12 10:56
肯定要服务端生成啊, 而且还得自增,可以不连续。 要不然客户端怎么判断消息列表从哪里继续

话一说,就知道是个大佬
引用:JackJiang 发表于 2020-11-12 11:27
话一说,就知道是个大佬

啊这
引用:magicnana999 发表于 2020-11-12 10:56
肯定要服务端生成啊, 而且还得自增,可以不连续。 要不然客户端怎么判断消息列表从哪里继续

感谢提供思路~
msgid肯定客户端生成,排序用,服务端提供消息的全局唯一id和消息序号就好
引用:风吹 发表于 2020-11-27 18:14
msgid肯定客户端生成,排序用,服务端提供消息的全局唯一id和消息序号就好

明白了,谢谢大佬
引用:风吹 发表于 2020-11-27 18:14
msgid肯定客户端生成,排序用,服务端提供消息的全局唯一id和消息序号就好

客户端生成的id大多是为了防止重复,排序还得以服务端生成的id
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部