在实时评论系统中进行不变排序的好习惯是什么?

时间:2014-11-05 01:58:14

标签: javascript asynchronous architecture websocket real-time

让我们假设这个用例:

鲍勃想评论博客的帖子 他写道:"我是第一个发表评论的人!"。

几毫秒之后,爱丽丝发表了这样的评论:"我是第二个!"。

假设每个发布的评论都通过某种WebSockets显示给其他用户,而不刷新整个页面。
并且假设评论列表应该通过评论的日期asc进行排序。

鲍勃应该看到这个:

  • Bob:我是第一个
  • Alice:我是第二个

现在假设发布评论是一个异步过程,这意味着只要用户点击&#34;发送&#34;,列表就会更新其条目,而不是等待服务器处理:< / strong>

如果鲍勃的评论尽管是在爱丽丝之前发送的,但是如果服务员在爱丽丝的评论之后处理(存储)该怎么办?

真正的显示(但在Bob的屏幕上无效)将是:

  • Alice:我是第二个
  • Bob:我是第一个
但是鲍勃会看到:

  • Bob:我是第一个
  • Alice:我是第二个

=&GT;它没有意义......爱丽丝在Bob之后立即键入她的键盘。

将显示整个页面的简单刷新:

  • Alice:我是第二个
  • Bob:我是第一个

对Bob感到困惑!

如果服务器进程是同步的,则不会发生这种情况,这意味着在服务器提交注释后将有效地显示列表。
=&GT;鲍勃会看到爱丽丝的评论出现在他面前,这是一致的。

在这种情况下如何处理异步?

1 个答案:

答案 0 :(得分:1)

如果鲍勃的评论不存在,爱丽丝将如何知道她是第二个。

对于这个特定的例子,如果订单与此事无关,我会把它们放在处理订单或到货订单中。这是在大多数博客和您可以发表评论的地方完成的方式。实际上,通常会看到前两个或三个评论声称是第一个:D

现在,如果订单确实相关,您可以使用optimistic concurrency方法。基本上,每次生成页面时,都会添加一个标识注释状态的哈希值;在发送评论时,您也发送该哈希值,如果页面在用户获取页面和插入评论之间没有变化,那么一切都很好,您再次使用新评论和新哈希生成页面;否则,它将返回一个“错误”,它将刷新注释并警告用户该页面已更改,他可能需要在编写注释之前查看页面和当前注释。

更新:

如果您想要更可靠/异步的方法,可以使用vector clocks。但是对于聊天来说似乎有点矫枉过正:),可能会在到达时显示它们就足够了。