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

How can asynchronous microservices communication performs betters in the perspective of UI?

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

this.http.post(`/order`).subscribe(order => addNewOrderToList(order));

根据微服务的最佳实践,/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;
}

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

有两种方法可以做到这一点,但是这两种情况 UI/client 都以异步方式调用服务

  1. 实现 RestController,它可以同步访问,但从浏览器添加了异步特性。这是更传统的方式
  2. 使 Controller 方法具有反应性。 UI 调用服务并在数据可用时收到通知。这是新的,受 SPring 5.0
  3. 支持

两者都很好,但 #1 方法很旧,但 #2 需要在 UI 和服务器中进行更多处理。添加异步行为将增加更好的客户体验,即他们可以在 UI 中做其他事情而无需等待数据。

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

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

因此,您可能应该做的只是接受命令、验证它、将其加入队列,然后 return 一个 HTTP 状态代码 202 Accepted to the client. You could include an ETA header in your response indicating more or less when the client can poll another endpoint to check if the results are ready. If you're following a truly RESTful approach,您可以将 link 添加到准备就绪时客户端可以用来轮询结果的资源。

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