System Design · caderno de estudo

Rabiscos de System Design

Diagramas animados pra fixar o que acontece por baixo do código. Um tema por prancha, uma ideia por cena.

Série Java Networking · 02

Cliente e servidor TCP: como o servidor atende a ligação

Socket socket = new Socket("10.0.0.7", 8080); // o cliente liga pro servidor
servidor10.0.0.7:8080cliente192.168.0.12entregue à aplicação, em ordem
01 / 06

TCP é uma ligação que fica aberta

Um lado liga, o outro atende e a linha fica aberta até alguém desligar. No caminho, o TCP numera os pedaços: se o 2 se perde, ele é reenviado, e a aplicação só recebe tudo na ordem certa.

Use ← e → pra trocar de cena, espaço pra pausar.

Pra fixar

  • TCP: a conexão fica aberta, os pedaços chegam em ordem e o que se perde é reenviado.
  • Bloqueante: uma thread por conexão, parada no accept() e no read().
  • O custo é a espera: cada thread reserva memória de stack mesmo parada.
  • NIO: um Selector avisa quais sockets estão prontos, e poucas threads atendem muitas conexões.
  • Tomcat (conector NIO) e Netty já fazem esse trabalho por baixo do framework.
  • Virtual Threads (Java 21): código bloqueante, mas a espera não prende uma thread do SO.

Bloqueante, mas com Virtual Threads

try (var server = new ServerSocket(8080);
     var executor = Executors.newVirtualThreadPerTaskExecutor()) {
  while (true) {
    Socket client = server.accept();          // waits for a call
    executor.submit(() -> handle(client));   // one virtual thread per client
  }
}