JavaScript回调函数是原子的吗?

4

我希望确保两个独立的第三方数据库中的字段在不同的位置进行同步。我有以下通用的node / express js代码:

router.post ('url', function(req,res,next) {

    third_party_api_1.set_a (req.body.param, function(err, a) {

        third_party_api_2.set_b (req.body.param, function(err, b) {
            res.end()
        })

    })

})

如果用户发布(param = 1),我期望(a = b = 1)。如果他们发布(param = 2),我期望(a = b = 2)。如果两个用户同时发布(param = 1)和(param = 2),第三方数据库中的a和b总是相等吗?我知道它们可以根据时间而为1或2,但我想确保它要么是(a = b = 1),要么是(a = b = 2),而不是(a = 1,b = 2)或(a = 2,b = 1)。
换句话说, set_a 和 set_b 是否“原子”?
谢谢!
编辑#1: "a" 是第三方数据库中的单个值,"b" 是另一个第三方数据库中的单个值,我希望用户发布单个值,我的代码将两个a和b替换为该用户值。
编辑#2: 我无法直接控制第三方数据库,我只能调用公共API。也许我需要在api调用周围加上互斥体?我该如何实现?

1
在你的代码中,只有在从set_a接收到响应后才会调用set_b。因此它取决于远程API的工作方式。 - Chris Rollins
3个回答

3

您似乎在询问两个分布式系统之间的“一致性”,而不是原子性。

您所问的实际上更多是一个架构问题,而不是JavaScript特有的问题。如果您正在调用两个不同的数据存储,您需要某种方式来确保这两个端点保持一致。


1
很遗憾,答案是否定的。即使您的代码看起来像下面的示例一样,您也不会安全,因为对setAsetB的调用可能会与多个调用者交错。
router.post ('url', function(req,res,next) {
    api1.setA(req.body.param);
    api2.setB(req.body.param);
 });

你还需要考虑的是,如果你的应用程序最终部署到一组负载均衡的Web服务器上会发生什么。
如果不了解实际更新的数据库,很难推荐解决方案。它们是完全不透明的,还是在某种关系/文档数据库前面的服务?

0

这个问题涉及到数据库一致性,你的架构应该更负责维护分布式存储的一致性。

例如:考虑MongoDB的分片和复制部署,无论你的请求如何,存储都应该更负责在最后一个调用请求之后创建一致的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接