处理服务器端事件断开连接

时间:2015-08-19 09:48:39

标签: python bottle server-sent-events

我有一个简单的python bottle应用程序,它向javascript侦听器发出SSE事件。

在客户通过浏览器刷新或回页等“离开”之前,这种方法没有问题。

由于应用程序中的事件已传递然后从内部队列中删除,因此当服务器尝试将它们发送到不再存在的客户端时,会丢失一个或两个事件。

我不希望事件丢失,但我目前无法以合理的方式找到解决方法。

我打算转而使用Web套接字并使用事件 - 确认模型来解决问题,除非我可以使用SSE来防止事件以这种方式丢失。

在我看来,SEE可能不是为我的特定用例而设计的。

以下是我正在使用的代码:

regex1 = /\A[a-z0-9\-\_]+\z/

regex2 = remove_anchors(regex1) # => /[a-z0-9\-\_]+/

可以在此处找到我的问题解决方案的链接。当客户端离开时,它使用弱检测“detect”,以及每个SEE连接的单个队列:http://blog.jason.spashett.com/python-bottle-server-side-events-one-way-to-handle-client-disconnects.html

2 个答案:

答案 0 :(得分:3)

您需要在服务器上保留事件,以便在重新连接或页面刷新时可以检索它们。

我在博文中谈到这个主题。

http://bayn.es/real-time-web-apps-with-server-sent-events-pt-2/

答案 1 :(得分:1)

SSE(服务器发送事件,HTML 5规范的一部分)就像一个无线电广播:一旦发出事件,服务器就会忘记它们。

这是从服务器向客户端发送信息的一种非常好的方式,但它只是单向的

由于无法可靠地检测客户端断开连接,在您的使用案例中,可能的解决方案确实是按照您的建议进行一种确认。 Web套接字可以做到这一点,因为它是一种双向通信技术。

但是,您可以考虑将SSE与其他机制相结合的另一种方案,例如:客户端可以在每次收到事件(确认)时发出AJAX请求。为了最大程度地减少因连接时间而导致的延迟,您可以使用保持活动请求。这取决于您的活动频率,如果每秒发生大量事件,请忘记这一点。