更新共享资源时避免并发 POST API 调用中出现重复条目

问题描述 投票:0回答:1

我正在开发一个 Web 应用程序,遇到并发 POST API 调用导致重复条目的问题。应用程序处理共享公共标识符的实体,并且需要协调对此共享资源的更新以防止重复。

场景如下:

  • 该过程从导入数据开始,这会初始化一个实体 导入数据中缺少共享标识符。

  • 在应用程序工作流程中前进会触发 POST API 调用来更新详细信息 与每个实体的共享标识符相关。

  • 由于有多个实体与同一标识符关联,因此结果 在快速连续发生的多个 POST 调用中。

  • 管理 更新时,设计了一个函数来重新创建共享资源 这些实体。

  • 这包括将现有记录绑定到的步骤 在创建新实体之前删除实体以确保 没有重复。

  • 尽管有创建前删除的逻辑, 几乎同时执行这些 POST 调用会导致 第二次调用没有“看到”第一个调用所做的删除,导致 重复条目。

作为解决方法,我实现了超时延迟 这些 POST 调用之间的前端,解决了重复问题 问题。然而,我认识到这不是理想的或可靠的 解决方案,尤其是大规模解决方案。

如何有效管理这些并发 API 调用来更新共享资源,而不会遇到竞争条件或必须依赖前端超时?

后端开发中是否有既定的模式或策略来处理这种情况,可能涉及更有效的排队机制或事务锁?

任何见解或建议将不胜感激。

.net angular http rxjs
1个回答
0
投票

如果可以轻松比较两个值,请尝试使用 distinctUntilChanged()

否则请使用

debounceTime(1)
(最好在
debounceTime()
之前检查表格有效性)。

对于请求本身,您可以使用以下内容:

action.pipe(
  switchMap(() => request())
)

您需要将其更改为:

action.pipe(
  exhaustMap(() => request())
)

对于幂等1请求(GET、HEAD、PUT、DELETE、OPTIONS 和 TRACE),您可以使用任何扁平化运算符,对于非幂等(POST、CONNECT),您应该使用

exhaustMap()
concatMap()

  • switch - 只运行最后一个请求,如果仍在运行则取消上一个请求;
  • merge - 并行运行请求;
  • concat - 按顺序运行请求;
  • exhaust - 运行请求并忽略任何其他请求,直到该请求运行为止。

1 幂等性是某些 HTTP 方法的重要属性,可确保多次执行同一请求会产生与仅执行一次相同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.