java - Java REST Web 服务中的线程

标签 java multithreading web-services rest

我有一个 REST 网络服务,当请求数量过高时,它会消耗过多的 CPU 资源。

这被认为是由响应生成中的 while() 循环引起的,该循环通常需要几毫秒才能完成,但在某些情况下可能需要几秒钟。

根据 this,解决这个问题的方法似乎是使用 wait() 和 notify()但是我不明白为什么这会降低 CPU 使用率?

是否会在 Web 服务之外处理这个新线程,从而腾出它来处理更多请求?有人可以解释一下吗?

谢谢!

乔恩。

编辑:

我可能已经找到了自己的答案 here

看来我的result = get()代码是不停的轮询直到有响应,比较耗cpu资源。通过将其放在线程中,消耗的资源更少。

这样理解对吗?

最佳答案

Is this a correct understanding?

一个不断轮询直到有响应的循环是非常浪费的。如果您在每次轮询之间添加一个 sleep ,您可以降低 CPU 使用率,但代价是降低对单个请求的响应能力……与您正确<可实现的相比/em> 方式。

如果不知道您在做什么(您正在轮询什么,以及为什么),就很难说出什么是最佳解决方案。但这里有几种可能的情况:

  • 如果您的 Web 服务正在等待来自外部服务的响应,那么简单的解决方案就是执行阻塞读取,并为您的 Web 服务器配置更多工作线程。

  • 另一方面,如果您的 Web 服务正在等待计算完成,新线程和等待/通知...或更高级别的同步类之一...可能是答案。

  • 如果您需要并行处理大量此类阻塞请求,那将需要大量线程,因此需要大量内存和其他东西。在这种情况下,您需要考虑一个打破每个请求一个线程约束的 Web 容器。最新版本的 Servlet 规范允许这样做,一些替代(非 Servlet)架构也是如此。


跟进

... I think the issue is your point 2, that the service is simply just waiting for the computation. So, by simply threading this computation will free up resources in the service?

如果您所描述的是真实的,那么在不同的线程中运行计算不会使其运行得更快。事实上,它可能会使速度变慢。

最终的瓶颈将是 CPU 容量、磁盘带宽和/或网络带宽。如果您可以同时有效/高效地对同一请求使用 2 个或更多处理器,则多线程只会使单个请求运行得更快。它只会在允许请求运行而其他人正在等待外部事件的情况下使您的吞吐量更好;例如网络响应到达,或文件读/写操作完成。

我认为你真正需要做的是弄清楚为什么计算需要这么长时间并尝试修复它:

  • 您的数据库查询效率低下吗?
  • 获取的结果集是否太大?
  • 你的模式有问题吗?
  • 索引选择不当?
  • 或者您只是想在一台太小的机器上使用错误类型的数据库做太多事情?

测量应用程序服务和数据库的性能以确定瓶颈所在的技术有多种。 (从谷歌搜索开始......)

关于java - Java REST Web 服务中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9632813/

相关文章:

java - 我怎样才能到达处理程序内的框架标题

android 启动画面/加载画面

multithreading - C#IE BHO : Do work asynchroniously while keeping to the same thread?

c# - 为什么我会得到这个 XML block 的 org.xml.sax.SAXException?

java - 使用 Java 中的 BouncyCaSTLe PGP 实用程序进行增量加密

java - 插入 USB 设备时 Android 应用程序重新启动

java - 没有 xml 的 textview 可点击

java - 为什么要减小 Java JVM 线程栈的大小?

Java转json字符串忽略空值

php - 使用多个参数从 PHP 调用 asp.net Web 服务