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

dealing with server side event disconnections

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

在客户端 'goes away' 通过浏览器刷新或返回页面等之前,这可以正常工作

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

我不希望事件丢失,但我目前看不到以合理方式解决此问题的方法。

我打算改用网络套接字并使用事件确认模型来解决问题,除非我可以用 SSE 做些什么来防止事件以这种方式丢失。

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

这是我使用的代码:

@route('/stream/events')
def event_stream():
    response.content_type  = 'text/event-stream'
    response.cache_control = 'no-cache'
    # Set client-side auto-reconnect timeout, ms.
    yield 'retry: 1000\n\n'

    while True:
        event = event_queue.get()
        logging.debug("Received event from hal: %s", event)
        yield "data: " + json.dumps(event) + "\n\n"

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

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

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

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

不过你可以想到另一种方案,将 SSE 与另一种机制结合起来,例如:客户端可以在每次收到事件(确认)时发出一个 AJAX 请求。为了最大限度地减少由于连接时间造成的延迟,您可以使用保持活动请求。这取决于你的事件频率,如果每秒发生很多事件就不用管了。

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

我在博客中讨论过这个话题post。

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