我可以在成功持久化数据之前发送 API 响应吗?

Can I send an API response before successful persistence of data?

我目前正在开发一个与其他微服务交互的微服务。

现在的问题是那些交互真的很耗时。我已经通过 Uni 实现了并发调用,并在有用的地方使用了缓存。现在我仍然有一些电话需要几秒钟才能响应,现在我想到了另一件事,我可以做,以提高性能:

是否可以在数据持久化成功前发送响应?我向其他微服务发送请求,他们必须在其中保留我的方法的结果。如果持久化过程成功,我是否可以在第一次响应中向用户发送结果并进行第二次响应? 这样,前端就可以开始工作了,即使我的 API 还没有 100% 完成。

我看到有一个可能的状态代码 207,但它更适合用于有人想要拆分大文件的流。还有另一种可能性吗?提前致谢。

“是否可以在数据持久化成功之前发送响应?我是否可以在第一次响应中向用户发送结果,如果持久化过程成功则进行第二次响应?这样,前端-即使我的 API 还没有 100% 完成,end 已经可以开始工作了。"

您可以而且应该这样做,但这是您 API 的理念改变,您可能必须考虑一些边缘情况和处理它们的技术。

如果是长 运行 API 调用,您可以发出“ack”响应,这是一个传统的 200 响应,仅此响应仅表示操作是异步的,将在未来,比如 { id:49584958, apicall:"create", status:"queued", result:true }

那你可以

  • 使用 returned ID 轮询您的 API 以查看仍在进行的操作是成功还是失败。

  • 有一个 SSE 通道(实时服务器端事件),您的服务器可以在其中发布待处理操作完成时的状态消息

  • 也许使用持久连接和保活,或者在中间刷新响应,你可以实现你指出的,即。就像分段响应一样。我不熟悉这种方法,因为我通常会采纳上述建议。

但在任何情况下,边缘情况都适用于完全相同的情况:例如,如果然后通过您的 API 用户发出依赖于正在进行的或什至未启动的先前命令的调用,会发生什么情况?例如,获取有关仍在保留的内容的信息?

您将不得不使用以下机制来处理这些情况:

  • 拒绝相关操作,直到“服务器端”解决挂起的调用:Api 可以 return 即。一个 BUSY 错误,通知操作仍在进行中,例如,当您想要删除仍在创建的内容时。

  • 将所有操作排队,以便服务器按顺序执行所有操作。

  • 如果您发现它们不会发生冲突,请允许进行一些模拟操作(即创建 2 个不相关的项目)