1

4 つの Dart サーバーを実行していて、リクエストを転送したい場合、Dart でそれを行うにはどうすればよいですか? 一方では、リクエストに効率的に対応したいだけでなく、特定のリクエストを別の方法で処理したり、都市からの IP をどこかで処理したりしたいと考えています。したがって、私はセッション ID を評価し、このセッションは server2:1234 によって提供される必要があると言います。つまり、応答は、server1:80 を介してすべてをルーティングするのではなく、理想的にはそのサーバーによって出力されます。これは、server1:80 の可用性を大幅に低下させるためです。

「hello world」の数値:
server1:80 は約 8000
要求/秒を処理できます 4 つのサーバーは約 15-20000 要求/秒を処理できます (フロントエンドとして nginx を使用)

Isolate は httprequests を処理できません。Afaik では、Isolate のリクエストを解析/ダウングレードする必要がありますが、これはさらに悪いことです。

2 つの質問:

メイン インスタンスをブロックせずにリクエストを転送するにはどうすればよいですか?
(nginx ロードバランシングのように)
リクエストをアイソレートに理想的にルーティングするにはどうすればよいですか?
(私が見つけた例はすべて時代遅れであるか、私が好まないパターンを使用していました: すべてのリクエストに対して分離を生成する...良いアイデアではありません.Isolatesでサーバーインスタンスを動的に作成し、そこにリクエストを転送したいと思います)

私が見る主な問題は、メモリを共有していないことです。したがって、問題は、複製コピーを持たずにデータをルーティングすることさえ可能かどうかです。サーバーが異なるマシンで実行されている場合、重大なトラフィック オーバーヘッドが発生します。動的にヘッダーをリダイレクト/書き換える方法が最善だと思います。しかし、そのためにも、ポート 80 で 4 ~ 16 個の「スレッド」を効率的に使用する必要があります。Afaik ダーツでは不可能です。どうするのが一番いいですか?

ここで助けていただければ幸いです。

アップデート

このパッチを使用すると: https://codereview.chromium.org/250513002/
実際には、古いパッチと同様に機能する並列サーバー プロセスを実現できます: https://codereview.chromium.org/25511002/

どちらの場合も同じポートでリッスンしますが、2 つの場合は別のプロセスを実行してポートを再利用できますが、1 つの場合はプロセスを分離して実行し、ServerSocketReference を共有できます。

古いパッチにはいくつかの調整が必要でしたが、最終的には新しい SDK で、少なくとも nginx を取り除くことができます。nginx プロキシ パスを保存すると、Hello World リクエストが約 10 ~ 20% 増えます。2 つの並列プロセスでは約 140% のパフォーマンスを達成しましたが、3 と 4 ではわずか 145% でした。しかし、私のラップトップでは合計約10kリクエスト/秒で、これは問題ありません(ここで美しさで死にたいとも述べています;))

これは非常に実験的なものであり、将来どのように機能するかは誰にもわかりません。よりクリーンなアプローチと思われるため、最初のパッチをお勧めします。

これが私が以前に見つけたかった基本的な例です:)

import 'dart:io';
import 'dart:isolate';
isoserve(List d){
    d[0].create().then((server){
    HttpServer httpserver = new HttpServer.listenOn(server);
             httpserver.listen((HttpRequest hr){
             hr.response.write(d[1]);
         hr.response.close();
     });
    });
}

main() { 
    ServerSocket.bind(InternetAddress.ANY_IP_V6, 5555).then( (serverSocket) {
        Isolate.spawn(isoserve,[serverSocket.reference,"aloha world"]);
        Isolate.spawn(isoserve,[serverSocket.reference,"aloha world 2"]);
        });
}

UPDATE == SDK 1.4 で動作するようになりました

4

1 に答える 1

0

Dart 1.13 は、sharedサーバー ソケットと HttpServer インスタンスを作成するときにフラグを追加します。これにより、複数の分離株を同じポートにバインドできます。着信接続要求は、リッスンしているアイソレートに均等に分散されます。


これには未解決のバグはないようです。この情報を見つけました: https://groups.google.com/a/dartlang.org/forum/#!topic/misc/yYNRbBm0zmM

Dart チームは、Isolate 間で List/Map/String/num/bool 以外のコピーを許可する「transferables」を検討しています。これにより、接続を別の Isolate に転送できるようになります。この議論には、この問題に対する他のいくつかの考えや試みも含まれています。

于 2014-05-06T11:51:41.130 に答える