web-dev-qa-db-ja.com

マイクロサービスは、分散型ビジネスロジックまたは集中型を使用して結合を緩めますか?

以下のシナリオで疎結合を実現するにはどうすればよいですか。

N個のマイクロサービス(Callerと呼びましょう)では、さまざまなコントラクトで実行されるロジックまたはビジネス(Workerと呼びましょう)が必要です。コントラクトは異なりますが、ロジックはほぼ同じであり、DBワーカーに集中管理されて格納されているデータに対する作業は、各呼び出し元のマイクロサービスに関して少し進化する可能性があります。

また、Workerには常に同じデータを使用できることを付け加えておきます。

だから、私は考慮すべき以下のオプションについて考えています:

  1. 小さなロジック変更があり、データを維持するマイクロサービスからデータを取得する可能性のあるすべての発信者マイクロサービスにロジック(ビジネス)が追加されていますか?
  2. ワーカーの集中型ロジックを備えた単一のマイクロサービスから複数のエンドポイント(個別のコントラクトがある)を作成してデータを維持しますか?
  3. 単一のエンドポイントがあり、複数のマイクロサービス契約をマージし、ワーカーの集中ロジックを使用してデータを維持していますか?

また、どのタイプのコミュニケーションがKafka vs Restに適合し、どのようなシナリオになりますか?

2
Vishal nigam

これが私の理解からあなたが言ったことの履歴書です(検証してください):

  • N個のマイクロサービスがあります。N〜 = 10(成長する可能性があります)。それらを消費者と呼びましょう
  • 各マイクロサービスは必須データ
  • 必要なデータは1つのデータベースに保存されます
  • マイクロサービスごとにこのデータが異なる必要があります

これらの要件をサポートするために、特定のマイクロサービスが消費者が必要とするデータを管理することを提案します。さらに、この新しいプロデューサーは、コンシューマーに必要なビジネスロジックを維持します。

3つの質問に答える前に、マイクロサービスは非常に分離されているため、アンチマイクロサービスになる可能性があることを覚えておいてください。たとえば、ユーザーの名前を維持するためだけに特定のテクノロジースタックを使用して新しいアプリケーションを作成し、別のユーザーが個人情報を維持することは理想的ではありません。したがって、技術的な観点から問題を見るのではなく、ビジネスの側面を取り入れてください。

  1. 小さなロジック変更があり、データを維持するマイクロサービスからデータを取得する可能性のあるすべての発信者マイクロサービスにロジック(ビジネス)が追加されていますか?

    • ビジネスロジックが呼び出し元に固有のものである場合、それは呼び出し元にとどまり、ワーカーがデータベース内の情報のみを提供できるようにする必要があります。
  2. ワーカーの集中型ロジックを備えた単一のマイクロサービスから複数のエンドポイント(個別のコントラクトがある)を作成してデータを維持しますか?

    • マイクロサービスアーキテクチャを使用する場合、このデータは1つのマイクロサービス(ワーカー)だけで管理する必要があります。誰もがデータを必要とする(そしてデータを編集できる)場合は、ワーカーにデータを要求する必要があります。複数のエンドポイントは、他のサービスまたは可能性のある人間が必要とするさまざまな契約になります。つまり、利用可能なデータのリストを取得し、一部のデータを削除し、データを更新します。
  3. 単一のエンドポイントがあり、複数のマイクロサービス契約をマージし、ワーカーの集中ロジックを使用してデータを維持していますか?

    • これは、発信者が何を必要としているかによって異なります。新しい呼び出し元ごとに、ワーカーから同じエンドポイントを再利用し、ワーカーに新しいロジックを追加すると、他の呼び出し元とワーカーの間の互換性が失われる可能性があります。これは、エンドポイントにロジックが不要で、純粋に情報を送信していて、呼び出し元が独自のロジックをデータに適用している場合に機能します。

全体として、呼び出し側ごとに必要なビジネスロジックを正確に再確認してください。ワーカーのみがこのロジックを適用できる場合は、異なるエンドポイント(コントラクト)を使用します。ロジックが呼び出し元に固有である場合は、ロジックを呼び出し元に移動し、エンドポイントを可能な限り単純に保ちます。その結果、そのエンドポイントは、新しい呼び出し元がワーカーからの新しいAPIを必要とするまで再利用できます。

REST vs Kafka

あなたの最後の質問については、これらを考慮してください:

  • Kafkaは、パブリッシャー/サブスクライバーパターンを使用するテクノロジーです。
  • RESTは、データを時間で表すために使用できるアーキテクチャーです。

アプリケーションで何かを通知および/または通知する必要がある場合にのみ、パブリッシャーサブスクライバーパターンを使用します。あなたの場合、発信者がKafkaを使用している場合、発信者は基本的にワーカーからのデータの更新通知を待機します。それはまた、彼らが彼らの側でデータを永続化する必要があることを意味します。呼び出し元とワーカーの両方が同じシステムにある場合、これは不必要な複雑さです(データベースからデータを読み取るだけの場合)。

1
gumol