REST API 中的竞争条件

Posted

技术标签:

【中文标题】REST API 中的竞争条件【英文标题】:Race conditions in REST API's 【发布时间】:2022-01-10 06:05:31 【问题描述】:

我目前正在努力理解一些一般的并发概念。假设我们有一个带有多个端点的 REST api,用于在我们的数据库中更新和创建实体。假设我们针对某个更新同时收到 100 个并发请求。我们如何保证保持我们的数据一致性?如果使用 Java,我想一些选择是:

使用锁定机制 在我们的服务层中的方法上使用同步

但是,这肯定会对我们应用程序的可扩展性产生巨大影响吗?但是我目前看不到任何其他方法可以确保我们在与数据库交互时不会遇到任何竞争条件。 (另外我认为向我们在服务中编写的每个方法添加同步没有多大意义?)

所以,我想问题是:我们如何才能可靠地保护我们的应用程序免受并发请求的竞争条件的影响,同时保持可扩展性?

我知道这是一个非常开放和概念性的问题,但如果您能指出我应该深入学习哪个领域/主题的正确方向,我将不胜感激。

谢谢!

【问题讨论】:

要么使用事务存储/处理,要么采用最终一致性。并认识到原子性意味着 一些 更新有时会在某种程度上失败,您必须找出将它们作为业务问题处理的最佳方法。 【参考方案1】:

你对问题有很好的理解。

您必须在最终一致性和强一致性之间做出选择。强一致性会在一定程度上限制扩展,但您也确实需要坐下来,对扩展需求(或一致性需求)保持现实/诚实。

还可以限制一致性,例如数据库中的行可能是一致的,或者您可以在一个地区或一个大陆内的地理上保持一致。不同的查询也可能有不同的要求。

创建高效且高度一致的数据库是一个完整的研究领域,所有大型科技巨头都有人致力于此,有太多的解决方案/技术无法列出。只需在谷歌上搜索“强一致性扩展”之类的内容即可获得大量可供阅读的结果。

【讨论】:

以上是关于REST API 中的竞争条件的主要内容,如果未能解决你的问题,请参考以下文章

keycloak rest api查询是不是有Not条件

如何将搜索条件声明为参数 REST API 方法

SharePoint Rest Api Caml multiple condition query -Rest api 利用Caml多个条件查询

Gmail REST API:400错误请求+失败的前提条件

当发生写入数据库的并发 API 调用(或服务器速度较慢时)时,防止出现竞争条件

根据条件限制/锁定所有 Post/Delete Rest API 端点 [关闭]