从UI的角度来看,异步微服务通信如何表现得更好?

a20*_*umb 2 spring asynchronous event-driven microservices angular

在我的 Angular UI 中,我从 API 网关调用了一个端点,例如:

this.http.post(`/order`).subscribe(order => addNewOrderToList(order));
Run Code Online (Sandbox Code Playgroud)

根据微服务的最佳实践,/order处理程序应该发布一个由一个或多个微服务使用的事件,而不是使用同步 REST 相互调用。因此,我编写了以下处理程序:

@RequestMapping
public Future<Order> addOrder() {
  CompletableFuture<Order> future = new CompletableFuture<>();
  // publish event
  // ...
  // wait for final event raised by a service.
  future.complete(createdOrder);
  return future;
}
Run Code Online (Sandbox Code Playgroud)

从 UI 的角度来看,在我的端点返回新订单之前,用户不是不会看到新订单吗?我觉得即使后端是异步的,UI 仍然是同步的。在这种情况下,改进 UI 的最佳做法是什么?

Edw*_*rzo 5

也许你应该做的是在这种情况下接受异步和最终一致性。

您的 HTTP 端点在调用时实际上什么都不做,它只接受 UI 命令,并将其排入队列以供其他后端微服务最终处理,对吗?

因此,您可能应该做的只是接受命令,验证它,将它排入队列,然后向客户端返回 HTTP 状态代码202 Accepted。您可以在响应中包含一个 ETA 标头,指示客户端何时可以轮询另一个端点以检查结果是否准备就绪。如果您遵循真正的 RESTful 方法,则可以包含指向客户端可在准备好时用于轮询结果的资源的链接。

您可能需要阅读以下文章: