【问题标题】:Server Side Event with servlets for multiple connected clients用于多个连接的客户端的带有 servlet 的服务器端事件
【发布时间】:2017-01-08 19:58:50
【问题描述】:
我是服务器推送技术的新手。我做了一些研究并了解了服务器发送事件。
我正在实施一个实时监控软件。我的后端是用 java servlet 构建的。将有大约 30 到 50 个浏览器同时保持连接到服务器。
根据我的研究,我有 3 个问题。
我是否必须使用无限循环,以使客户端在 5 秒后不会再次执行极点,如果我不使用无限循环,它会这样做吗?
众所周知,服务器为每个传入的请求创建一个单独的线程并运行 servlet 的服务方法,所以如果我在我的 servlet 中使用无限循环来运行上述第一点所述的进程,并且有一次连接 50 个客户端。那么这是否意味着将有 50 个单独的线程继续运行?假设客户端的数量将从 50 增加到 100,线程会从 50 增加到 100 等等?
如果我在上面的第 2 点是正确的,那么 sse 在我的情况下不适合实时监控。随着客户端数量的增加,它会耗尽我的服务器资源吗?
【问题讨论】:
标签:
java
html
servlets
jakarta-ee
server-sent-events
【解决方案1】:
答案
- 是的,如果您使用 servlet,则必须有一个无限循环,可能需要休眠。
- 同样正确,您将为每个请求使用一个线程,这些线程将成为您的 servlet 容器中的 http 侦听器线程。
- 是的,当没有更多的http监听线程时,请求将被拒绝。您可以轻松地在 Tomcat 上拥有 200 个线程,如果您所做的只是休眠并向每个客户端发回一些数据,它可能会工作。
但是,这听起来不像是我会使用 servlet API 解决的问题,尤其是当您有可能需要扩展超过 200 个客户端时。相反,我会使用端到端 NIO 解决方案,这意味着您不需要每个连接都有一个线程。
您可能想看看 Netty 或 RatPack,它们的编程风格与 servlet API 不同,但听起来是更好的选择。它是事件驱动的,您可以连接数以千计的客户端,而每个 CPU 核心仍然只使用 1 个线程。
如果您选择使用 servlet 容器,我建议您熟悉 Spring 框架。实际上可以使用 Spring 创建一个解决方案,您不使用 http 侦听器线程,而是卸载到不同的线程池。
另一种可能的解决方案(因为您的客户端是浏览器)是使用 WebSockets,这里我也会使用 Spring Framework。
【解决方案2】:
您不需要这样做,只要您在某处保持与客户端的连接,您就可以在给定事件(如连接请求、计时器事件等)发送数据
这不是真的。 SSE 与异步 servlet 相结合,为多个客户端共享一个连接。
AFAIK(但未进行基准测试),SSE 比任何其他类似替代方案(包括 websockets)更轻。
如果您想查看使用 JEaSSE 库在 servlet 中实现轻量级 SSE 的示例,请查看自述文件:https://github.com/mariomac/jeasse