web-dev-qa-db-fra.com

Est-ce une mauvaise pratique pour les services de partager une base de données en SOA?

J'ai récemment lu des modèles d'intégration d'entreprise de Hohpe et de Woolf, certains des livres de Thomas Erl sur SOA et sur la surveillance de diverses vidéos et podcasts par Udi Dahan et al. sur les systèmes CQRS et des événements.

Les systèmes sur mon lieu de travail souffrent d'un couplage élevé. Bien que chaque système ait théoriquement sa propre base de données, il y a beaucoup de jointures entre eux. En pratique, cela signifie qu'il y a une énorme base de données que tous les systèmes utilisent. Par exemple, il y a un tableau des données client.

Une grande partie de ce que j'ai lu semble suggérer de dénormaliser les données afin que chaque système utilise uniquement sa base de données, et toutes les mises à jour d'un système sont propagées à tous les autres à l'aide de la messagerie.

Je pensais que c'était l'un des moyens de faire respecter les frontières dans SOA - Chaque service devrait avoir sa propre base de données, mais puis j'ai lu ceci:

https://stackoverflow.com/questions/4019902/soa-joining-Data-Aross-Multiples-services

et cela suggère que c'est la mauvaise chose à faire.

Séparer les bases de données semble être un bon moyen de découpler des systèmes, mais maintenant je suis un peu confus. Est-ce un bon itinéraire à prendre? Est-il déjà recommandé de séparer une base de données sur, dites un service SOA, un contexte délimité par le DDD, une application, etc.?

17
Paul T Davies

Le découplage ne fonctionne que s'il y a vraiment une séparation. Considérez si vous avez un système de commande:

  • Tableau: Client
  • Tableau: Commander

Si c'est tout ce que vous avez, il n'y a aucune raison de les découpler. D'autre part, si vous avez ceci:

  • Tableau: Client
  • Tableau: Commander
  • Tableau: Customer_Newsletter

Ensuite, vous pouvez affirmer que l'ordre et le client_newsletter font partie de deux modules totalement séparés (commandes et marketing). Peut-être qu'il est logique de les déplacer dans des bases de données distinctes (une pour chaque table) et que les deux modules partagent l'accès à la table client commune dans sa propre base de données.

En faisant que vous simplifiez chaque module, mais vous augmentez la complexité de votre couche de données. Au fur et à mesure que votre application augmente et plus grandes, je peux voir un avantage à la séparation. Il y aura de plus en plus de "îles de données" qui n'ont vraiment aucune relation les unes des autres. Cependant, il y aura toujours des données qui transmettent tous les modules.

La décision de les mettre dans différentes bases de données physiques serait généralement basée sur des contraintes mondiales réelles telles que la fréquence des sauvegardes, les restrictions de sécurité, la réplication à différents endroits géographiques, etc. Je ne séparerais pas les tableaux dans différentes bases de données physiques simplement en raison de la séparation des préoccupations. Cela peut être traité plus simplement avec différents schémas ou vues.

12
Scott Whitlock

