java - 在 Java HTTP Server 中运行频繁的 bash 命令的问题
问题描述
我实现了一个简单的 HTTP 服务器,一旦调用一个端点,它就会从 S3 检索一个文本文件并返回它。不幸的是,当请求很高时,例如每秒 100 次,它会进入不稳定状态并且无法响应 HTTP 请求并且它们会超时。为了访问 S3,我运行了一个 bash 命令(一个命令需要 2 秒才能执行),所以我认为可能是频繁的 bash 命令和管道效率不高。另外,我们在 Kubernetes 中运行代码,以防它也可能导致资源限制等。
问题是什么?是频繁的管道、HTTP Server API 等吗?如何解决?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.URI;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class FileRetriever implements Runnable {
HttpServer server;
ProcessBuilder processBuilder;
public FileRetriever() {
processBuilder = new ProcessBuilder();
Thread t = new Thread(this);
t.start();
}
public void run() {
try {
server = HttpServer.create(new InetSocketAddress(serverPort), 0);
server.createContext("/getfile", new GetFileHandler());
server.setExecutor(null);
server.start();
} catch (IOException e) {
logger.error("HttpServer ERROR", e);
}
}
class GetFileHandler implements HttpHandler {
@Override
public void handle(HttpExchange he) throws IOException {
// parse request
// http://localhost:9003/getfile?id=xxxxx
String response = "";
URI requestedUri = he.getRequestURI();
String query = requestedUri.getRawQuery();
String pair[] = query.split("=");
String id="";
if (pair[0].equals("id")) {
id = pair[1];
try {
String command = "aws --endpoint-url="+S3server+" s3 cp s3://file-store/"+id+"/files/"+id+".txt -";
processBuilder.command("sh", "-c", command+" ; true");
Process process = processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader readerErrors = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line;
while ((line = reader.readLine()) != null) {
response+=line+"\n";
}
if(response.trim().equals("")) {
response="Not Found";
he.sendResponseHeaders(404, response.length());
}
else {
logger.info("Received file successfully: " + id);
he.sendResponseHeaders(200, response.length());
}
} catch (Exception e) {
response = "ERROR in GetFileHandler.";
}
OutputStream os = he.getResponseBody();
os.write(response.toString().getBytes());
os.close();
}
}
}
}