在工作中,我们目前正在构建支持SSE
的网络应用程序。
我们对SSE
都比较新,所以我们处理很多(新手)问题:
当客户端关闭浏览器时,我们最终会断开连接。有人称之为鬼连接。
我们如何在服务器端检测此类连接?我们希望从通知列表中删除这些客户端。
我理解每个' SSE-connection
'在application server
上保持活着。
当我关闭我的开发服务器时,我直接注意到浏览器调试器上的连接感觉消失了。
我们不应该设置一些连接上限吗? The application server
连接会在一段时间内耗尽...
此外,某些服务器为每个请求专用一个线程。这可能导致一些线索问题...
整个SSE-broadcasting
应该由application server
管理(大多数请求与业务相关),还是应该由一些完全专门用于处理web server
的{{1}}管理}?目前,所有业务请求和SSE事件均由SSE-event
Jboss
处理。
如何在应用主动 - 主动模式的群集环境中管理SSE
(= master-master)请求在实例之间随机路由?
如果您有更多有用的信息(以及需要注意的注意事项),请随时分享!
答案 0 :(得分:0)
集群环境
管理服务器发送事件应用程序与管理传统Web应用程序没有太大区别。您可以使用负载平衡器来正确管理群集环境,并实现自动扩展机制,以在达到实例限制时继续提供连接。
您应该注意的最重要的一点是确保您使用的代理可以使您的连接几乎无限期地保持打开状态:HAProxy和NGINX是很好的候选者。
限制连接数量
某些服务器回收线程(例如Undertow),有些则没有。一旦您知道您选择的服务器如何处理线程,您就可以计算每个实例的限制。
应用程序或网络服务器
除非管理“经典”业务相关请求的应用程序服务器已被大量使用,否则无需专用服务器来管理SSE事件。
断开的连接
关于断开的连接,您可以通过定期发送通常称为“心跳”的内容来测试它们:如果连接已被客户关闭,则会返回错误的空消息。
答案 1 :(得分:0)
集群环境
我觉得你的意思是
在这种情况下,我认为您需要区分需要从客户端获取的内容以及需要从后端推送的内容。通常需要推送的是实时通知或更新。但是许多其他电话可以用经典方式提取。对于从客户端提取的所有内容,只要您的后端是无状态,那么您就可以了。
对于推送的所有内容,我将如何做到: 打开浏览器应用程序(客户端)时,它会创建与其中一个后端实例的SSE连接。你不能保证它是哪一个。后端应每隔X秒向客户端发送一次心跳。如果客户端停止接收心跳,那么他可以假设后端已关闭。然后,它可以重新创建SSE连接。但是您可能已经丢失了通知...为了避免这种情况,您可以使用时间戳或通知ID,并在重新创建连接时传递该时间戳或ID以从中获取所有后续通知。
在您的后端下,您需要某种订阅系统来连接消息总线或代理。这样每个后端都会收到通知并尝试将它们推送到连接的客户端。
限制连接数量
通过上面的设计,您可以通过简单地删除创建的第一个连接来限制每个后端的连接数。然后,客户端将重试与潜在的新后端实例建立连接。这可能不是“干净”但可能有用......
断开的连接
参见Audrey的回答,这是使用心跳的经典方式:)
应用程序或网络服务器
我认为这个问题会产生自以为是的答案。对我来说,我会说“亲吻”(保持简单愚蠢)