繁体   English   中英

Java REST Web服务中的线程

[英]Threading in Java REST web service

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

据信这是由响应生成中的while()循环引起的,通常需要花费几毫秒的时间才能完成,但是在某些情况下则可能需要花费几秒钟。

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

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

谢谢!

乔恩

编辑:

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

看来我的result = get()代码result = get()不断轮询直到出现响应为止,这会消耗更多的CPU资源。 通过将其放置在线程中,可以减少资源消耗。

这是正确的理解吗?

这是正确的理解吗?

不断轮询某些事物直到有响应的循环是非常浪费的。 如果在每个轮询之间添加sleep ,则可以减少CPU使用率,但会以降低单个请求的响应为代价...与以正确方式进行操作相比,这是可以实现的。

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

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

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

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


跟进

...我认为问题在于您的第二点,即服务只是在等待计算。 那么,仅通过线程化此计算即可释放服务中的资源?

如果您所描述的是正确的,则在不同的线程中运行计算不会使计算更快。 实际上,它可能会使速度变慢。

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

我认为您实际上需要做的是弄清楚为什么计算需要这么长时间,然后尝试解决该问题:

  • 您的数据库查询效率低下吗?
  • 获取结果集是否太大?
  • 您的架构有问题吗?
  • 索引选择不正确?
  • 还是您只是在使用错误类型的数据库的小型计算机上尝试执行过多操作?

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

首先,不要试图猜测为什么要消耗这么多的CPU。 放置一些仪器,找出瓶颈的真正位置。 一旦知道瓶颈在哪里,就尝试了解根本原因。 5个为什么要这样做的好方法。

一旦知道了根本原因,请确定它是否可以解决。 例如,如果算法效率低下并且有可用的高效算法,则重构代码以使用高效算法。 不要忘记,根本原因可能是服务器电源不足,需要更大的CPU。

其次,考虑使用http缓存来减少服务器上的负载。 请求的数据多久更改一次,您的响应需要多长时间更新一次? 用它来计算最大寿命; HTTP缓存可以保持响应的时间长度。 可能是1分钟,一天,一周等等,这实际上取决于您要提供的服务。 达到最大使用期限后,请查看传入的请求。在您选择的最大使用期限内,有多少个请求用于相同的URI(或者如果您对它进行了周整,则可以用于同一URI)。 如果在最大使用期限内所有请求URI都是唯一的,那么缓存将无济于事。 如果在最大使用期限内,每个URI平均收到2个请求,那么HTTP缓存将使服务器负载减半。 如果每个URI 10个请求,那么HTTP缓存将减少90%的服务器负载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM