2017-10-30 18 views
0

マイクロサービスとイベントの調達、およびサービス間のデカップリングについては、私が読んできました。私は明確ではない2つの概念があります。第1に、マイクロサービスアーキテクチャでは、各サービスを独立して開発することができます。サービス間の通信依存性をどのように考慮しますか?イベントソースを使用したEDAでのマイクロサービス通信

たとえば、サービスAとサービスBが通信する必要がある場合、Aは、Bがリッスンして行動する必要がある中央バスにイベントを送信する必要がありますが、これは多くの依存関係を作成するようです。今、私がサービスBを開発している場合、私はサービスAが生成できるすべてのイベントを知る必要があります。また、サービスAが新しいイベントを追加する場合、サービスBもその新しいイベントを処理するために変更する必要があります。これらのすべてが依存性の悪夢を作り出しているようであり、あなたは本当にそれぞれのサービスを「独自に」開発することはできないようです。

第2に、要求/応答タイプのシナリオをAPIゲートウェイまたはプロセスマネージャレベルでどのように処理しますか?最上位レベルの要求が、呼び出し元に応答を返す前に処理する必要のある一連のカスケードまたは相互依存するイベントを発生させる場合、これはマイクロサービスに適したシナリオですか?

答えて

1

イベントソースはイベントドリブンアーキテクチャではありません。理論的には、統合のためにイベントを使用しないエコシステム内で、内部イベントソースのBounded Context/Microserviceを持つことができます。また、BC以外のイベントでイベントを統合することもできます。

イベント駆動型はasynchronous microservice integrationの1種類です。同期統合も可能です。私はそれが暗黙のうちにイベントベースの統合とあなたの質問を対比しているのかどうかはわかりませんが、あなたが管理しなければならない依存関係はどちらの場合も非常に似ています。だから、

、少なくともこれ以上あなたは一般的に、私はサービスBを開発していた場合、サブシステムAは、今すぐサブシステムB.

に依存したときに持っているものよりも私は考えることができていない依存悪夢、 、私はあなただけあなたが興味を持っているものに加入し、 サービスAが

ありませんを生成することができるイベントのすべてを知っている必要があります。

また、サービスAが新しいイベントを追加する場合、サービスBはその新しいイベントを処理するために も変更する必要があります。

また、興味がない場合はありません。

これはすべて依存関係の悪夢を作り出しているようで、 は本当にそれぞれのサービスを独自に開発することはできません。

サービスが別のサービスに依存するようになると、明らかに各サービスを個別に開発することはできません。あなたは、イベントを通じた緩やかなカップリングが許すような「独立性」を過大に解釈しているかもしれません。

+0

それは意味があります。私は開発ワークフローの詳細を考えていました。今は2つの異なるサービス/プロジェクトの間に依然として依存関係がありますが、2つの別々のコードベースに居住している場合を除き、相互依存関係があれば、同期して一緒に展開する必要があります。それらを一緒に持つことは、これを管理することがはるかに難しいようです。 –

+0

モデルデザインについては、多くのオプションがあります。 Gregor Hohpeの[Enterprise Integration Patterns](https:// www。com)は、DDDのコンテキストマッピングパターン(共有カーネル、顧客/サプライヤ、分離方法など)を見ることができます。amazon.com/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683)には、モデル統合のための数多くの興味深い戦略があります。 – guillaume31

+0

モデルデザイン、統合スタイル(非同期と同期)、および技術プロトコルは異なるが、サービスの統合に関する懸念が重複している。それらを融合させることは必ずしも容易ではありませんが、ソリューションを構築する際に念頭に置いておくべきことだと思います。 – guillaume31

0

最初に、マイクロサービスアーキテクチャでは、各サービスを独立して開発することができます。サービス間の通信依存性をどのように考慮しますか?

メッセージ - 交換したメッセージに集中してサービス間の直接結合を壊し、古いサービスが新しいサービスからメッセージを読むことができるように、前方および後方互換性のあるスキーマの変更戦略に集中します。 )。

グレッグ・ヤングは、これらのアイデアについて、彼の著書event versioningに書いています。

トップレベルの要求が、呼び出し元に応答を返す前に処理する必要のある一連のカスケードまたは相互依存するイベントを発生させる場合、これはマイクロサービスに適したシナリオですか?

古いデータをデザインに組み込む限り、実際は問題ありません。

基本的に、クエリへの応答はクライアントへの移動に時間がかかります。データが転送中にすべてのライターをロックアウトしない限り、パケットが飛行中にシステムの「真実」が変更される可能性があります。

したがって、クエリが状態「今」を記述するのではなく、クエリが過去のある時点の状態を記述するように指定します。したがって、サービスAにクエリ要求を送信し、結果にサービスBのデータが含まれている場合、クエリ結果には、特定の時点でのAのキャッシュされたBデータのコピーが含まれます。

データを取得するためのAのクエリは、Aに送信された要求に関して非同期です。クエリから返されたデータがBから到着した場合、より古くなったデータで応答します。

はい、CがBに変更を書き込み、肯定応答を取得した後、A ...をクエリし、すでに書き込まれ、確認応答された変更を含まない応答を返します。

したがって、普遍的なクロックがないというソリューションを構築します。

しかし、最初の質問では、サービスBの開発者と思われますが、私はサービスAから起動できるすべてのイベントを知る必要があり、新しいイベントがある場合は、追加されました。

すべてのイベントはありません。イベント表現をデシリアライズできるように、また消費者が気にするイベントを認識できるようにするには、avroやjsonやプロトコルバッファなどの共通の形式が必要ですが、単一のデフォルトハンドラに認識を渡すことができます。

+0

2番目の質問を明確にしてくれてありがとうございます。しかし、最初の質問では、サービスBの開発者のように見えますが、サービスAから発生するすべてのイベントを知る必要があります。新しいイベントが追加された場合、私は継続的な依存関係があります。したがって、Aが新しいイベントBを追加すると、Bも同様に変更する必要があります。これは私が話している依存関係で、問題が多く発生するようですが、その処理方法がわかりません。 –

関連する問題