有一个"工人"在Java中

时间:2017-12-22 23:40:51

标签: java multithreading rest spark-framework

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

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

这是当前周期的样子

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

    1. 从客户端到服务器的API请求
    2. 服务器可以在线程外工作
    3. 客户端几乎立即收到来自服务器的响应,但它没有所需的数据。此响应将包含一些ID(整数或UUID),可用于检查正在完成的工作的进度。
    4. 客户定期检查正在完成的工作的状态,响应将包含状态(如百分比或时间估计)。工作完成后,响应还将包含我们需要的数据
    5. 我不喜欢这种方法,它会使我的API大大复杂化。如果我想获得任何数据,我将不得不提出两个请求。一个用于启动阻塞工作,另一个用于检查状态(并获取阻塞工作的结果)。 API不仅会变得更复杂,而且后端也会变得更复杂。

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

1 个答案:

答案 0 :(得分:2)

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

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

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