2017-10-31 1 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; 
       } 
      } 
     }); 
    } 
여러 요청이 동시에이 방법을 사용하여 파일을 업로드하려고 할 때 (A 9메가바이트 파일을 1 초 걸리지 만 9메가바이트 파일의 100 일분 소요) 방법 적

업로드 프로세스가 느려집니다. 거기에 어떤 일이 동시성을 향상시키기 위해 누락 된 또는 메신저 윈도우 10에서 실행하기 때문에, 소켓 속도 제한이 있습니까? 감사

여기

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

당신의 코드가 잘 보이는 내 MainVerticle입니다. 귀하의 테스트 방법론은 그렇지 않습니다. Vertx와는 아무런 관련이 없습니다. 먼저, 다운로드하는 데 사용하는 것과 동일한 컴퓨터에서 업로드 (업로드 한 관점 다운로드 파일의 Vertx)하면 Vertx에서 사용할 수있는 리소스의 양이 절반으로 줄어 듭니다. 아마 4 개의 CPU가 있겠지? 그 중 2 명이 업로드 중입니다. 다른 두 사람 만 귀하의 요청을 처리 할 것입니다.

그러면 네트워크가 있습니다. 사실, 초당 9MB를 업로드 할 수 있다는 것에 놀랐습니다. 거기에 심각한 네트워크가 있습니다.

물론 HDD가 있습니다. 실험을 위해서 메모리에 캐시 된 파일을 업로드하시기 바랍니다. 그렇지 않으면 100 개의 프로세스가이 파일을 반복해서 읽는 반면 다른 100 개는이 파일을 계속 읽습니다. 최고 수준의 SSD를 보유하고 있더라도 상당한 어려움이 있습니다.

그래서 모든 것을 말하면서 수학을해야합니다. 먼저 클라이언트와 다른 시스템에 코드를 배포하십시오.

+0

놀랍지는 않습니다. 로컬 호스트를 통해 업로드됩니다. :) 예. 그렇듯이 내 하루를 기쁘게 해 주셔서 감사합니다. 그래서 더 나은 환경이 필요합니다. – Reza

관련 문제