Cliente e servidor socket em Golang com tratamento de sinais.
Continuando a série de artigos construindo o nosso cliente/servidor vamos adicionar mais um canal no exemplo anterior que será usado para tratar sinais vindos do sistema operacional.
O sistema operacional envia sinais para os programas para executar várias coisas, como o gerenciamento de processos. Por exemplo, quando você pressiona ctrl+c o sistema operacional envia o sinal SIGINT avisando o programa que o usuário quer que ele seja interrompido.
O comportamento padrão é simplesmente fechar o programa, mas podemos interceptar esse sinal e fazer o que quisermos. No nosso caso vamos apenas finalizar o programa, mas em um sistema real esse recurso poderia ser usado para persistir alguma informação antes de fechar, finalizar outros processos, fechar conexões e arquivos, etc. Esse processo é conhecido como graceful shutdown.
Servidor
Do lado do servidor criamos um canal e informamos o sistema para enviar os canais por esse novo canal. Também foi necessário uma goroutine para ficar esperando o canal.
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
fmt.Println("\nShutdown server...")
os.Exit(0)
}()
Cliente
O cliente foi um pouco mais interessante porque não é necessário criar uma goroutine, como já estamos tratando os canais com select case podemos simplesmente adicionar mais esse canal nos cases e ele será tratado normalmente, assim como os outros canais.
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
for {
select {
case <-sigs:
fmt.Println("\nDisconnecting...")
conn.Close()
os.Exit(0)
...
Código-fonte
Aqui vai o código-fonte do nosso servidor e cliente.
Vídeos com explicação
Conclusão
Essa mudança do código para adicionar os sinais foi bem pequena, mas é importante. Se o programa será fechado é importante ter certeza que ele esta em um estado conhecido, por exemplo, imagina que seu programa persista dados em um banco de dados, é uma boa ideia esperar que as transações abertas no banco terminem antes de derrubar o programa.