(doesntのが文書化されているように見えるが、それへの参照がthere行われる)
ループバックメソッドMyModel.attachTo
を提供して何を行うべきではありません。
しかし、それは静的メソッドなので、モデル全体に影響を与えます。単一インスタンスではありません。
リクエストごとに機能するには、データソースメソッドの呼び出しの直前にDBを切り替えて、間に非同期が開始されないようにする必要があります。私はこれが可能だとは思わない。
これは、操作フックを用いた例である(およびすべてのデータソースを定義し、datasources.json
に以下dbRegion1
を含む)
悪いではなく、その下に行います。参考まで
Region.observe('loaded', function filterProperties(ctx, next) {
app.models.Region.attachTo(app.dataSources.dbRegion1);
}
しかし、その後、あなたが最も可能性が高いでしょう顔並行性の問題、あなたのAPIを短時間で複数のリクエストを受信したときのために。
(もう1つの方法は、サーバーがもはや真のステートレスではなく、実行は入力だけでなく共有状態にも依存するということです)。
フックの後に呼び出されるメソッドは、何かの非同期がフックとデータソースメソッドへの実際の呼び出しの間でトリガされた場合、これがケースになります要求1. region1
を使用するように期待していた間、フックは、要求2用region2
を設定することがあります。
最終的に、私はあなたがそれを行うべきではないと思います。私はちょうどそこに置いている人がいるので、それは他のSOの投稿では推奨しているが、それはひどいことだ。
潜在的なオプション1
が再ルーティングする外部の再ルーティングサーバー、適切な領域データベースへのAPIサーバからの要求を構築します。
APIサーバーのloopback-connector-rest
を使用して、このマイクロサービスを使用し、すべてのモデルの単一のデータソースとして使用します。これは、データベース選択の抽象化を提供します。
もちろん、マイクロサービスを実装する問題はありますが、データベースシャーディングをサポートするループバック以外のORMを見つけて、そのマイクロサービスで使用することもできます。
潜在的オプション2
MySQL
クエリのルータとして機能するカスタムのループバックコネクタを作成します。クエリ内で渡された領域の値に応じて、適切なDBにクエリを再ルーティングします。
オプション3
より分散アーキテクチャを使用してください。 リージョン固有のデータを永続化するための、リージョン固有のサーバーを作成します。 たとえば、3つの異なるサーバーを実行します。各サーバーはそれぞれ1つの地域に対して構成されています。 +ルーティング用の共通サーバー
次に、単一のユーザー向けREST APIサーバーのルーティングミドルウェアを構築します。 基本例:
var express = require('express');
var request = require('request');
var ips = ['127.0.0.1', '127.0.0.2'];
app.all('/api/region/:id', function (req, res, next) {
console.log('Reroute to region server ' + req.params.id);
request(ips[req.params.id], function (error, response, body) {
if (err) return next(err);
next(null, body);
});
});
たぶん、このオプションは `リクエストがpersisted`されるデータソースを変更する意味ですか接続STRING``によって
を行う最も簡単なのですか?あなたが 'POST api/region/1/locations /'を実行した場合、例えば米国のようなデータソースとid 2で持続したい場合は、フランスにあるデータソースを使い続けますか? – Overdrivr
@Overdrivrはい、それはまさに正しいです –