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