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 operacional01 / 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);
}
Caramelo