Ajax轮询聊天在快速聊天的消息接收器前端获得重复



我开发了一个javascript聊天(后台的php),使用:

1) long-polling to get new messages for the receiver 
2) sessionStorage to store the counter of messages  
3) setInterval to read new messages and if sessionStorageCounter < setIntervalCounter then the last message is shown to receiver.
4) javascript to create,update and write the chat dialogues

该模块运行良好,但当用户进行快速聊天时,接收方的前端会收到两到三条相同的消息(计数器既没有失败,查询也没有提供双重插入)。

代码似乎是正确的(这就是我不提供代码的原因),所以间隔延迟可能是原因(关于减少间隔延迟,没有任何变化)。

你认为上面的模式是一种糟糕的做法吗?你认为哪种模式可以消除错误?

如果我自己解决它(而不是使用已经处理这个问题的现有库),我的方法是:

  • 让服务器在每条消息到达时为其分配一个唯一的ID(GUID)
  • 在客户端上,存储最近接收到的消息的ID
  • 轮询新消息时,请使用最后一条成功接收到的消息的ID。然后,服务器通过在自己的队列中查找该消息并重播所有后续消息来进行响应
  • 为了防止"丢弃"消息,每条消息还可以携带前一条消息的ID(允许客户端进行一致性检查)

如果重新填充确实会导致从服务器到客户端传递重复项,则每条消息上存在的唯一ID会使消除这些重复项变得微不足道。将服务器端消息队列视为一个事件流,每个客户端都跟踪其最后读取的位置。客户端不会猜测消息的适当顺序、数量等,因为它的状态完全由"我看到了什么"组成,所以几乎没有机会不同步。

由于是实时聊天,setInterval间隔可能很小,可以同时向服务器请求两到三次新消息。请确保服务器处理程序是同步的,并且它忽略来自同一用户的重复查询。

最新更新