精简版:
我们有多个团队,每个团队都在开发多个应用程序。他们需要分享一些数据。我们应该将这些应用程序组合成一个更大的应用程序以简化数据集成,还是应该将它们分开并利用一些数据交换/缓存机制?
更长的版本:
我们有许多团队,每个团队都在处理一组应用程序。其中许多应用程序需要共享数据。一种选择是使用异步消息传递来拥有一个记录系统 - 所有写入都在其中发生 - 并将该数据广播到需要它的任何其他系统。这些系统会将他们需要的数据位存储在只读缓存中(在他们的数据库中)。
这种布局的好处是一个系统可以在不影响其他系统的情况下崩溃。它还使各个团队更容易处理各自的应用程序。它使发布计划更容易,更小的代码库导航等。
另一种选择是确定这些应用程序共享太多数据,并且消息/缓存的开销太高。在这种情况下,您可以决定将这三个应用程序合并为一个更大的应用程序。然后,您将完全消除数据集成问题,因为您将集成移动到应用程序的单个模块的服务/事务层。换句话说,MyGiantApp 仍然可以拆分(罐子、应用程序上下文等)成各种模块,这些模块通过另一个模块的事务服务 API 相互通信。在我们的例子中,我们几乎像使用服务总线一样使用 Spring,使用方法调用而不是 Web 服务或异步消息传递。
虽然第二个选项简化了数据集成,但它使开发复杂化。现在 X 团队必须在相同的代码库上工作。这可以通过使用分支、持续集成和单独的库/上下文等来缓解,但归根结底,它仍然是我们都在构建的一个可悲的工件。此外,现在一个团队的错误可以更容易地传播到整个应用程序;一个应用程序炸毁堆可能会全部关闭。
您将如何决定何时使用解决方案 #1 以及何时使用解决方案 #2?