One of the most difficult decisions (and expensive if done wrong) is how to decompose a monolithic application into a set of cooperating microservices. If this is done in the wrong way, you will end up with problems such as the following:
Slow delivery: Changes in the business requirements will affect too many of the microservices, resulting in extra work.
Bad performance: To be able to perform a specific business function, a lot of requests have to be passed between various microservices, resulting in long response times.
Inconsistent data: Since related data is separated into different microservices, inconsistencies can appear over time in data that's managed by different microservices.
A good approach to finding proper boundaries for microservices is to apply domain-driven design and its concept of bounded contexts. According to Eric Evans, a bounded context is:
"A description of a boundary (typically a subsystem, or the work of a particular team) within which a particular model is defined and applicable."