0

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

例如,考虑这个时间线:

...
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)
+

显然,在以 + 标记的时间段内,客户端可以接收来自彗星服务器的事件。但是,在其他时间,没有连接,那么用户将如何接收在这些时间发生的事件?

有没有人有任何设计模式或架构建议来确保不会错过这些事件?

提前致谢。

4

2 回答 2

0

通用解决方案

当您使用 Comet 服务器时,请将客户端标记为“已看到”它接收到的每个事件。

问题

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

其他事情,因为您的解决方案可能会考虑事件排序。

解决问题

您必须采用的解决方案将取决于您的应用程序对此类事件的认识有多重要。如果客户端即使错过了其中一些事件也能够按预期工作,请考虑更轻松的解决方案。

  1. 立即回答每个事件

每当您收到来自服务器的事件时,要求服务器将其标记为“已看到”。如果服务器已发送事件但未标记为已看到,请确保将它们重新发送到客户端。由于网络延迟(当您的服务器在收到第一个确认之前第二次发送相同的事件时),请注意不要多次(在客户端)处理相同的事件。

  1. 轻松的方法

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


这些想法可能会使用 Comet 服务器上的队列来实现,但请确保正确实现它。如果这些事件的顺序很重要,您必须在您的实施中保证它。确保不要创建巨大的队列或无限多的队列。还要考虑其他方面。

希望我有所帮助。

于 2013-04-24T23:22:07.767 回答
0

有一个彗星呼叫从中读取的每会话消息队列。新事件进入队列并在客户端连接时等待。根据您的架构和规模,这可以是 Web 应用程序本身中的简单队列、数据库中的表或单独的消息队列。您可以在交付时删除它们。

于 2013-04-24T15:53:44.617 回答