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 · 03

NIO: as Socket Options que fazem diferença em produção

channel.setOption(StandardSocketOptions.TCP_NODELAY, true); // vai parar no socket do sistema operacional
seu códigochannel.setOption(StandardSocketOptions…)NIO.2 · Java 7+NetworkChannel + StandardSocketOptionsJVMchamada nativa setsockopt()sistema operacionalo socket guarda a opção e muda o comportamentoTCP_NODELAY
01 / 06

As opções moram no socket do SO

O setOption do Java não guarda nada na JVM: a opção desce até o socket do sistema operacional. Desde o NIO.2 (Java 7), tudo passa pela interface NetworkChannel e pela classe StandardSocketOptions.

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

Pra fixar

  • As opções ficam no socket do sistema operacional; no Java, setOption + StandardSocketOptions (NIO.2).
  • TCP_NODELAY desliga o Nagle: mensagem pequena sai sem esperar o ACK. Tomcat e Netty já ligam por padrão.
  • SO_REUSEADDR deixa o servidor reiniciar na mesma porta mesmo com conexões em TIME_WAIT.
  • SO_REUSEPORT põe vários sockets na mesma porta e o kernel divide as conexões. No Windows não existe.
  • SO_LINGER controla o close(). Com 0, a conexão cai com RST e o buffer pendente se perde.
  • SO_RCVBUF/SO_SNDBUF: com o servidor longe, o throughput fica perto de buffer ÷ RTT. No Kafka, -1 deixa o SO decidir.

Configurando antes do bind()

try (ServerSocketChannel server = ServerSocketChannel.open()) {
  server.setOption(StandardSocketOptions.SO_REUSEADDR, true);
  server.setOption(StandardSocketOptions.SO_RCVBUF, 1024 * 1024); // before bind(): inherited by accepted sockets
  server.bind(new InetSocketAddress(8080));

  SocketChannel client = server.accept();
  client.setOption(StandardSocketOptions.TCP_NODELAY, true);
}