Tengo un microservicio para envolver el acceso a un MongoDB (DaaS). Se implementa con Spring Data Reactive Repository (ReactiveMongoRepository).
Lo he implementado dentro de una imagen acoplable, ejecutándose en Kubernetes (en Google Cloud). Configuré el orquestador para mantener un mínimo de 2 pods de mi microservicio (y un máximo de 4).
En otro microservicio, he implementado un proceso por lotes con subprocesos múltiples, donde llamo a mi daas, con la siguiente secuencia:
Aquí está el código relevante:
public Mono<Element> updateElement(String id) { return this.daasClient.findById(id) .map(elem -> modify(elem)) .flatMap(elem -> this.daasClient.save(elem)); }Cuando hay muchas operaciones, cada pod ejecuta algunas de ellas (incluido el código anterior), por lo que he visto que el acceso al recurso (Mongo) no es seguro para subprocesos, por lo que el resultado no es el esperado.
Supongo que 2 pods ejecutan findById simultáneamente, por lo que la actualización no es para el documento "real", por lo que el último en invocar el método de guardar anula los cambios del otro.
¿Alguien sabe cómo podría hacer para evitar esto, es decir, implementar esta operación de manera segura para subprocesos (pod-safe)?
Gracias