2016-10-06 12 views
1

私のアプリケーションのユーザーは地理的に分散しており、データはさまざまな地域に保存されています。各地域には独自のデータセンターとデータベースサーバーがあります。strongloop/loopback - ルート値に基づいて接続文字列を変更します

Iは、以下のように、ユーザは、アクセスしに接続したい領域を示すルート値を含めたい:

/API /領域/ 1 /位置/

/API /地域/ 2 /地/

/API /地域/ 3 /地/

地域によって渡され、私は、接続文字列を変更したいです 使用されています。私はこれがミドルウェアチェーンのどこかで実行できると仮定していますが、どこ/どのように分かっていません。どんな助けもありがとう!

+0

を行う最も簡単なのですか?あなたが 'POST api/region/1/locations /'を実行した場合、例えば米国のようなデータソースとid 2で持続したい場合は、フランスにあるデータソースを使い続けますか? – Overdrivr

+0

@Overdrivrはい、それはまさに正しいです –

答えて

2

(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``によって

+1

すばらしい答えをありがとう。私はupvotedしたが、どちらのアプローチをとるべきかについてまだ決定していない(そして3つのオプションすべてを分析する可能性が高い)。私がもう少し見直すまで、私は「未回答」という質問を残します。再度、感謝します! –

+0

確かに、私は投稿してください私はフィードバックに興味がある – Overdrivr

関連する問題