2017-09-19 9 views
2

これは、(マイクロサービスの導入に新しい)POSTデータベースサービスを設計する方法に関する非常に一般的かつ基本的な質問です。 SaveCustomerマイクロサービスがあるとします。あなたは顧客データを渡すPOSTを行い、SaveCustomerサービスはデータ(JSON)を受け取ってデータベースに挿入します。データベース象牙質マイクロサービス(POST)を設計する方法

ネットワークの輻輳などにより、クライアントは再試行して重複要求を送信する可能性があります。重複レコードをデータベースに挿入しないようにするにはどうすればよいですか?

おかげ オベイド

+0

[POST]は[idempotent]ではありません(http://restcookbook.com/HTTP%20Methods/idempotency/) – salparadise

+0

これで、データベースにレコードを挿入するサービスをどのように実装する必要がありますか?任意の推奨事項、私はマイクロサービスに新しいので – obaid

答えて

1

POSTを使用して、それぞれが固有のID、例えばGUIDをコマンドに割り当てることによって、これを実装することができ冪等されていませんが。次に、マイクロサービス上でコマンドを実行する前に、コマンドがまだ処理されていないことを確認します。もしそうであれば、それを無視します。それ以外の場合は、実際の更新を行い、コマンドを実行済みとしてマークする実コンポーネントに送信します。それはOpen/close principleSingle responsibility principle以下、コアロジックを飾ることができ、追加の構成要素として実装することができるように

この解決策はエレガントです。さらに、Dependency injection root configurationを使用して、このidem-potency保護を使用することもできます。

+0

あなたの応答をありがとう、どのように通常そのようなサービス(休憩サービスを挿入するdbレコード)を実装する方法を示すことができる任意のリソース/例/チュートリアルです、どのようにそのようなサービスを実装する方法他のサービスからこのサービスを呼び出す(再試行などの処理を意味する)。 – obaid

+0

私のシナリオ:処理後にレコードを挿入する必要のあるマイクロサービスがありますが、このサービスを呼び出すときにユーザー/クライアントに待ち時間(DBが圧倒される場合があります)が発生しないようにします。したがって、私はインサートを非同期にする、つまり挿入文をキュー(Kafka)に送り、コンシューマクライアントを介してそれらを処理することを考えています。このアプローチは良い解決策ですか?データが失われず、データベースのパフォーマンス上の問題によりユーザーエクスペリエンスが低下する必要がない、他のソリューションもありますか? – obaid

+0

@obaidコマンドキューの使用は解決策です。他の解決策は、イベントドリブンアーキテクチャを使用することです。したがって、クライアントサービスはイベントを公開する必要があります。次に、Saga/Processマネージャーは、そのイベントをサブスクライブまたはポーリングしてピックアップし、次のマイクロサービスにコマンドを発行し、何か問題が生じた場合に再試行します。このアーキテクチャは優れていますが、マイクロサービスはドメイン/サブドメインで分割する必要があるため、大きなリファクタリングも意味します。あなたは境界のある文脈でモノリスを分割するDDDアプローチ(ドメイン駆動型設計)を見てください。 –

関連する問題