Когда объединять несколько приложений, чтобы упростить интеграцию их данных?

Краткая версия:

У нас есть несколько команд, каждая из которых разрабатывает несколько приложений. Им нужно поделиться некоторыми данными. Должны ли мы объединить эти приложения в одно большее, чтобы упростить интеграцию данных, или мы должны хранить их отдельно и использовать какой-либо механизм обмена / кэширования данных?

Более длинная версия:

У нас есть несколько команд, каждая из которых работает над набором приложений . Многим из этих приложений необходимо обмениваться данными. Один из вариантов - использовать асинхронный обмен сообщениями, чтобы иметь одну систему записи, в которой происходят все записи, и транслировать эти данные в любые другие системы, которым они нужны. Эти системы будут хранить нужные им биты данных в кэше только для чтения (в своей базе данных).

Преимущество такой схемы заключается в том, что одна система может взорваться, не затрагивая другие системы. Это также упрощает работу отдельных команд над отдельными приложениями. Это упрощает планирование выпусков, упрощает навигацию по кодовой базе и т. Д.

Другой вариант - решить, что эти приложения совместно используют слишком много данных, и что накладные расходы от обмена сообщениями / кеширования слишком высоки. В этом случае вы можете решить объединить эти три приложения в одно более крупное приложение. Тогда вы полностью исключите проблему интеграции данных, поскольку вы d перенести интеграцию на сервисный / транзакционный уровень отдельного модуля приложения. Другими словами, MyGiantApp все еще можно разделить (банки, контексты приложений и т. Д.) На различные модули, которые взаимодействуют друг с другом через API транзакционных сервисов другого модуля. В нашем случае мы будем использовать Spring почти как служебная шина с вызовом метода вместо веб-служб или асинхронного обмена сообщениями.

Хотя этот второй вариант упрощает интеграцию данных, он усложняет разработку. Теперь X-команды должны работать над одной и той же кодовой базой. Это можно несколько облегчить, используя ветки, непрерывную интеграцию и отдельные библиотеки / контексты и т. Д., Но, в конце концов, это все еще один прискорбный артефакт, который мы все создаем. Кроме того, теперь ошибки одной команды могут легче распространяться на все приложение; одно приложение, выбрасывающее кучу, может уничтожить все.

Как вы решите, когда использовать решение №1, а когда - решение №2?

1
задан Robert Campbell 4 October 2010 в 14:19
поделиться