私は、モノリシックWebアプリケーションをマイクロサービスに変換するという個人的なプロジェクトに取り組んでいます(各サービスには独自のデータベースがあります)。
この時点で、モノリシックバックエンドはNodeJSで作成され、RESTリクエストに応答できます。アプリケーションを複数のサービスに分割し始めたとき、次の問題に直面しました:それらの間の通信を行う方法うまく?
最初にREST callを使用しようとしました。次の例では、「Register Service」はデータベースに興味深いものを挿入し、次にユーザー情報を「User Service」に転送(HTTP POST)して永続化します。 「ユーザー」データベースに。この例から、2つのサービス、つまり2つのデータベースがあります。
私はこの瞬間に気づきましたそれは良い選択ではありませんでした。私の「登録サービス」は「ユーザーサービス」に依存しているからです。それらは一種の結合であり、これはマイクロサービスの概念のアンチパターンです(私が読んだことから)。
2番目のアイデアは、RabbitMQのようにメッセージブローカーを使用することでした。 「サービスの登録」は、それでも興味深いものを独自のデータベースに挿入し、ユーザー情報をデータとしてキューにメッセージを公開します。 「ユーザーサービス」はこのメッセージを消費し、データを「ユーザー」データベースに保持します。この概念を使用することにより、両方のサービスが完全に分離され、優れたアイデアになる可能性があります。
しかし、クライアントに送信する応答はどうですか(「サービスの登録」を要求した人)。最初のアイデアで、「200、すべて大丈夫です!」を送信できます。または400。それは問題ではありません。 2番目のアイデアでは、コンシューマー(「ユーザーサービス」)がユーザーデータを永続化したかどうかわからないので、クライアントに何を返信する必要がありますか?
Webアプリケーションのショップ側でも同じ問題が発生します。クライアントは、購入したい商品を「注文サービス」に投稿します。これは、彼が持っている仮想通貨を「ユーザーサービス」にチェックインし、ユーザーが十分なお金を持っている場合は、製品の詳細を「配信サービス」に転送する必要があります。完全に分離されたサービスでそれを行う方法は?
クライアントからのhttpリクエスト時間を使用して、メッセージブローカーで非同期リクエスト/リプライを行いたくありません。
皆さんの何人かが私を啓発してくれることを願っています。
コートを使用してください、それは揺れます!真剣に。 https://github.com/dashersw/cote
時間内-service.js.。
const cote = require('cote');
const timeService = new cote.Responder({ name: 'Time Service' });
timeService.on('time', (req, cb) => {
cb(new Date());
});
client.jsで...
const cote = require('cote');
const client = new cote.Requester({ name: 'Client' });
client.send({ type: 'time' }, (time) => {
console.log(time);
});
このリンクをありがとう、
私の問題は、私が持っているアーキテクチャを新しいものに変えます。私と同じ問題を抱えている人々のために、このリンクのおかげで私が作ったものがあります:
登録サービスとユーザーサービスを統合します。どうして ?それはすべてユーザー情報に依存するため(同じデータベース要件)、それがIlliakaillIが提供したソリューションです。
ユーザーのお金の管理を「注文サービス」にのみ存在する「ウォレット」に分割します。そのおかげで、注文時にユーザー情報を取得する必要がなく、ウォレット情報を確認するだけで済みます。 (ユーザーが認証を実行するときにJWTでユーザー名をエンコードしました。したがって、ウォレットでユーザー名を外部キーとして使用して、どのウォレットが提供または使用されているかなどを認識できます。)
ご覧のとおり、今のところメッセージブローカーは必要ないため、メッセージブローカーは使用していません。ただし、メールロジックを新しいマイクロサービスに分割し、必要に応じてメッセージブローカーを使用してすべてのマイクロサービスを介してメールを送信できます。
私が間違っているかどうか教えてください、しかしそれは私には素晴らしいですね。