web-dev-qa-db-fra.com

Transfert de fichiers / données volumineux dans une architecture de microservice

Mon entreprise travaille actuellement à l'adoption d'une architecture de microservices mais nous rencontrons des difficultés croissantes (choc!) En cours de route. L'un des principaux points de discorde auquel nous sommes confrontés est de savoir comment communiquer de grandes quantités de données entre nos différents services.

Comme arrière-plan, nous avons un magasin de documents qui sert de référentiel pour tout document que nous pourrions avoir besoin de gérer dans toute l'entreprise. L'interaction avec ledit magasin se fait via un service qui fournit à un client un identifiant unique et un emplacement pour diffuser le document. Il est possible d'accéder ultérieurement à l'emplacement du document via une recherche avec l'ID fourni.

Le problème est le suivant: est-il logique que tous nos microservices acceptent cet ID unique dans le cadre de leur API dans le but d'interagir avec des documents ou non? Pour moi, cela semble intrinsèquement mauvais - les services ne sont plus indépendants et dépendent du service du magasin de documents. Bien que je reconnaisse que cela pourrait simplifier la conception de l'API et peut-être même avoir des gains de performances, le couplage résultant plus que contrebalance les avantages.

Est-ce que quelqu'un sait comment les licornes Rainbow (Netflix, Amazon, Google, etc.) gèrent de gros fichiers/échanges de données entre leurs services?

22
PremiumTier

Est-ce que quelqu'un sait comment les licornes Rainbow (Netflix, Amazon, Google, etc.) gèrent de gros fichiers/échanges de données entre leurs services?

Malheureusement, je ne sais pas comment ils gèrent ces problèmes.

Le problème est le suivant: est-il logique que tous nos microservices acceptent cet ID unique dans le cadre de leur API dans le but d'interagir avec des documents ou non?

Il viole le principe de responsabilité unique, qui devrait être intrinsèquement dans l'architecture de votre microservice. Un microservice - logiquement un, physiquement de nombreuses instances représentant un - devrait traiter un seul sujet.

Dans le cas de votre magasin de documents, vous avez un point, où vont toutes les requêtes de documents (bien sûr, vous pouvez diviser cette unité logique en plusieurs magasins de documents pour plusieurs types de documents).

  • Si votre "application" a besoin de travailler sur un document, elle demande au microservice respectif et traite ses résultats.

  • Si un autre service a besoin d'un document réel ou de parties de celui-ci, il doit demander au service de documentation.

L'un des principaux points de discorde auquel nous sommes confrontés est de savoir comment communiquer de grandes quantités de données entre nos différents services.

Il s'agit d'un problème architectural:

  1. Diminue la nécessité de transférer de grandes quantités de données

    Idéalement, chaque service possède toutes ses données et n'a besoin d'aucun transfert pour servir simplement les demandes. Dans le prolongement de cette idée - si vous avez besoin de transférer des données, pensez à la redondance (* d'une manière positive_): Est-il logique d'avoir des données redondantes à de nombreux endroits (là où elles sont nécessaires)? Pensez aux incohérences possibles qui pourraient nuire à vos processus. Il n'y a pas de transfert plus rapide que réellement aucun.

  2. Diminuez la taille des données elles-mêmes

    Pensez à la façon dont vous pourriez compresser vos données: à partir d'algorithmes de compression réels jusqu'à structures de données intelligentes . Moins vous passez de fil, plus vous êtes rapide.

7
Thomas Junk

Personnellement, je préfère ne pas utiliser un service de stockage de documents et un identifiant de document séparés, mais une URL pour accéder aux documents (avec une authentification d'en-tête appropriée). Avec cette approche, vous n'aurez pas besoin d'autres services pour s'appuyer sur le service de documents, mais il pourrait simplement utiliser l'URL complète pour accéder au document. lorsque le stockage augmente et fournissez l'URL.

Cependant, vous pourriez avoir besoin d'un ou de plusieurs services pour télécharger un document et obtenir son URL.

2

Si l'ID renvoyé par votre magasin de documents est la façon de référencer les documents dans tout le système, il est logique que tous les services acceptent cet 'ID de document' sur leur API lorsque le service a besoin de savoir quel document il doit travailler avec.

Cela ne crée pas nécessairement un couplage plus étroit entre les services que nécessaire. Les services qui ont besoin d'accéder à des documents doivent de toute façon accéder au service de stockage de documents et ils ont besoin de cet ID pour indiquer au magasin à quel document accéder.
Les services qui n'accèdent pas directement aux documents peuvent avoir besoin de transmettre l'ID du document, mais pour ces services, il s'agirait simplement d'une chaîne arbitraire qui ne crée pas de dépendance.

Est-ce que quelqu'un sait comment les licornes Rainbow (Netflix, Amazon, Google, etc.) gèrent de gros fichiers/échanges de données entre leurs services?

Commander Amazon S3 REST, apparemment, elles renvoient l'objet complet en octets. Il ne semble pas y avoir beaucoup d'options si vous concevez un microservice. lien de format de réponse Amazon S

1
suresh