【自问自答】Web IM 消息收发消息的频率如何控制呢?

如何设计消息频率,可以让用户体验(实时性、可靠性、完整性)与服务器压力达到一个完美的平衡?

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。


回答:

我们实现消息功能一般有两种做法

  1. websocket(双向)
  2. ajax 轮询(客户端主动)

    1. 长轮询
    2. 定时轮询

为了时效问题,我们肯定会上 websocket 的,这样有了新消息服务端可以主动推送。

但是因为 websocket 的一些问题,比如说应答机制、兼容性等等,我们其实还会有一套基于 http 的降级服务。当然,也会对 websocket 进行一些包装,扩展 timeout、应答、重发等多种逻辑。

这里我们会使用推拉结合架构

推拉结合是一种网络传输架构模式,它结合了推送和拉取两种方式,可以实现实时性和可靠性的平衡。
在推拉结合模式中,服务器会推送一些关键性数据给客户端,以保证数据的实时性。同时,客户端也会定期向服务器发送请求,拉取数据更新,以保证数据的可靠性和完整性。这样,在数据实时性和可靠性之间达到了一种平衡。
举例来说,在一个在线游戏中,服务器会向客户端推送一些关键性数据,如角色位置、状态等,以保证游戏的实时性。而客户端会定期向服务器发送请求,拉取其他玩家的状态、地图等数据,以保证游戏的可靠性和完整性。
推拉结合模式常用于实时应用程序,如即时通讯、在线游戏、股票行情等领域。它能够充分利用推送和拉取两种方式的优点,实现数据的实时性和可靠性的平衡。

然后我们会对于一些极端情况做处理

  1. 30s 没有收到推送,就主动拉取一下
  2. 2s 中的多次拉取,会合并为一次拉取
  3. 一些特殊的应答机制,比如说客户端拉取了那些消息。避免出现丢消息等问题。
  4. 基于服务端做10天+1000条数据缓存,留给客户端主动补数据。

经过上面的方案,我们就可以实现一个实时的、可靠的im消息了

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

以上是 【自问自答】Web IM 消息收发消息的频率如何控制呢? 的全部内容, 来源链接: utcz.com/p/933852.html

回到顶部