Ajax 轮询聊天在快速聊天的消息接收者前端获取重复项

Ajax polling chat gets duplicates at message receiver front-end on speedy chat

我开发了一个 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

该模块工作正常,但是当用户进行 speedy 聊天时,接收者的前端会收到两到三个相同的消息,(既没有计数器失败,也没有查询提供双插入)。

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

您认为上述模式是否是一种不好的做法,您认为哪种模式可以消除错误?

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

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

如果重新轮询确实导致重复项从服务器传送到客户端,则每条消息上存在的唯一 ID 使得消除它们变得微不足道。将服务器端消息队列想象成一个事件流,每个客户端跟踪它们的最后读取位置。客户端不会猜测消息的适当顺序、消息的数量等 - 因为它的状态完全由 'what have I seen' 组成,所以很少有机会不同步。

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