2

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

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

这是当前周期的样子

  1. 从客户端到服务器的 API 请求
  2. 服务器做阻塞工作;几秒/分钟后来自服务器的响应
  3. 客户端收到响应。它包含响应中所需的所有数据

这就是我想要的

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

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

这是有效的,还是有更好的方法来实现我想要完成的事情?

4

1 回答 1

2

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

在第二种情况下,您需要增加复杂性,但您会根据任务获得进度状态和可能的其他优势。这让客户对回复进行轮询。

您可以使用异步处理在非请求线程上执行工作,但如果您的大多数请求都是长时间运行的请求,这可能不会有任何区别。因此,由您决定您想要什么,客户无论如何都必须等待相同的金额。

于 2017-12-23T00:36:48.857 回答