  Microservices Architecture (MSA) has become a de-facto standard for designing
cloud-native enterprise applications due to its efficient infrastructure setup,
service availability, elastic scalability, dependability, and better security.
Existing (monolithic) systems must be decomposed into microservices to harness
these characteristics. Since manual decomposition of large scale applications
can be laborious and error-prone, AI-based systems to detect decomposition
strategies are gaining popularity. However, the usefulness of these approaches
is limited by the expressiveness of the program representation and their
inability to model the application's dependency on critical external resources
such as databases. Consequently, partitioning recommendations offered by
current tools result in architectures that result in (a) distributed monoliths,
and/or (b) force the use of (often criticized) distributed transactions. This
work attempts to overcome these challenges by introducing CARGO({short for
[C]ontext-sensitive l[A]bel p[R]opa[G]ati[O]n})-a novel un-/semi-supervised
partition refinement technique that uses a context- and flow-sensitive system
dependency graph of the monolithic application to refine and thereby enrich the
partitioning quality of the current state-of-the-art algorithms. CARGO was used
to augment four state-of-the-art microservice partitioning techniques that were
applied on five Java EE applications (including one industrial scale
proprietary project). Experiments demostrate that CARGO can improve the
partition quality of all modern microservice partitioning techniques. Further,
CARGO substantially reduces distributed transactions and a real-world
performance evaluation of a benchmark application (deployed under varying
loads) shows that CARGO also lowers the overall the latency of the deployed
microservice application by 11% and increases throughput by 120% on average.
