Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 如何避免连接到comet服务器时丢失web推送通知_Design Patterns_Web Applications_Comet - Fatal编程技术网

Design patterns 如何避免连接到comet服务器时丢失web推送通知

Design patterns 如何避免连接到comet服务器时丢失web推送通知,design-patterns,web-applications,comet,Design Patterns,Web Applications,Comet,我想知道如何确保客户端在加载页面或连接到comet服务器时不会错过推送事件 例如,考虑这个时间线: ... Request web page . Receive response . render page . execute javascript to connect to comet server . connection established + + (receiving comet events) + Request another web page . Receive respons

我想知道如何确保客户端在加载页面或连接到comet服务器时不会错过推送事件

例如,考虑这个时间线:

...
Request web page
.
Receive response
.
render page
.
execute javascript to connect to comet server
.
connection established
+
+ (receiving comet events)
+
Request another web page
.
Receive response
.
execute javascript to connect to comet server
.
connection established
+
+ (receiving comet events)
+
显然,在a+标记的时间段内,客户机可以接收来自comet服务器的事件。但是,在其他时间内,没有连接,因此用户将如何接收这些时间内发生的事件

是否有人有任何设计模式或架构建议来确保事件不会错过


提前感谢。

拥有comet调用从中读取的每会话消息队列。新事件进入队列,并在客户端连接时等待。根据您的体系结构和规模,这可以是web应用程序本身中的简单队列、数据库中的表或单独的消息队列。您可以在交付时将其删除。

通用解决方案 在使用Comet服务器时,将客户端标志设置为它接收的每个事件都“已看到”

问题 如果每个客户端都需要响应每个通知,则到服务器的流量可能会显著增加。因此,您的服务器性能和网络可能会受到影响

您的解决方案可能会考虑其他事项,如事件顺序

解决问题 您必须采用的解决方案将取决于对此类事件的了解对应用程序的重要性。如果客户端能够按照预期工作,甚至丢失一些事件,那么考虑一个更轻松的解决方案。
  • 立即回答每个事件
  • 无论何时从服务器接收到事件,都要求服务器将其标记为“已看到”。如果服务器已发送事件且未标记为可见,请确保将其重新发送到客户端。由于网络延迟(当您的服务器在收到确认消息之前第二次发送同一事件时,第一次已到达),请注意不要多次(在客户端)处理同一事件

  • 放松的方法
  • 当客户端接收到事件时,将其存储为“最后接收的事件”。每当客户端重新连接时,请服务器再次发送自上次存储以来错过的事件。如果您不知道哪一个是“最后接收的事件”,请确保服务器重新传输从对客户端有意义的点开始


    这些想法可以使用Comet服务器上的队列来实现,但一定要正确实现。如果这些事件的顺序很重要,那么您必须在实现时确保它。请确保不要制造巨大的队列或不确定的队列。考虑其他方面。

    希望我能帮忙