Où je travaille, nous avons une [~ # ~] ESB [~ # ~ ~] auquel 6 applications différentes (ou dois-je dire "les points de terminaison") sont connectés. Ces 6 applications fonctionnent avec 3 schémas Oracle différents sur 2 instances de base de données. Certaines de ces applications coexistent dans le même schéma non parce qu'elles sont liées, mais parce que notre infrastructure de base de données est gérée par un fournisseur externe et que l'obtention d'un nouveau schéma ne prend que pour toujours (aussi, nous n'avons pas accès à DBA bien sûr) ... prend vraiment si longtemps qu'à un moment donné, nous avons pensé à réutiliser un schéma existant "temporairement" de pouvoir continuer le développement. Pour appliquer la "séparation" des données, les noms de table sont préfixés, par exemple "CST_" pour le client. De plus, nous devons travailler avec un schéma que pour des raisons valables, nous ne pouvons pas changer de changement absolu ... c'est étrange que je connaisse. Bien sûr, comme cela se produit toujours, "temporairement" a changé en "temporairement, à la notification" si vous savez ce que je veux dire ;-)

Nos différentes applications se connectent à leur schéma de base de données respectif et fonctionnent avec leurs propres forfaits PL/SQL et nous nous interdisons absolument d'interagir directement avec des tables/des données en dehors de notre domaine d'application.

Lorsque l'une des applications connectées à l'ESB a besoin d'informations à l'extérieur de son domaine, il appelle le service associé à l'ESB pour obtenir les données, même si cette information est en fait dans le même schéma, nécessitant en théorie juste une petite déclaration de jointure dans l'une des demandes SQL .

Nous faisons cela pour pouvoir diviser notre domaine d'application en différents schémas/bases de données, et pour que les services sur le CSE fonctionnent toujours correctement lorsqu'il se produise (il est bientôt Noël, nous sommes corsants des doigts)

Maintenant, cela peut sembler étrange et affreux de l'extérieur, mais il y a des raisons de cela et je voulais juste partager cette expérience concrète pour vous montrer qu'une ou plusieurs bases de données ne sont pas si importantes. Attendez, c'est! , pour de nombreuses raisons (+1 pour Scott Whitlock, voir le dernier paragraphe sur la sauvegarde et telle que MyA vous mènera en difficulté) mais est tout aussi important que je pense avoir votre SOA services étant correctement conçus, au moins c'est mon avis, et je ne suis pas un DBA. En fin de compte, toutes vos bases de données appartiennent à votre "Enterprise Datawarehouse" , droit?

Enfin, je ne repaurirai pas le dernier paragraphe de Scott Whitlock, en particulier cette

Je ne séparerais pas les tables dans différentes bases de données physiques simplement en raison de la séparation des préoccupations.

est vraiment super important. Ne le faites pas s'il n'y a aucune raison.

8
Jalayn

J'ai vu les pires cauchemars possibles de l'architecture logicielle en raison de l'intégration des données et de la meilleure arme contre ce type de désordre que j'ai rencontré jusqu'à présent des contextes bornés de style DDD. Ce qui n'est pas très éloigné de "SOA fait de droite", sur un certain sens.

Cependant, les données elles-mêmes n'est pas la meilleure façon d'attaquer le problème. Il faut se concentrer sur le comportement attendu/nécessaire et apporter les données dans lesquelles cela compte. Nous pourrions finir par avoir une certaine duplication de cette façon, mais cela n'est normalement pas un problème par rapport aux blocs à l'évolution du système, presque toujours associé à des architectures intégrées aux données.

Pour le mettre simple: si vous recherchez des systèmes couplés lâchés, ne restez pas couplés sur les données. Optez pour les systèmes encapsulés Weel et un canal de communication bien structuré entre les deux, agissant comme "Lingua Franca".

8
ZioBrando

Découpler des bases de données et maintenir les données cohérentes entre eux est une tâche de niveau d'expert. Il est très facile de se tromper et de se retrouver avec les problèmes de duplicats, etc., que le système actuel est conçu pour éviter. Franchement, prendre un système de travail et faire cela est à peu près une garantie d'introduction de nouveaux bugs sans valeur réelle aux utilisateurs.

7
HLGEM

Si cela est fait correctement, séparer les préoccupations commerciales en différentes bases de données (ou au moins différents schémas) est une vertu .

S'il vous plaît voir La description de Martin Fowler du modèle CQRS :

Comme nos besoins deviennent plus sophistiqués, nous nous éloignons régulièrement de [traiter un système d'information comme un jeu de données crud] ... Le changement que les CQRS introduisent consiste à scinder ce modèle conceptuel en modèles distincts pour la mise à jour et l'affichage ... Il y a de la place pour une variation considérable ici. Les modèles en mémoire peuvent partager la même base de données, auquel cas la base de données agit comme la communication entre les deux modèles. Cependant, ils peuvent également utiliser des bases de données distinctes , en faisant efficacement la base de données de la requête par une reporting database en temps réel. Dans ce cas, il doit y avoir un mécanisme de communication entre les deux modèles ou leurs bases de données.

Et principes architecturaux de NSERVICEBUS :

Séparation de la requête de commande

Une solution qui évite ce problème séparait les commandes et les requêtes au niveau du système, même au-dessus de celui du client et du serveur. Dans cette solution, il existe deux "services" qui couvrent à la fois client et serveur - un responsable des commandes (Créer, mettre à jour, Supprimer), l'autre en charge des requêtes (lecture). Ces services communiquent uniquement via des messages - On ne peut pas accéder à la base de données de l'autre ...

Et ségrégation de la responsabilité de la commande et de la requête (CQRS)

Séparation de la responsabilité de la commande et de la requête

La plupart des applications lit les données plus fréquemment qu'elles ne écrivent de données. Sur la base de cette déclaration, ce serait une bonne idée de faire une solution où vous pouvez facilement ajouter davantage de bases de données à lire, non? Alors, que si nous configurons une base de données dédiée juste pour la lecture? Encore mieux; Et si nous concevons la base de données d'une manière, il est donc plus rapide de le lire? Si vous concevez vos applications basées sur les modèles décrits dans l'architecture CQRS, vous aurez une solution évolutive et rapide à la lecture de données.

1
Jim G.