6
votes

sont des rappels javascript atomiques

Je voudrais m'assurer que les champs de deux bases de données tierces indépendantes hébergées à différents endroits sont synchronisés. J'ai le code générique de nœud / js express suivant:

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()
        })

    })

})

Si un utilisateur final poste (param = 1) j'attends (a = b = 1). S'ils postent (param = 2) j'attends (a = b = 2). Si deux utilisateurs publient (param = 1) et (param = 2) en même temps, a et b dans les bases de données tierces seront-ils toujours égaux? Je comprends qu'ils peuvent être 1 ou 2 selon le moment, mais je veux m'assurer que c'est soit (a = b = 1) ou (a = b = 2) mais pas (a = 1, b = 2) ou ( a = 2, b = 1).

En d'autres termes, est-ce que set_a et set_b seront "atomiques"?

Merci!

MODIFIER N ° 1: "a" est une valeur unique dans une base de données tierce, "b" est une autre valeur unique dans une autre base de données tierce, je voudrais que l'utilisateur affiche une valeur unique et mon code remplace à la fois a et b par cette valeur utilisateur.

MODIFIER # 2: Je n'ai aucun contrôle direct sur les bases de données tierces, je ne peux appeler qu'une API publique. Peut-être ai-je besoin d'un mutex autour des appels API? Comment puis-je mettre en œuvre cela?


1 commentaires

Dans votre code, set_b n'est appelé qu'après réception de la réponse de set_a. Cela dépend donc du fonctionnement de l'API distante.


3 Réponses :


3
votes

Vous semblez vous interroger sur la «cohérence» entre deux systèmes distribués et non sur l'atomicité.

Ce que vous posez est en réalité plus une question architecturale que quelque chose de particulier à JavaScript. Si vous passez des appels sur deux magasins de données différents, vous aurez besoin de moyens pour vous assurer que ces deux points de terminaison restent cohérents.


0 commentaires

0
votes

La question relève de la cohérence de la base de données où votre architecture serait plus responsable du maintien de la cohérence dans votre stockage distribué.

Par exemple: considérez MongoDB avec déploiement partitionné et réplication , quelle que soit votre demande, le stockage serait plus responsable de créer les données cohérentes après le dernier appel de votre demande.


0 commentaires

1
votes

Malheureusement, la réponse est non. Même si votre code ressemblait à l'exemple ci-dessous, vous ne seriez pas en sécurité car les appels à setA et setB pourraient être entrelacés avec plusieurs appelants.

router.post ('url', function(req,res,next) {
    api1.setA(req.body.param);
    api2.setB(req.body.param);
 });

Vous devez également considérer ce qui se passe si votre application est déployée sur un ensemble de serveurs Web à charge équilibrée.

Il est difficile de recommander une solution sans en savoir plus sur les bases de données que vous mettez à jour. Sont-ils totalement opaques ou les services se trouvent-ils devant une sorte de base de données relationnelle / documentaire?


0 commentaires