web-dev-qa-db-fra.com

Concevoir une plateforme: une ou plusieurs bases de données?

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 Service-Oriented Architecture , mais ils traitent contre 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 du 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?

31
Nick Chammas

À mon avis, le principal facteur de différenciation des vrais systèmes SOA (sur les pseudo-SOA, systèmes ntiers/distribués qui deviennent omniprésents) est qu'il ne devrait y avoir aucune interaction entre les services discrets. , toute application que vous composez à partir de ces services peut et doit être conçue pour tolérer la défaillance de toute partie constitutive. Une défaillance réduit les fonctionnalités 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 y a peu (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 Netflix Chaos Monkey qui a été mentionné le Coding Horror .

Abordant quelques points de votre question:

En cas de sinistre, il est plus facile de restaurer la plate-forme dans un état cohérent.

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. Alternativement, il existe des méthodes pour assurer la synchronisation entre plusieurs bases de données, marques de transaction dans SQL Server par exemple.

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.

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 aider avec les problèmes plus généraux SOA.

En supposant que chaque base de données se trouve sur un matériel distinct, la mise à l'échelle offre plus d'avantages en termes de performances.

Certes, il peut être moins coûteux de faire évoluer plusieurs machines à plus faible spécification 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 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) ! :)

18
Mark Storey-Smith