让我们假设这个用例:
鲍勃想评论博客的帖子 他写道:"我是第一个发表评论的人!"。
几毫秒之后,爱丽丝发表了这样的评论:"我是第二个!"。
假设每个发布的评论都通过某种WebSockets显示给其他用户,而不刷新整个页面。
并且假设评论列表应该通过评论的日期asc进行排序。
现在假设发布评论是一个异步过程,这意味着只要用户点击&#34;发送&#34;,列表就会更新其条目,而不是等待服务器处理:< / strong>
如果鲍勃的评论尽管是在爱丽丝之前发送的,但是如果服务员在爱丽丝的评论之后处理(存储)该怎么办?
真正的显示(但在Bob的屏幕上无效)将是:
=&GT;它没有意义......爱丽丝在Bob之后立即键入她的键盘。
将显示整个页面的简单刷新:
对Bob感到困惑!
如果服务器进程是同步的,则不会发生这种情况,这意味着在服务器提交注释后将有效地显示列表。
=&GT;鲍勃会看到爱丽丝的评论出现在他面前,这是一致的。
在这种情况下如何处理异步?
答案 0 :(得分:1)
如果鲍勃的评论不存在,爱丽丝将如何知道她是第二个。
对于这个特定的例子,如果订单与此事无关,我会把它们放在处理订单或到货订单中。这是在大多数博客和您可以发表评论的地方完成的方式。实际上,通常会看到前两个或三个评论声称是第一个:D
现在,如果订单确实相关,您可以使用optimistic concurrency方法。基本上,每次生成页面时,都会添加一个标识注释状态的哈希值;在发送评论时,您也发送该哈希值,如果页面在用户获取页面和插入评论之间没有变化,那么一切都很好,您再次使用新评论和新哈希生成页面;否则,它将返回一个“错误”,它将刷新注释并警告用户该页面已更改,他可能需要在编写注释之前查看页面和当前注释。
更新:
如果您想要更可靠/异步的方法,可以使用vector clocks。但是对于聊天来说似乎有点矫枉过正:),可能会在到达时显示它们就足够了。