【自问自答】Web IM 消息收发消息的频率如何控制呢?
如何设计消息频率,可以让用户体验(实时性、可靠性、完整性)与服务器压力达到一个完美的平衡?
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
回答:
我们实现消息功能一般有两种做法
- websocket(双向)
ajax 轮询(客户端主动)
- 长轮询
- 定时轮询
为了时效问题,我们肯定会上 websocket 的,这样有了新消息服务端可以主动推送。
但是因为 websocket 的一些问题,比如说应答机制、兼容性等等,我们其实还会有一套基于 http 的降级服务。当然,也会对 websocket 进行一些包装,扩展 timeout、应答、重发等多种逻辑。
这里我们会使用推拉结合架构
推拉结合是一种网络传输架构模式,它结合了推送和拉取两种方式,可以实现实时性和可靠性的平衡。
在推拉结合模式中,服务器会推送一些关键性数据给客户端,以保证数据的实时性。同时,客户端也会定期向服务器发送请求,拉取数据更新,以保证数据的可靠性和完整性。这样,在数据实时性和可靠性之间达到了一种平衡。
举例来说,在一个在线游戏中,服务器会向客户端推送一些关键性数据,如角色位置、状态等,以保证游戏的实时性。而客户端会定期向服务器发送请求,拉取其他玩家的状态、地图等数据,以保证游戏的可靠性和完整性。
推拉结合模式常用于实时应用程序,如即时通讯、在线游戏、股票行情等领域。它能够充分利用推送和拉取两种方式的优点,实现数据的实时性和可靠性的平衡。
然后我们会对于一些极端情况做处理
- 30s 没有收到推送,就主动拉取一下
- 2s 中的多次拉取,会合并为一次拉取
- 一些特殊的应答机制,比如说客户端拉取了那些消息。避免出现丢消息等问题。
- 基于服务端做10天+1000条数据缓存,留给客户端主动补数据。
经过上面的方案,我们就可以实现一个实时的、可靠的im消息了
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
以上是 【自问自答】Web IM 消息收发消息的频率如何控制呢? 的全部内容, 来源链接: utcz.com/p/933852.html