0

Envisagez la situation suivante: Il existe une demande de mise à jour sur l'entité A pour créer la sous-entité A.B. il y a peut-être beaucoup de B sur A, chaque B a une adresse email unique. L'entité A est une entité partagée, et la même requête peut se produire sur plusieurs serveurs en parallèle (micro-service évolutif). Afin de créer A.B, nous devons vérifier que B n'existe pas déjà en tant que sous-entité sur A (en fonction de l'adresse e-mail de B)Verrouillage de ressources et logique métier

Le service qui gère cette demande de mise à jour doit verrouiller A (par son identifiant unique) afin de sécuriser la mise à jour.

Mes questions sont plus conceptuelles que techniques:

  1. Est-ce que le verrouillage de la ressource A dans ce cas, fait partie de la logique métier de cette tâche de mise à jour? Envisageriez-vous de placer le verrou de ressource dans un intergiciel distinct de celui qui gère la procédure de vérification et de mise à jour? (l'autre option est de traiter la serrure dans le cadre de la logique métier et de le mettre directement dans le middleware responsable de la logique métier.)

Répondre

0

Le verrouillage est pas une question liée à l'entreprise (à moins que votre entreprise est la construction bases de données distribuées), et ne devraient donc jamais être considérées comme faisant partie de la logique métier. En outre, vous ne devez pas implémenter vous-même le verrouillage distribué, mais vous devez vous appuyer sur une solution packagée, qui fait de préférence partie de votre solution de persistance des données.

Voici un article sur how to do this with Redis discutant un algorithme appelé Redlock. Voici un article de blog contenant des articles sur le building concensus in Cassandra. Et, voici un lien sur concurrency in Mongo. Comme vous le verrez dans ces articles, le verrouillage distribué est une question importante et complexe que vous ne voulez probablement pas aborder vous-même.

+0

merci pour le commentaire. Comme je suis conscient et sûr que c'est complexe, je n'ai certainement pas l'intention de le faire moi-même - mais utilisez redis. Ma question concerne la place dans le code où nous aimerions obtenir le verrou sur la ressource: pendant le flux de code principal - pointez la section dans le code qui a besoin d'un verrou et verrouillez et déverrouillez cette section, ou faites comme une action pré-handle, c'est-à-dire dans un middleware précédent spécifiquement pour le verrouillage. – user132440

+0

BTW: il peut être le cas que la cohérence est impossible en redis –

+0

Oh, et comme je l'ai dit, ce n'est pas la logique métier, donc il devrait faire partie de la logique de persistance. De préférence, vous ne devriez pas coder le code de verrouillage get et release - il devrait faire partie du framework que vous utilisez. –

1

La mise en œuvre technique de la solution choisie aux problèmes de contention n'est évidemment pas une logique métier, mais le choix de la bonne solution requiert des connaissances métier. Ce que je veux dire par là, c'est que vous devez comprendre le fonctionnement de l'entreprise afin de déterminer la bonne approche pour protéger l'intégrité des données dans les scénarios de simultanéité. À quelle fréquence les conflits de concurrence se produiront-ils? Les conflits peuvent-ils être résolus automatiquement? Qu'est-ce qui devrait être en conflit? Non seulement cela, mais l'entreprise peut très bien accepter une cohérence éventuelle sur une forte cohérence. En résumé, les mécanismes mis en place pour protéger l'intégrité des données dans les scénarios de simultanéité ne devraient pas faire partie du domaine. Ceux-ci iraient probablement dans la couche de service d'application ou dans la couche d'infrastructure, mais les experts métier doivent être impliqués dans les discussions sur la façon dont les conflits de concurrence doivent être résolus et comment ils affectent l'entreprise.