web-dev-qa-db-fra.com

Comment faire évoluer horizontalement un microservice qui contient une base de données

Imaginez un microservice "utilisateur" qui contient toute la logique associée à l'utilisateur, et ce microservice contient une base de données.

Comment pouvez-vous mettre ce microservice à l'échelle horizontalement et conserver sa cohérence?

En fait, si vous juste ajoutez une autre instance, alors si un utilisateur est créé, mis à jour ou supprimé, l'opération ne sera appliquée que dans une seule instance, et par conséquent vous perdrez la cohérence.

Quelle est la méthode la plus pratique pour évoluer horizontalement et conserver sa cohérence?

4
Woody

TL; DR

  • Vos interfaces Web ne doivent pas stocker de données: elles doivent être triviales à l'échelle.
  • Utilisez un magasin de données made pour une mise à l'échelle horizontale (sinon, découvrez le partage)
  • Profitez du fait que "microservices" déjà répartit la charge

Premièrement: vos frontaux Web ne devraient pas vraiment être dynamiques. Ils ne devraient pas stocker ce que vous ne pouvez pas vous permettre de perdre à un moment donné. Toutes les données doivent vivre dans un cluster de base de données dédié. Vous devriez pouvoir supprimer une interface Web ou en ajouter une nouvelle sans interrompre les sessions ou les données de qui que ce soit. La mise à l'échelle ça devrait être "triviale".

Cela dit, la mise à l'échelle horizontale d'une base de données d'un service nécessite une sorte de sharding . Mais, si vous optez pour un magasin de type de document , la mise à l'échelle horizontale via le sharding est généralement une fonction intégrée que vous n'avez qu'à configurer. (Ou, c'est un détail que vous pouvez complètement ignorer si vous utilisez un service d'hébergement de base de données évolutif, comme DynamoDB.)


Fondamentalement, le partitionnement nécessite que vous identifiiez un champ utilisé pour déterminer comment les données sont réparties entre les nœuds. Cela pourrait être un user_id, qui est traduit en nombre. Le nœud de base de données dans lequel un enregistrement utilisateur particulier est stocké peut dépendre de cet ID et d'un algorithme de hachage, par exemple.

Un exemple vraiment basique pourrait être un module d'un ID utilisateur aléatoire et entier. Tu prends user_id % number_of_servers pour déterminer où stocker/récupérer l'enregistrement.

Avec une base de données nosql, beaucoup de détails sur la façon dont cela se produit sont pris en charge pour vous - vous venez de frapper le cluster et il comprend ce qu'il faut faire.

Il peut certainement y avoir des stratégies plus sophistiquées, si vous avez besoin d'une conformité de type ACIDE -.


Cela dit, l'un des avantages d'un service micro - est l'ajournement de ce problème d'évolutivité. C'est-à-dire, parce que votre base de données utilisateur est distincte de vos bases de données catalogue de produits et commandes et ainsi de suite, chacune de ces bases de données peut déjà être localisé sur différents hôtes: Le trafic est déjà quelque peu distribué.

À moins que vous n'utilisiez un service vraiment massif et non rentable, vous pouvez probablement reporter le travail d'évolutivité restant jusqu'à ce que vous ayez le budget pour y faire face!

1
svidgen

Pour l'évolutivité, il y a l'hypothèse que chaque service est sans état et peut donc être arbitrairement mis à l'échelle. Sans état signifie ici que tout état est stocké en externe dans une base de données. Dans cette vue, un microservice est quelque peu distinct de toute base de données qu'il utilise. En particulier, vous pouvez déployer plusieurs instances du service mais avoir une base de données partagée.

  API users
     |
Load balancing
  /  |    \
MS  MS ... MS
 \  |     / 
Shared Database

La base de données n'est pas immédiatement évolutive dans cette conception. Notez également que cette conception ne nécessite pas de microservices - vous obtenez exactement les mêmes avantages d'évolutivité d'une conception monolithique, tant que les processus n'ont pas d'état interne.

Les bases de données sont difficiles à mettre à l'échelle si nous voulons conserver la cohérence: le simple lancement d'une autre instance ne va pas aider. La solution typique consiste à renoncer à la cohérence ou à utiliser la mise à l'échelle verticale: exécutez la base de données sur un serveur plus costaud. Dans de nombreux cas, l'ajout de réplicas en lecture à une base de données peut déjà être très utile. De plus, l'utilisation de techniques d'entreposage de données peut réduire la charge sur la base de données de production. Les microservices aident légèrement car différents microservices peuvent utiliser différentes bases de données, permettant ainsi à la base de données de chaque microservice d'être mise à l'échelle indépendamment.

0
amon