大規模なファイルサーバー(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);
}
}
どのように100個のファイルをアップロードするのだろうか。同じマシンを使用していますか?あなたのVertxは同じマシンで動作しますか?そしてWIndows 10について言及して以来、たぶんあなたは単一のHDDを持っていますか? –
本当に:)、それは私の一日を幸せにすることを意味しますか? – Reza
と同じクライアントを使用してアップロードされているすべて – Reza