Короткая версия:
У нас есть несколько команд, каждая из которых разрабатывает несколько приложений.Они должны поделиться некоторыми данными.Должны ли мы объединить эти приложения в одно большее, чтобы упростить интеграцию данных, или же мы должны разделить их и использовать какой-то механизм обмена данными / кэширования?
Более длинная версия:
Мыесть несколько команд, каждая из которых работает над набором приложений.Многие из этих приложений должны обмениваться данными.Одним из вариантов является использование асинхронного обмена сообщениями для создания единой системы записи, в которой происходят все записи, и передача этих данных любым другим системам, которые в них нуждаются.Эти системы будут хранить нужные биты данных в кэше только для чтения (в своей базе данных).
Преимущество этого макета в том, что одна система может взорваться, не влияя на другие системы.Это также облегчает отдельным командам работу над своими индивидуальными приложениями.Это облегчает планирование выпусков, меньшую базу кода для навигации и т. Д.
Другой вариант - решить, что эти приложения совместно используют слишком много данных, а также что накладные расходы от обмена сообщениями / кэширования слишком высоки.В этом случае вы можете решить объединить эти три приложения в одно большее приложение.Затем вы полностью устраните проблему интеграции данных, поскольку вы перенесете интеграцию на уровень обслуживания / транзакции отдельного модуля приложения.Другими словами, MyGiantApp все еще можно разделить (jar, контексты приложений и т. Д.) На различные модули, которые общаются друг с другом через API транзакционных сервисов другого модуля.В нашем случае мы будем использовать Spring почти как служебную шину с вызовом метода вместо веб-служб или асинхронного обмена сообщениями.
Хотя этот второй вариант упрощает интеграцию данных, он усложняет разработку.Теперь X командам приходится работать на одной кодовой базе.Это можно несколько ослабить, используя ветки, непрерывную интеграцию, отдельные библиотеки / контексты и т. Д., Но в конце концов это все еще один плачевный артефакт, который мы все строим.Кроме того, теперь ошибки одной команды могут легче распространяться на все приложение;одно приложение может выкинуть кучу.
Как вы решите, когда использовать решение № 1, а когда - решение № 2?