Pipeline de requisições


O HTTP 1.1 permite o envio de várias requisições em sequência, sem esperar a resposta de cada uma.

Isso melhora a eficiência, especialmente em cenários com alta latência, como em conexões de rede lentas ou quando o servidor demora para processar cada requisição.

Exemplo

Imagine um sistema de e-commerce onde um cliente (navegador ou aplicativo) precisa carregar várias informações de uma página de produto, como:

  1. Detalhes do produto.
  2. Avaliações dos usuários.
  3. Produtos recomendados.

No HTTP 1.1, o cliente pode enviar todas essas requisições em sequência, sem esperar a resposta de cada uma, aproveitando o pipeline de requisições.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
 
public class HttpClientPipelineExample {
 
    public static void main(String[] args) {
        try {
            // URLs das requisições
            String[] urls = {
                "http://localhost:8080/product-details",
                "http://localhost:8080/product-reviews",
                "http://localhost:8080/recommended-products"
            };
 
            // Envia as requisições em sequência (pipeline)
            for (String url : urls) {
                sendRequest(url);
            }
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    private static void sendRequest(String urlString) {
        try {
            URL url = new URL(urlString);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 
            // Configura a requisição
            connection.setRequestMethod("GET");
            connection.setDoOutput(true);
 
            // Envia a requisição
            connection.connect();
 
            // Lê a resposta
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();
 
            // Exibe a resposta
            System.out.println("Resposta de " + urlString + ": " + response.toString());
 
            // Fecha a conexão
            connection.disconnect();
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Usamos um loop for para simular o envio das requisições em sequência. O método sendRequest é chamado para cada URL.

Abaixo o código para simular um servidor HTTP utilizando a classe o HttpServer da biblioteca com.sun.net.httpserver

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
 
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
 
public class SimpleHttpServer {
 
    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
 
        // Endpoint para detalhes do produto
        server.createContext("/product-details", new HttpHandler() {
            @Override
            public void handle(HttpExchange exchange) throws IOException {
                String response = "Detalhes do Produto";
                exchange.sendResponseHeaders(200, response.length());
                OutputStream os = exchange.getResponseBody();
                os.write(response.getBytes());
                os.close();
            }
        });
 
        // Endpoint para avaliações do produto
        server.createContext("/product-reviews", new HttpHandler() {
            @Override
            public void handle(HttpExchange exchange) throws IOException {
                String response = "Avaliações do Produto";
                exchange.sendResponseHeaders(200, response.length());
                OutputStream os = exchange.getResponseBody();
                os.write(response.getBytes());
                os.close();
            }
        });
 
        // Endpoint para produtos recomendados
        server.createContext("/recommended-products", new HttpHandler() {
            @Override
            public void handle(HttpExchange exchange) throws IOException {
                String response = "Produtos Recomendados";
                exchange.sendResponseHeaders(200, response.length());
                OutputStream os = exchange.getResponseBody();
                os.write(response.getBytes());
                os.close();
            }
        });
 
        server.start();
        System.out.println("Servidor iniciado na porta 8080...");
    }
}

Ao executar o cliente, você verá as respostas das três requisições em sequência no console:

Resposta de http://localhost:8080/product-details: Detalhes do Produto
Resposta de http://localhost:8080/product-reviews: Avaliações do Produto
Resposta de http://localhost:8080/recommended-products: Produtos Recomendados

Referências


https://youtu.be/a-sBfyiXysI?si=XViOONz9cgg-R_VX