【问题标题】:Bad practice to wait for service to return?等待服务返回的坏习惯?
【发布时间】:2013-08-16 10:54:22
【问题描述】:

我正在调用一个 Spring Web 服务,它需要大约 5 秒才能返回响应。 webservice 调用在部署到 websphere 之前发生在 Tomcat 容器中。 另一位开发人员告诉我,对这个服务的调用应该在一个单独的 java 线程中处理,因为它“让 JVM 在一行代码上停留太久的坏习惯”在这种情况下它停留在调用 Web 服务的代码。我不同意并认为如果 Web 服务需要 5 或 10 秒才能完成,那很好,将收到响应并且代码执行将照常继续。我说的对吗?

【问题讨论】:

  • 是否有任何服务水平协议或非功能性要求指定响应时间?
  • @incomplete-co.de 不,5 - 10 秒是可接受的响应时间。所描述的“不良做法”的论点是技术性的,尽管我无法获得更多详细信息
  • @nos 什么只发生一次?
  • 嗯,JVM 本身是多线程的,而您在 tomcat 中的应用程序也是多线程的。通过将执行推送到另一个线程,您正在阻塞另一个线程。没有区别。如果您不需要异步行为,则没有理由将其设为异步。
  • @nos 它发生不止一次,每天大约 3000 次

标签: java multithreading spring tomcat websphere


【解决方案1】:

我想说两点:

  1. 如果后续计算依赖于该 Web 服务的结果,那么无论如何您都别无选择,产生新线程只是浪费资源;

  2. 如果此调用完全独立,则可能有充分的理由将其卸载到单独的线程。即使五秒钟本身并不多,这可能不是(现在或将来您的代码库的)系统毫无意义地等待独立任务完成的唯一时间点。 让独立任务独立运行是一种普遍的好习惯。

但是,如果您的调用是在部署到 Tomcat 容器中的应用程序中发生的(这个细节在您的问题中并不完全清楚),那么生成 Web 应用程序通常是一种不好的做法它自己的子线程。任务应该提交给容器提供的执行器服务(如果有的话)。

【讨论】:

    【解决方案2】:

    同步调用 web 服务是个坏主意,它可能在集成或测试环境中工作,但响应会随着系统负载的增加而呈指数增长。你应该看看某种异步通信。

    在我们的项目中,我们习惯了很多同步通信,都被重写为异步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多