【问题标题】:Spawning Threads from a Servlet request从 Servlet 请求中生成线程
【发布时间】:2016-01-31 22:59:30
【问题描述】:

有一个由 servlet 管理的 REST 类型的 Web 服务。

它从数据库中检索大约 1000 种产品及其规格。 这个数据库查询很快。 然后,Web 服务会遍历这 1000 个条目,并针对每个产品规范将其编码为 JSON 字符串。每个 JSON 编码大约需要 10 毫秒。因此,通过 1000 个产品需要 10 毫秒 x 1000 = 10 秒。所以web服务响应很慢。超过 10 秒。

我想知道是否可以使此处理同时进行,因为将每个产品规格格式化为 JSON 字符串是完全独立于一个产品到下一个产品的。所以理论上,如果我创建一个由 4 个线程组成的池,我可以同时为每个线程提供 250 个产品规格并重新格式化为 JSON,并将处理时间减少近 4 个。

这在 servlet 上下文中是如何工作的?我可以从 Servlet 或 Servlet 使用的 POJO 生成线程池吗?由于 Jetty 等 Servlet 容器已经是多线程的,这会不会造成冲突?

谢谢

【问题讨论】:

    标签: java json multithreading servlets


    【解决方案1】:

    这在 servlet 上下文中是如何工作的?

    这真的取决于你的工作量。如果您同时处理许多此类请求,您将看到的收益很少。

    但是,如果您的服务器每分钟可能处理十个查询,那么请确保让所有这些核心工作正常。

    但请记住,您为每个客户端分配了相当多的额外资源,因此您实际上是在用更好的性能换取更低的可扩展性。

    我可以从一个 Servlet 或一个 POJO 中生成一个线程池吗? 小服务程序?

    是的,当然。您不想在使用 EJB 时弄乱线程,但使用 servlet 完全可以。

    由于 Jetty 等 Servlet 容器已经是多线程的,所以 这会导致冲突吗?

    不,一点也不(但请参阅上面我的担忧)。大多数 Web 服务器都是高度线程化的,因为这些线程中的大多数都是 I/O 绑定的,向客户端灌输东西 - 使用非阻塞/事件驱动的 IO,所需的线程数实际上要低得多。

    【讨论】:

    • @Dan,这不是第一个字节的时间问题吗?如果您正在等待将整个数据集编组为 JSON,您的请求将等待相当长的一段时间才能看到结果。
    【解决方案2】:

    如果对所有其他请求者来说服务器使用公平,那么 Web 服务可能会在 10 秒内正常运行。否则,当然,并发(当然是限制线程)。

    这是 ForkJoinPool (java7) 的完美工作。

    仅供参考,我会认真考虑 jvm 分析这个 10 毫秒的 jason 编码...看起来非常长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 2016-02-16
      • 2016-02-07
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      相关资源
      最近更新 更多