【问题标题】:Server Side Event with servlets for multiple connected clients用于多个连接的客户端的带有 servlet 的服务器端事件
【发布时间】:2017-01-08 19:58:50
【问题描述】:

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

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

根据我的研究,我有 3 个问题。

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

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

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

【问题讨论】:

    标签: java html servlets jakarta-ee server-sent-events


    【解决方案1】:

    答案

    1. 是的,如果您使用 servlet,则必须有一个无限循环,可能需要休眠。
    2. 同样正确,您将为每个请求使用一个线程,这些线程将成为您的 servlet 容器中的 http 侦听器线程。
    3. 是的,当没有更多的http监听线程时,请求将被拒绝。您可以轻松地在 Tomcat 上拥有 200 个线程,如果您所做的只是休眠并向每个客户端发回一些数据,它可能会工作。

    但是,这听起来不像是我会使用 servlet API 解决的问题,尤其是当您有可能需要扩展超过 200 个客户端时。相反,我会使用端到端 NIO 解决方案,这意味着您不需要每个连接都有一个线程。

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

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

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

    【讨论】:

      【解决方案2】:
      1. 您不需要这样做,只要您在某处保持与客户端的连接,您就可以在给定事件(如连接请求、计时器事件等)发送数据

      2. 这不是真的。 SSE 与异步 servlet 相结合,为多个客户端共享一个连接。

      3. AFAIK(但未进行基准测试),SSE 比任何其他类似替代方案(包括 websockets)更轻。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-17
        • 2015-10-06
        • 1970-01-01
        • 2016-07-06
        • 1970-01-01
        • 2012-12-14
        • 2012-06-15
        • 1970-01-01
        相关资源
        最近更新 更多