我正在开发一个 Web 应用程序,遇到并发 POST API 调用导致重复条目的问题。应用程序处理共享公共标识符的实体,并且需要协调对此共享资源的更新以防止重复。
场景如下:
该过程从导入数据开始,这会初始化一个实体 导入数据中缺少共享标识符。
在应用程序工作流程中前进会触发 POST API 调用来更新详细信息 与每个实体的共享标识符相关。
由于有多个实体与同一标识符关联,因此结果 在快速连续发生的多个 POST 调用中。
管理 更新时,设计了一个函数来重新创建共享资源 这些实体。
这包括将现有记录绑定到的步骤 在创建新实体之前删除实体以确保 没有重复。
尽管有创建前删除的逻辑, 几乎同时执行这些 POST 调用会导致 第二次调用没有“看到”第一个调用所做的删除,导致 重复条目。
作为解决方法,我实现了超时延迟 这些 POST 调用之间的前端,解决了重复问题 问题。然而,我认识到这不是理想的或可靠的 解决方案,尤其是大规模解决方案。
如何有效管理这些并发 API 调用来更新共享资源,而不会遇到竞争条件或必须依赖前端超时?
后端开发中是否有既定的模式或策略来处理这种情况,可能涉及更有效的排队机制或事务锁?
任何见解或建议将不胜感激。
如果可以轻松比较两个值,请尝试使用 distinctUntilChanged()。
否则请使用
debounceTime(1)
(最好在debounceTime()
之前检查表格有效性)。
对于请求本身,您可以使用以下内容:
action.pipe(
switchMap(() => request())
)
您需要将其更改为:
action.pipe(
exhaustMap(() => request())
)
对于幂等1请求(GET、HEAD、PUT、DELETE、OPTIONS 和 TRACE),您可以使用任何扁平化运算符,对于非幂等(POST、CONNECT),您应该使用
exhaustMap()
或 concatMap()
。
1 幂等性是某些 HTTP 方法的重要属性,可确保多次执行同一请求会产生与仅执行一次相同的结果。