我是服务器推送技术的新手。我做了一些研究,了解了服务器发送事件。
我正在实施一个实时监控软件。我的后端是用java servlets构建的。将有大约30到50个浏览器同时保持连接到服务器。
通过我的研究,我脑子里有3个问题。
我是否必须使用无限循环,以便客户端在5秒后不会再次极点,如果我不使用无限循环,它会做什么?
众所周知,服务器为每个传入请求创建一个单独的线程并运行servlet的服务方法,所以如果我在我的servlet中使用无限循环来运行上面第一点所述的过程,那么一次50个连接的客户端。这是否意味着将有50个线程将继续运行?可以说客户端数量会从50增加到100,线程会从50增加到100,依此类推?
如果我在上面的第2点是对的,那么在我的情况下,sse对于实时监控并不好。随着客户端数量的增加,它会耗尽我的服务器资源吗?
答案 0 :(得分:0)
答案
然而,这听起来不像我将使用servlet API解决的问题,特别是如果你有可能需要扩展到超过200个客户端。相反,我会使用端到端的NIO解决方案,这意味着你不需要每个连接一个线程。
你可能想看一下Netty,或RatPack,他们的编程风格与servlet API不同,但它听起来是一个更好的选择。它是事件驱动的,你可以有数千个连接的客户端,你仍然只能使用每个CPU核心1个线程。
如果您选择使用servlet容器,我建议您熟悉Spring框架。实际上可以使用Spring创建一个解决方案,您不必使用http侦听器线程,而是卸载到另一个线程池。
另一种可能的解决方案(因为你的客户端是浏览器)是使用WebSockets,在这里我也会使用Spring Framework。
答案 1 :(得分:0)
您不需要这样做,只要您保持与客户端的连接,您就可以在给定事件(例如连接请求,计时器事件等)上发送数据。 。)
事实并非如此。 SSE与异步servlet结合使用,它们为多个客户端共享一个连接。
AFAIK(但没有基准测试),SSE比任何其他类似的替代品都要轻,包括websockets。
如果您想通过使用JEaSSE库在servlet中查看轻量级SSE的示例,请查看自述文件:https://github.com/mariomac/jeasse