Java REST Web服务中的线程化

use*_*196 1 java rest multithreading web-services

我有一个REST Web服务,当请求数量太高时,它会消耗太多的CPU资源.

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

对此问题进行修复似乎是根据使用的wait()和notify()这个,但是我不明白为什么这会降低CPU的使用率?

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

谢谢!

乔恩.

编辑:

我可能在这里找到了自己的答案

似乎我的代码result = get()不断轮询,直到有响应,消耗更多的CPU资源.通过将其放在线程中,可以消耗更少的资源.

这是正确的理解吗?

Ste*_*n C 5

这是正确的理解吗?

一个不断轮询某事直到有反应的循环是非常浪费的.如果sleep在每次轮询之间添加一个,则可以降低CPU使用率,但代价是降低单个请求的响应速度...与正确执行此操作相比可实现的效果.

如果不确切知道自己在做什么(轮询是什么以及为什么),那么说出最佳解决方案有点困难.但这里有几种可能的情况:

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

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

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


跟进

...我认为问题在于你的观点2,即服务只是在等待计算.那么,通过简单的线程化,这个计算将释放服务中的资源?

如果你所描述的是真的,那么在另一个线程中运行计算将不会使它更快.事实上,它可能会变慢.

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

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

  • 您的数据库查询效率低下吗?
  • 获取的结果集太大了吗?
  • 你的架构有问题吗?
  • 指数选择不佳?
  • 或者你只是试图在使用错误类型的数据库太小的机器上做太多?

存在用于测量应用服务和数据库的性能的各种技术以确定瓶颈的位置.(从谷歌搜索开始......)