Как решить проблему с тупым прокси в моем проекте балансировки нагрузки? - PullRequest
0 голосов
/ 13 апреля 2020

Я студент университета, который любит делать что-то новое с программированием.
Недавно я сделал балансировщик нагрузки с java для удовольствия.

И я наконец-то познакомился с некоторыми проблема.

Когда запрос от клиента имеет заголовок keep-alive, клиент или внутренний сервер не отправляют сообщение о закрытии tcp. Таким образом, балансировщик нагрузки заблокирован для функции read ().

Какова наилучшая практика для решения такого рода проблем?

Я хочу, чтобы этот балансировщик нагрузки мудро поддерживал протокол HTTP.

public class Connection implements Runnable {

    private Socket              cliSock;
    private Info                serverInfo;
    private Socket              servSock;

    public Connection(Socket cliSock, Info info){ // info has backend server's IP and Port number. 
        this.cliSock = cliSock;
        this.serverInfo = info;   
    }

    @Override
    public void run(){

        InputStream     clientIn;
        OutputStream    clientOut;

        InputStream     serverIn;
        OutputStream    serverOut;

        try{
            servSock = new Socket(serverInfo.getIp(), serverInfo.getPort());

            clientIn    = cliSock.getInputStream();
            clientOut   = cliSock.getOutputStream();
            serverIn    = servSock.getInputStream();
            serverOut   = servSock.getOutputStream();    

        }catch(Exception e){
        }

        // IO bridging
        Thread clientToServer = new Thread(new IoBridge(this, clientIn, serverOut)); 
        Thread serverToClient = new Thread(new IoBridge(this, serverIn, clientOut));

        clientToServer.start();
        serverToClient.start();

        log.info("Forwading started");
    }
class IoBridge implements Runnable{
    private static final int BUFFER_SIZE = 1024;

    private InputStream     in;
    private OutputStream    out;

    private Connection      con;

    IoBridge(Connection con, InputStream in, OutputStream out){
        this.in  = in;
        this.out = out;
        this.con = con;
    }

    @Override
    public void run(){
        byte[] buffer = new byte[BUFFER_SIZE];

        try{
            while(true){
                int byteRead = in.read(buffer);   // blocking... 

                if(byteRead == -1){
                    break; 
                }

                out.write(buffer, 0, byteRead);
                out.flush();
            }
        }catch(IOException e){
        }

        con.closeConnection();
    }
...