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


31

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?


qu'avez-vous fini par choisir?
Frank Visaggio

@BobSinclar - Cela fait un bon moment maintenant, mais nous avons fini par utiliser plusieurs bases de données.
Nick Chammas

Les changements de schéma sont-ils plus difficiles ou non? Supposons que vous deviez mettre à jour le schéma de chaque base de données.
Frank Visaggio

@BobSinclar - Je ne suis pas ce que vous demandez. Quand auriez-vous besoin de mettre à jour le schéma de chaque base de données à la fois si vous avez construit une plateforme selon les principes SOA? Les différents systèmes doivent être couplés de manière lâche.
Nick Chammas

Je sais que ça fait un moment, mais ça vous dérange de partager les différentes bases de données que vous avez sélectionnées et la raison?
azngunit81

Réponses:


18

À 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:

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. 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.

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

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

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! :)


Bon point concernant les solutions de cache distribué. Avec la mise en cache au niveau du SAN ou de la base de données, cependant, ce n'est pas un problème. Là, vous tirez un avantage de la mise en cache en raison de votre topologie de déploiement (c'est-à-dire que différents services se trouvent juste partager le même matériel) et non en raison de la communication directe entre les services comme avec memcached.
Nick Chammas
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.