微服务的异步通信
1. 异步完成 REST 响应
在将所有并行执行同步到单个阶段,并将结果合并到一个列表后,我们可以链式调用更多的 lambda 回调来处理最终的预测列表,并将其作为 REST 响应发送。由于异步回调在不同的线程中执行,我们需要一种方法来完成 REST 响应,而不是从 REST 方法返回最终值。
1.1 传统方法的弊端
虽然我们可以让初始线程休眠,直到异步结果可用,但这种方法存在严重的缺点:
- 需要两个线程来完成响应,但在给定时间内只有一个线程在工作。
- 需要同步线程并将预测列表从一个线程传递到另一个线程,线程同步会带来额外的开销,会降低性能,应尽可能避免。
1.2 异步请求处理
更好的解决方案是从初始方法返回,并在另一个线程中稍后完成响应,这称为异步请求处理。JAX - RS REST API 支持异步处理,允许我们在资源方法返回后提供响应。
1.2.1 使用 CompletionStage
如果我们直接从资源方法返回 CompletionStage
,容器将理解它,完成它,并在返回的 CompletionStage
完成后发送 HTTP 响应。自 Java EE 8 起,资源方法支持将 CompletionStage
作为返回值。示例代码如下:
@GET
@Produces(MediaType.APPLICATION_JSON)
public CompletionStage<