首页 > 解决方案 > javascript回调是原子的吗

问题描述

我想确保托管在不同地方的两个独立第三方数据库中的字段是同步的。我有以下通用节点/快速 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()
        })

    })

})

如果最终用户发布(参数 = 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_aset_b是“原子的”吗?

谢谢!

编辑#1:“a”是第三方数据库中的单个值,“b”是另一个第三方数据库中的另一个值,我想让用户发布一个值,我的代码将 a 和 b 都替换为那个用户价值。

编辑#2:我无法直接控制第三方数据库,我只能调用公共 api。也许我需要一个围绕 api 调用的互斥锁?我该如何实施?

标签: javascriptnode.jsexpress

解决方案


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

您所问的实际上更多是架构问题,而不是 JavaScript 特有的任何问题。如果您对两个不同的数据存储进行调用,则需要一些方法来确保这两个端点保持一致。


推荐阅读