3 minutes
Getting Data From Another Bounded Context
When working with DDD we’ll face for sure problems getting data from another bounded context. Since we want them to be as less coupled as possible we’ll deal with complex situations here.
Let’s review the options we have taking as example a Sales
bounded context wanting to get user data from Users
bounded context.
HTTP Request
This is the first option we’ll probably think about. It’s easy to implement since we just need to expose some user data through an internal endpoint which can be called by the Sales
bounded context.
The good things
Since will be a synchronous call it makes all the flow even easier, we call Users
BC and we get the data we need to do any action, for example to store a sell with the required data.
Also, since we’ll be going directly to the source of true for users data we’ll get always the very last data.
The bad things
In the other hand this will couple our two bounded contexts in a way that if Users
BC is down we can’t get any user data.
It’s true that we can use some kind of cache to minimize the outage for example if we store the user data we got for X time. This will also force us to deal with stale data, maybe we’ll want to purge that cache when a user updates their info… as we see this will start to get complex.
If the traffic of our Sales
BC increases a lot we’ll be adding load to the Users
BC, so these two bounded contexts will be somehow tied.
Data Projection
Data projections are a way to have a representation of a data coming outside of our bonded context in a way that itΒ΄s easy and very accessible.
For example if in sales we need the user data to deal with our clients we could create a new clients
projection that will be populated every time Users
bounded context publish a UserCreated
domain event. In the same way we’ll update our projection when UserUpdated
domain event is published, and we’d remove them when we receive UserDeleted
event.
The good things
This solution it’s ideal for systems where reliability is key. Since if Users
BC is down somehow we’ll still be able to get our clients data from the projection we have stored locally in Sales
BC.
Also, this will improve the performance of our system since getting clients data will be much faster since it will require just a query in some DB optimized to do that.
The bad things
When we start the projection will be empty forcing us to populate it somehow. One solution would be sending all the user related events to the projector in Sales
BC. In that way we’d get all the clients there. This might be a complex process or even impossible taking into account old events version or if we don’t have a proper event store with all the historic of events.
Since the projectors will be asynchronous processes we’ll lead with eventual consistency. We have to be sure that we can deal with it handling for example retries in case we receive the sell before getting the UserCreated
event.
Hybrid Solution
An hybrid solution would be having a projection but without being populated with the very initial events. So if we try to get a user data of an existing one in the projection we’ll do a HTTP request to Users
BC and we’ll create that client in the projection so the next time we don’t need to do it again.
At some point we’ll have the projection full enough to have as less HTTP calls as possible.