Por ejemplo, si tengo un microservicio con esta API:

service User {
    rpc GetUser(GetUserRequest) returns (GetUserResponse) {}
}

message GetUserRequest {
    int32 user_id = 1; 
}

message GetUserResponse {
    int32 user_id = 1;
    string first_name = 2;
    string last_name = 3;
}

Supuse que para otros servicios que requieren usuarios, tendré que almacenar este user_id en todas las filas que tengan datos asociados con ese ID de usuario. Por ejemplo, si tengo un servicio de Publicaciones separado, almacenaría la información de user_id para cada autor de publicación. Y luego, siempre que quiera que la información del usuario devuelva datos en un punto final, necesitaría realizar una llamada de red al servicio de usuario.

¿Siempre querría hacer eso? ¿O hay ciertas ocasiones en las que simplemente quiero copiar información del servicio de usuario en mi servicio actual (excluyendo guardar en bases de datos en memoria como Redis)?

1
abrarisme 16 feb. 2018 a las 22:42

2 respuestas

La mejor respuesta

Generalmente nunca se requiere copiar datos completos, la mayoría de las veces con fines de escala o para hacer que los microservicios sean más independientes, la gente tiende a copiar parte de la información que es de naturaleza más o menos estática.

Por ejemplo: en Post Service, podría copiar información básica del autor como el nombre en los microservicios de publicación, porque cuando alguien hace una solicitud al microservicio de publicación para obtener una lista de publicación basada en algún filtro, no quiero obtener el nombre del autor para cada uno enviar.

Además, el efecto secundario de copiar datos es mantener su consistencia. Así que asegúrese de que su negocio realmente lo exija.

1
techagrammer 19 feb. 2018 a las 05:47

Definitivamente querrá evitar compartir esquemas / tablas de bases de datos. Consulte este blog para obtener una explicación. Utilice una interfaz especialmente diseñada para la dependencia entre los servicios.

Cualquier decisión de "copiar" datos en su otro servicio debe tomarla el equipo del servicio, pero es mejor que tengan una buena razón para que tenga sentido. La mayoría de los diseños no requerirán datos duplicados porque el límite del servicio debe ser específico del dominio y no superponerse. En el caso de los identificadores de usuario, a menudo se pueden tratar como referencias contextuales sin ninguna lógica adjunta sobre los usuarios.

Un patrón observado es: si tiene puntos finales protegidos por autenticación, deberá realizar una llamada a su servicio de autenticación de todos modos, por seguridad, y esa misma llamada debería permitirle adquirir cualquier información de identificación de usuario que sea necesaria.

Se aplican todas las mejores prácticas habituales para las dependencias de API, p. Ej. en cuanto a estabilidad, control de versiones, obsolescencia, etc.

1
Oswin Noetzelmann 17 feb. 2018 a las 03:09