Short version:
We have multiple teams each developing multiple apps. They need to share some data. Should we combine these apps into one larger one to simplify data integration or should we keep them separate and utilize some data exchange/caching mechanism?
Longer version:
We have a number of teams each working on a set of applications. Many of these applications need to share data. One option is to use asynchronous messaging to have one system of record - where all writes occur - and to broadcast that data out to any other systems that need it. These systems would store the bits of data they need in a read only cache (in their database).
The benefit of this layout is that one system can blow up without affecting the other systems. It also makes it easier for individual teams to work on their individual applications. It makes scheduling of releases easier, smaller code base to navigate, etc.
Another option is to decide that these apps share way too much data, and that the overhead from the messaging/caching is too high. In this case you could decide to merge these three applications into one larger app. You would then completely eliminate the data integration problem, since you'd move the integration into the app's individual module's service/transactional layer. In other words, MyGiantApp could still be split (jars, app contexts, etc) into various modules who speak with each other via transactional services API of the other module. In our case we'd be using Spring almost like a service bus, with method invocation instead of web services or async messaging.
While this second option simplifies data integration, it complicates development. Now X teams have to work on the same code base. This can be eased somewhat by using branches, continuous integration, and separate libraries/contexts, etc, but at the end of the day it's still one deplorable artifact we're all building. Also, now the mistakes of one team can spread more easily to the entire app; one app blowing out the heap could take all down.
How would you decide when to use solution #1 and when to use solution #2?