带有多个连接客户端的servlet的服务器端事件

时间:2017-01-08 19:58:51

标签: java html5 servlets java-ee server-sent-events

我是服务器推送技术的新手。我做了一些研究,了解了服务器发送事件。

我正在实施一个实时监控软件。我的后端是用java servlets构建的。将有大约30到50个浏览器同时保持连接到服务器。

通过我的研究,我脑子里有3个问题。

  1. 我是否必须使用无限循环,以便客户端在5秒后不会再次极点,如果我不使用无限循环,它会做什么?

  2. 众所周知,服务器为每个传入请求创建一个单独的线程并运行servlet的服务方法,所以如果我在我的servlet中使用无限循环来运行上面第一点所述的过程,那么一次50个连接的客户端。这是否意味着将有50个线程将继续运行?可以说客户端数量会从50增加到100,线程会从50增加到100,依此类推?

  3. 如果我在上面的第2点是对的,那么在我的情况下,sse对于实时监控并不好。随着客户端数量的增加,它会耗尽我的服务器资源吗?

2 个答案:

答案 0 :(得分:0)

答案

  1. 是的,如果你正在使用servlet,你必须有一个无限循环,可能是睡着了。
  2. 同样正确,每个请求将使用一个线程,这些线程将是来自servlet容器的http侦听器线程。
  3. 是的,当没有更多的http侦听器线程时,请求将被拒绝。您可以在Tomcat上轻松拥有200个线程,如果您只是睡眠并向每个客户端发回一些数据,它可能会有效。
  4. 然而,这听起来不像我将使用servlet API解决的问题,特别是如果你有可能需要扩展到超过200个客户端。相反,我会使用端到端的NIO解决方案,这意味着你不需要每个连接一个线程。

    你可能想看一下Netty,或RatPack,他们的编程风格与servlet API不同,但它听起来是一个更好的选择。它是事件驱动的,你可以有数千个连接的客户端,你仍然只能使用每个CPU核心1个线程。

    如果您选择使用servlet容器,我建议您熟悉Spring框架。实际上可以使用Spring创建一个解决方案,您不必使用http侦听器线程,而是卸载到另一个线程池。

    另一种可能的解决方案(因为你的客户端是浏览器)是使用WebSockets,在这里我也会使用Spring Framework。

答案 1 :(得分:0)

  1. 您不需要这样做,只要您保持与客户端的连接,您就可以在给定事件(例如连接请求,计时器事件等)上发送数据。 。)

  2. 事实并非如此。 SSE与异步servlet结合使用,它们为多个客户端共享一个连接。

  3. AFAIK(但没有基准测试),SSE比任何其他类似的替代品都要轻,包括websockets。

  4. 如果您想通过使用JEaSSE库在servlet中查看轻量级SSE的示例,请查看自述文件:https://github.com/mariomac/jeasse