Transferencia de archivos / datos de gran tamaño en una arquitectura de microservicios

22

Actualmente, mi empresa está trabajando en la adopción de una arquitectura de microservicio, pero nos encontramos con algunos dolores de crecimiento (¡shock!) En el camino. Uno de los puntos clave de contención que enfrentamos es cómo comunicar grandes cantidades de datos entre nuestros diferentes servicios.

Como información básica, tenemos un almacén de documentos que sirve como depósito para cualquier documento que necesitemos manejar en toda la empresa. La interacción con dicha tienda se realiza a través de un servicio que proporciona al cliente una identificación única y una ubicación para transmitir el documento. Posteriormente se puede acceder a la ubicación del documento a través de una búsqueda con la ID proporcionada.

El problema es este: ¿tiene sentido que todos nuestros microservicios acepten esta identificación única como parte de su API con el fin de interactuar con documentos o no? Para mí, esto se siente inherentemente incorrecto: los servicios ya no son independientes y dependen del servicio de la tienda de documentos. Si bien reconozco que esto podría simplificar el diseño de la API e incluso tener algunas ganancias de rendimiento, el acoplamiento resultante más que contrarresta los beneficios.

¿Alguien sabe cómo los unicornios arcoíris (Netflix, Amazon, Google, etc.) manejan el intercambio de archivos / datos de gran tamaño entre sus servicios?

PremiumTier
fuente
¿Qué está utilizando para una tienda de documentos / archivos de alta disponibilidad?
Terence Johnson
@TerenceJohnson Estamos utilizando una solución local por ahora. Estamos migrando hacia una solución que aprovecha una Api RESTful que solo persiste una identificación de documento única y su ubicación (que se proporciona al cliente en lugar de una secuencia para evitar la carga innecesaria de la red interna). La persistencia real se realizará a través de AWS.
PremiumTier

Respuestas:

7

¿Alguien sabe cómo los unicornios arcoíris (Netflix, Amazon, Google, etc.) manejan el intercambio de archivos / datos de gran tamaño entre sus servicios?

Lamentablemente, no sé cómo manejan estos problemas.

El problema es este: ¿tiene sentido que todos nuestros microservicios acepten esta identificación única como parte de su API con el fin de interactuar con documentos o no?

Viola el Principio de responsabilidad única, que debería estar inherentemente en la arquitectura de su microservicio. Un microservicio, lógicamente uno, físicamente muchas instancias que representan uno, debería tratar un tema .

En el caso de su almacén de documentos, tiene un punto, donde van todas las consultas de documentos (por supuesto, podría dividir esta unidad lógica en múltiples almacenes de documentos para varios tipos de documentos).

  • Si su "aplicación" necesita trabajar en un documento, le pregunta al microservicio respectivo y procesa sus resultados.

  • Si otro servicio necesita un documento real o partes del mismo, debe solicitarlo.

Uno de los puntos clave de contención que enfrentamos es cómo comunicar grandes cantidades de datos entre nuestros diferentes servicios.

Este es un problema arquitectónico:

  1. Disminuya la necesidad de transferir grandes cantidades de datos.

    Idealmente, cada servicio tiene todos sus datos y no necesita transferencia para simplemente atender solicitudes. Como una extensión de esta idea, si tiene la necesidad de transferir datos, piense en la redundancia (* de manera positiva_): ¿Tiene sentido tener los datos redundantes en muchos lugares (donde se necesitan)? Piense en cómo las posibles inconsistencias podrían dañar sus procesos. No hay transferencia más rápida que en realidad ninguna .

  2. Disminuir el tamaño de los datos en sí.

    Piense en cómo podría comprimir sus datos: comenzando con algoritmos de compresión reales hasta estructuras de datos inteligentes . Cuanto menos pase por el cable, más rápido eres.

Thomas Junk
fuente
2

Si la ID devuelta por su almacén de documentos es la forma de hacer referencia a documentos en todo el sistema, entonces tiene sentido que todos los servicios acepten esa 'ID de documento' en su API cuando el servicio necesita saber con qué documento necesita trabajar.

Esto no necesariamente crea un acoplamiento más estricto entre los servicios de lo necesario. Los servicios que necesitan acceder a los documentos deben acceder al servicio de almacenamiento de documentos de todos modos y necesitan esa identificación para indicarle a la tienda a qué documento acceder.
Es posible que los servicios que no acceden a los documentos directamente necesiten pasar la ID del documento, pero para esos servicios sería solo una cadena arbitraria que no crea una dependencia.

Bart van Ingen Schenau
fuente
Gracias por su respuesta. Debo agregar que podríamos beneficiarnos al exponer nuestros microservicios a consumidores externos que tal vez no quieran aprovechar también nuestro almacén de documentos interno. Con eso en mente, ¿todavía sientes que este es el mejor enfoque?
PremiumTier
@PremiumTier: Sí. Pero esos clientes externos tendrían que proporcionar una tienda propia que admita la misma API que su tienda interna, para que sus servicios puedan cooperar con ella.
Bart van Ingen Schenau
Eso tiene sentido, pero aún se siente más engorroso que hacer que los servicios acepten secuencias, conjuntos de bytes o blobs json en lugar de referencias de documentos. En ese caso, se podría invocar fácilmente un servicio 'adaptador' primero para obtener la secuencia de archivos si fuera necesario antes de llamar a los servicios posteriores. Por cierto, no estoy tratando de ser discutidor, sino simplemente tratando de comprender los méritos de este enfoque :)
PremiumTier
2

Personalmente, prefiero no usar un servicio de almacenamiento de documentos y una identificación de documento separados, sino una URL para acceder a los documentos (con la autenticación de encabezado adecuada). Con este enfoque, no necesitará otros servicios para confiar en el servicio de documentos, sino que podría usar la URL completa para acceder al documento. Y también tiene sentido cuando se trata de escalar, puede usar múltiples almacenes de documentos y cuando el almacenamiento crece y proporciona la URL.

Sin embargo, es posible que necesite un servicio (s) para cargar un documento y obtener su URL.

Pelican de bajo vuelo
fuente
1

¿Alguien sabe cómo los unicornios arcoíris (Netflix, Amazon, Google, etc.) manejan el intercambio de archivos / datos de gran tamaño entre sus servicios?

Verifique las especificaciones de la API REST de Amazon S3, aparentemente devuelven el objeto completo en bytes. Parece que no hay muchas opciones si está diseñando un microservicio. Enlace de formato de respuesta de Amazon S3

suresh
fuente