Nous construisons une plate-forme Web qui intègre plusieurs services, chacun avec ses propres données sous-jacentes. Ces services sont construits indépendamment selon les principes de l' architecture orientée services , mais ils traitent avec des données potentiellement liées. Nous nous demandons si ces services devraient partager une grande base de données ou chacun avoir sa propre base de données. (Nous prévoyons d'utiliser SQL Server 2008 Enterprise sur un cluster Windows 2008.)
Certains des avantages de chaque approche que nous avons déjà examinés comprennent:
Base de données unique
- La mise en relation des données de différents services peut être liée par des contraintes de clé étrangère
- Les extraits analytiques sont plus simples à écrire et plus rapides à exécuter
- En cas de sinistre, il est plus facile de restaurer la plate-forme dans un état cohérent
- Pour les données référencées par plusieurs services, les données mises en cache par un service sont susceptibles d'être utilisées peu de temps après par un autre service
- L'administration et la surveillance sont plus simples et moins chères au départ
Bases de données multiples
- Les travaux de maintenance, les problèmes matériels, les failles de sécurité, etc. n'ont pas nécessairement un impact sur l'ensemble de la plateforme
- En supposant que chaque base de données se trouve sur un matériel distinct, la mise à l'échelle de plusieurs machines offre plus d'avantages en termes de performances que la mise à l'échelle d'une grande machine
D'un point de vue opérationnel, est-il plus avantageux que chaque service de cette plateforme obtienne sa propre base de données, ou qu'ils se retrouvent tous dans la même base de données? Quels facteurs clés éclairent une réponse à cette question?
la source
Réponses:
À mon avis, le principal différenciateur des vrais systèmes SOA (par rapport aux pseudo SOA, systèmes ntiers / distribués qui deviennent omniprésents) est qu'il ne devrait y avoir aucune interaction entre les services discrets. Lorsque cela est réalisé, toute application que vous composez à partir de ces services peut et doit être conçue pour tolérer la défaillance de toute partie consistante. Un échec réduit la fonctionnalité mais le service est maintenu.
Dans ce scénario, il est logique, ou requis, de séparer la base de données sous-jacente pour chaque service. Si toutefois vous avez des services interdépendants, il n'y a pas grand-chose (peut-être rien) à gagner d'une scission.
Je recommanderais de lire des sites tels que HighScalability.com qui creusent dans les architectures adoptées par les sites Web de type sans échec. L'un de mes favoris récents était l'histoire du singe Chaos Netflix qui a été mentionnée dans Coding Horror .
Abordant quelques points de votre question:
C'est vrai, mais vous devriez peut-être réfléchir à la façon de mieux dissocier ces services afin que cela cesse d'être un problème. Sinon, il existe des méthodes pour assurer la synchronisation entre plusieurs bases de données, des marques de transactions dans SQL Server par exemple.
Les solutions de cache distribué (memcached et al) pourraient aider ici, mais vous violeriez les principes d'indépendance du service. Cela serait comparable à la communication directe de deux services, ou pire à l'accès à un autre magasin de données, en contournant complètement l'interface de service. Inévitablement, les données seront liées et seront transférées entre les services par la plate-forme d'appel, les décisions délicates tendent à être autour de quel service détiendra quels éléments de données. Les sites StackOverflow ou Programmers pourraient être mieux placés pour résoudre les problèmes SOA plus généraux.
Certes, il peut être moins coûteux de passer à l'échelle sur plusieurs machines de moindre qualité que de faire évoluer une seule machine. Bien que les coûts matériels inférieurs puissent être éclipsés par le coût total de possession lorsque les coûts immatériels des efforts de développement supplémentaires et de la complexité opérationnelle sont pris en compte.
Si ce n'est pas SOA et que vous avez juste un cas où les services de composants de cette plate-forme sont construits par différentes équipes / fournisseurs pour des raisons logistiques, restez avec une seule base de données et ignorez complètement tout ce qui précède! :)
la source