2017-01-13 25 views
3

私はモノリシックなWebアプリケーションをマイクロサービス(各サービスは独自のデータベースを持っています)に変換するためのpersonnalプロジェクトに取り組んでいます。相互通信マイクロサービス - どのように?

この時点で、MonolithicバックエンドはNodeJSで作成され、REST要求に応答することができます。 アプリケーションを複数のサービスに分割し始めたとき、私は次の問題に直面しました。それらの間のコミュニケーションをうまくいかにするには?

まず、私は次の例でREST呼び出し使用してみました:それを持続するためには、「ユーザーサービス」に 「登録サービス」は、そのデータベースに面白いものを挿入し、順方向(HTTPのPOST)ユーザー情報を「ユーザ」データベースに格納する。 この例から、2つのサービス、つまり2つのデータベースがあります。

私はこの瞬間にを認識しました。それは良い選択ではありませんでした。私の "登録サービス"は "ユーザサービス"に依存しているからです。彼らは一種のものであり、これは(私が読んだところから)ミクロサービス概念の反パターンです。

2番目のアイデアは、メッセージブローカー(RabbitMQなど)を使用することでした。 「登録サービス」は依然として興味深いものを独自のデータベースに挿入し、ユーザー情報をデータとしてキューにメッセージを発行します。 "User Service"はこのメッセージを消費し、データを "user"データベースに保存します。この概念を使用することにより、両方のサービスが完全に分離され、素晴らしいアイデアになる可能性があります。

BUT、クライアントに送信する応答(誰が "サービス登録"をリクエストしたか)最初のアイデアで「200を送ることができました、すべてが大丈夫です!それは問題ではありません。 2番目の考えでは、消費者(「ユーザーサービス」)がユーザーデータを保持しているかどうかわからないので、クライアントに返信する必要はありますか?

ウェブアプリケーションのショップ側でも同じ問題があります。クライアントは、購入したい商品を「注文サービス」に投稿します。これは、彼が "ユーザサービス"に持っているバーチャルマネーをチェックし、ユーザが十分な金額を持っているならば、 "デリバリサービス"に製品詳細を転送する必要があります。完全に隔離されたサービスでそれを行うには?

私はメッセージブローカで非同期要求/応答を行うためにクライアントからhttp要求時間を使いたくありません。

私の一部を啓発してくれることを願っています。

+0

この記事を読む:http://stackoverflow.com/questions/30213456/transactions-across-rest-microservices –

答えて

0

Tomを提案しています。ここでは、推論と解決策のトップに投票した回答が、あなたが信頼できる答えです。pretty good linkあなたの特定の問題は、登録サービスとユーザーサービスが別々であるという事実に根ざしている可能性があります。多分彼らはいけませんか?

理想的には、登録サービスは「UserRegistered」イベントをバスに公開し、200以上を返します。そのイベントのどの加入者についても気にするべきではありません。

0

私の問題は新しいものに私が持っているアーキテクチャを回し、このリンクをありがとうございました。同じ問題を抱えている人のために、私はこのリンクのおかげで、私が作ったことがあります:

  • 登録サービスとユーザーサービスを一緒に持ってきてください。どうして ?それはすべてユーザー情報(同じデータベース要件)に依存するため、Illiakaillが与えた解決策です。

  • ユーザーのお金の管理を「注文サービス」にのみ存在する「ウォレット」に分けます。そのため、注文が行われたときにユーザー情報を取得する必要はありません。ウォレット情報を確認するだけです。もしよう

を(ユーザが認証を行う場合、私はこのように、私は等を供給し、または使用されているウォレット認識する外部キーとして財布にユーザ名を使用することができる。JWTにユーザ名を符号化されました)私はメッセージブローカーをもう使用しません。なぜなら、今は私がメッセージブローカーを必要としないからです。しかし、私は郵送ロジックを新しいマイクロサービスに分割し、メッセージブローカーを使用して、必要な場合はすべてのマイクロサービスを介してメールを送信することができます。

私が間違っているかどうか教えてください。

関連する問題