2017-10-31 4 views
1

大規模なファイルサーバー(2百万回の同時)を作成しようとしていて、多くの検索の後、Vertxがそのようなタスクに最適であることが分かりました。私は、コードのこの部分を思い付いた複数のファイルアップロードリクエストでVertxが遅くなる

public void uploadFile(Vertx vertx,RoutingContext ctx,String targetFilePath,FileUploadListener mListener) { 
     ctx.request().pause(); 

     new File(targetFilePath).getParentFile().mkdirs(); 

      vertx.fileSystem().open(targetFilePath, new OpenOptions(), new Handler<AsyncResult<AsyncFile>>() { 

      @Override 
      public void handle(AsyncResult<AsyncFile> arg0) { 
       try { 
        AsyncFile file = arg0.result(); 
        if(file == null) { 
         Logger.Log("file null"); 
         mListener.onFail(); 
         return; 
        } 
        Pump pump = Pump.pump(ctx.request(), file); 

        ctx.request().endHandler(v1 -> file.close(v2 -> { 
           mListener.onSuccess(new File(targetFilePath)); 
        })); 
        pump.start(); 
        ctx.request().resume(); 

       }catch (Exception e) { 
        e.printStackTrace(); 
        Logger.Log(e); 
        mListener.onFail(); 
        return; 
       } 
      } 
     }); 
    } 
複数の要求が同時にこの方法を使用してファイルをアップロードしようとすると、(9メガバイトのファイルの1秒がかかりますが、9メガバイトのファイルの100のために1分かかります)どのようにこれまで

アップロードのプロセスが遅くなります。同時実行性を向上させるために欠けているものがいくつかあります。これはWindows 10でこれを実行して以来、ソケットにはこのような制限がありますか?おかげ

ここでは私のMainVerticleある

public class MainDeployment extends AbstractVerticle{ 


private Router router = Router.router(vertx); 

    @Override 
    public void start() throws Exception { 

     //GUI.display("Sub Verticle Has Deployed"); 

    // Different ways of deploying verticles 

    // Deploy a verticle and don't wait for it to start 

    for(Entry<String, MyHttpHandler> entry : MyVertxServer.map.entrySet()){ 
     router.route(entry.getKey()).handler(new Handler<RoutingContext>() { 

      @Override 
      public void handle(RoutingContext ctx) { 
       System.out.println(ctx.request().uri()); 

       String[] handlerID = ctx.request().uri().split(ctx.currentRoute().getPath()); 

       String suffix = handlerID.length > 1 ? handlerID[1] : null; 
       entry.getValue().Handle(ctx, new VertxUtils(), suffix); 

      } 
     }); 
    } 

    MyVertxServer.server.requestHandler(router::accept); 

    } 

} 
+0

どのように100個のファイルをアップロードするのだろうか。同じマシンを使用していますか?あなたのVertxは同じマシンで動作しますか?そしてWIndows 10について言及して以来、たぶんあなたは単一のHDDを持っていますか? –

+0

本当に:)、それは私の一日を幸せにすることを意味しますか? – Reza

+0

と同じクライアントを使用してアップロードされているすべて – Reza

答えて

1

あなたのコードは正常に見えます。あなたのテスト方法はそうではありません。 Vertxとはまったく関係ありません。 まず、ダウンロードに使用したのと同じマシンからアップロードする(Vertexをダウンロードした観点からダウンロードする)、Vertxが利用できるリソースの量を半分に減らすことができます。おそらく、4つのCPUがありますか?そのうち2人はアップロード中です。他の2人だけがあなたのリクエストに対応します。

次にネットワークがあります。実際には、私は秒に9Mbをアップロードできることに驚いています。そこには深刻なネットワークがあります。

もちろん、HDDがあります。私はあなたの実験のために、あなたがメモリにキャッシュしたファイルをアップロードすることを願っています。それ以外の場合は、100個のプロセスがこのファイルを何度も何度も読んでいますが、他の100個はこれを書き込もうとしています。一流のSSDを持っていても、それはかなりの難題です。

だから、すべてのことを言って、あなたは今数学をする必要があります。まず、クライアントとは異なるマシンにコードをデプロイします。

+0

ローカルホストからアップロードされているのは驚きではありません:) と私の願いを込めて私の日を作るためのあなたの右の感謝:)私はより良い経験的環境 – Reza

関連する問題