短縮版:
複数のチームがあり、それぞれが複数のアプリを開発しています。彼らはいくつかのデータを共有する必要があります。これらのアプリを1つの大きなアプリに組み合わせてデータ統合を簡素化する必要がありますか、それともアプリを分離してデータ交換/キャッシュメカニズムを利用する必要がありますか?
長いバージョン:
それぞれが一連のアプリケーションに取り組んでいる多くのチームがあります。これらのアプリケーションの多くは、データを共有する必要があります。1つのオプションは、非同期メッセージングを使用して、すべての書き込みが発生する1つの記録システムを作成し、そのデータを必要とする他のシステムにブロードキャストすることです。これらのシステムは、必要なデータのビットを(データベース内の)読み取り専用キャッシュに格納します。
このレイアウトの利点は、1つのシステムが他のシステムに影響を与えることなく爆発できることです。また、個々のチームが個々のアプリケーションで作業するのも簡単になります。これにより、リリースのスケジューリングが容易になり、ナビゲートするコードベースが小さくなります。
もう1つのオプションは、これらのアプリが共有するデータが多すぎること、およびメッセージング/キャッシュによるオーバーヘッドが高すぎることを判断することです。この場合、これら3つのアプリケーションを1つの大きなアプリにマージすることを決定できます。次に、統合をアプリの個々のモジュールのサービス/トランザクションレイヤーに移動するため、データ統合の問題を完全に排除できます。言い換えると、MyGiantAppは、他のモジュールのトランザクションサービスAPIを介して相互に通信するさまざまなモジュール(jar、アプリコンテキストなど)に分割できます。私たちの場合、Springをサービスバスのように使用し、Webサービスや非同期メッセージングの代わりにメソッド呼び出しを使用します。
この2番目のオプションはデータ統合を簡素化しますが、開発を複雑にします。Xチームは同じコードベースで作業する必要があります。これは、ブランチ、継続的インテグレーション、個別のライブラリ/コンテキストなどを使用することでいくらか緩和できますが、結局のところ、それは私たち全員が構築している1つの嘆かわしいアーティファクトです。また、1つのチームのミスがアプリ全体に広がりやすくなりました。ヒープを吹き飛ばす1つのアプリは、すべてを停止させる可能性があります。
ソリューション#1をいつ使用するか、ソリューション#2をいつ使用するかをどのように決定しますか?