I completely missed where you're being required to duplicate.
A central principle of micro services is for the service to be the single authority. That means inventory and user management can be completely separate. I'd design the user management so that it doesn't even know the inventory system exists.
But I'd design the inventory system so that it never stores anything about users other then a user ID. That takes care of your problem of propagating user info changes.
As for things that need both inventory info and user info such as logs, audits, and print outs they don't get updated as info changes. They are a record of what was. Again, you don't propagate change.
So in every case, when you want the latest user info you ask the user info service.
I would take a look at one of Microsoft's newer projects code named "Ambrosia" (link will take you to their Github page where the project is being developed open source) which focuses on providing a solution to this exact problem and several other major data consistency problems when developing distributed services.
The cliff-notes version is that they provide Virtual Resiliency which they desribe as the holding the following meaning:
Virtual Resiliency is a mechanism in a (possibly distributed) programming and execution environment, typically employing a log, which exploits the replayably deterministic nature and serializability of an application to automatically mask failure.
With one of the key benefits of utilizing the Ambrosia project being, that you are then provided with a layer of abstraction over the top of all the Transient Fault handling and Data Consistency problems, which are encountered thanks to the transport layer's reliability! This means that your developers DO NOT have to write any fault handling or data consistency into your code base as the underlying Ambrosia framework manages all of those cross cutting issues, as well as handling reconnecting any disconnected connections (tunnels, ssh, etc).
All of the information below, is taken straight from the project's Github page, and you can thus find this information and much, much more detailed sample use cases, etc. by following the link in the first paragraph above! I hope that this helps you guys out! It has been working great for the projects I currently am running in cloud native context!
How it works
The figure below outlines the basic architecture of an AMBROSIA application, showing two communicating AMBROSIA services, called Immortals. Each inner box in the figure represents a separate process running as part of the Immortal. Each instance of an Immortal exists as a software object and thread of control running inside of an application process. An Immortal instance communicates with other Immortal instances through an Immortal Coordinator process, which durably logs the instance's RPCs and encapsulates the low-level networking required to send RPCs. The position of requests in the log determines the order in which they are submitted to the application process for execution and then re-execution upon recovery.
Ambrosia Architecture
In addition, the language specific AMBROSIA binding provides a state serializer. To avoid replaying from the start of the service during recovery, the Immortal Coordinator occasionally checkpoints the state of the Immortal, which includes the application state. The way this serialization is provided can vary from language to language, or even amongst bindings for the same language.
Best Answer
The fact that you keep your data in files, and that they are updated from an outside source adds a wrinkle to this problem.
If you have say 2 instances of the weather service, having them both read and update the same file if going to run into locking issues.
Additionally you will want to only have the updating check run once, not once per instance.
Therefor, I would advise hiding the files behind another service, which can deal with caching, updating, avoiding locks etc.
If the files in the set can be divided up into their retrospective services however, you could do that and have multiple of these file protection services, one per group of files. This would be more microservicey
Or you could separate the update service and use a database to store the information rather than the file system, which would solve the locking issues.
A push messaging or queue system could solve the update issues without a separate service.