在Java中拥有一名“工人”

问题描述 投票:3回答:1

我有一个使用Spark框架在Java中创建的REST API,但是现在正在对请求线程进行大量工作,这会大大降低请求的速度。

我想通过创建某种后台工作程序/队列来解决这个问题,后者将执行请求线程所需的所有工作。来自服务器的响应包含客户端将需要的数据(它将显示的数据)。在这些示例中,客户端是Web浏览器。

Here's what the current cycle looks like

  1. 从客户端到服务器的API请求
  2. 服务器阻止工作;几秒钟/分钟后服务器的响应
  3. 客户收到回复。它具有响应中所需的所有数据

Here's what I would like

  1. 从客户端到服务器的API请求
  2. 服务器在线程外工作
  3. 客户端几乎立即收到来自服务器的响应,但它没有所需的数据。此响应将包含一些ID(整数或UUID),可用于检查正在完成的工作的进度
  4. 客户定期检查正在完成的工作的状态,响应将包含状态(如百分比或时间估计)。工作完成后,响应还将包含我们需要的数据

我不喜欢这种方法,它会使我的API显着复杂化。如果我想获得任何数据,我将不得不提出两个请求。一个用于启动阻塞工作,另一个用于检查状态(并获取阻塞工作的结果)。 API不仅会变得更复杂,而且后端也会变得更复杂。

这是有效的,还是有更好的方法来实现我想要实现的目标?

java multithreading rest spark-framework
1个回答
2
投票

这两种方式都不比另一种方式更有效,因为在任何一种情况下都将完成相同的工作量和工作时间。在第一种情况下,它将在请求线程上完成,客户端将不知道进度,并且只要运行任务,请求将花费多长时间。这让客户等待回复。

在第二种情况下,您需要增加复杂性,但取决于任务,您可以获得进度状态和可能的其他优势。这有回复的客户端民意调查。

您可以使用异步处理来执行非请求线程的工作,但如果您的大多数请求都是长期运行的请求,那么这可能不会有任何区别。因此,由您来决定您想要什么,客户将不得不等待相同的数量。

© www.soinside.com 2019 - 2024. All rights reserved.