Web server em Go aparentemente não está criando novas conexões para requisições diferentes - Iniciante

71 views
Skip to first unread message

Franklin Sales

unread,
Jun 14, 2017, 2:22:09 PM6/14/17
to Golang Brasil

Sou iniciante em Go e estou enfrentando um comportamento que está me deixando extremamente confuso, eu descrevi em detalhes a minha dúvida aqui:

https://pt.stackoverflow.com/questions/212919/web-server-em-go-aparentemente-n%c3%a3o-est%c3%a1-criando-novas-requisi%c3%a7%c3%b5es-iniciante

Se alguém puder ajudar este pobre iniciante eu ficaria muito feliz. =)

Resumo:
Estou começando agora a desenvolver em Go, atualmente estou estudando Go para desenvolvimento Web, então através de exemplos eu iniciei um simples servidor em Go, porém eu percebi algo estranho, mesmo requisições de navegadores diferentes, de aparelhos diferentes e até mesmo requisições feitas para este exemplo hospedado na DigitalOcean, todos apresentam um comportamento estranho, ao que parece a aplicação só cria uma conexão, pois a variável Nome tem o valor da requisição passada armazenado, isso mesmo sendo requisições diferentes realizadas por clientes diferentes.

O exemplo é tão simples que eu não tenho ideia do que pode ser. Sério, agradeço toda ajuda.

Imagem do resultado em anexo.



Screenshot from 2017-06-14 15-20-27.png

Bruno Albuquerque

unread,
Jun 14, 2017, 2:32:27 PM6/14/17
to Golang Brasil
Acho que não entendi. No screenshot que você enviou aparentemente as coisas estão funcionando como esperado. Existiram 2 requests. O primeiro mudou o nome de "" para  "Carlos"  e o segundo mudou de "Carlos" para "João". O que exatamente você esperava?


--

---
Você recebeu essa mensagem porque está inscrito no grupo "Golang Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para golang-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Franklin Sales

unread,
Jun 14, 2017, 2:53:42 PM6/14/17
to Golang Brasil
Boa tarde Bruno, obrigado pela atenção.

Exatamente você está correto, eu realizei 2 requests, porém eles foram feitos de dispositivos diferentes, o primeiro request foi feito do navegador Firefox do host onde está a aplicação e o segundo request foi realizado através do navegador Google Chrome do meu smartphone. Ou seja, eu esperava que uma requisição não fosse ter acesso a outra, que fossem requisições independentes, mesmo que fossem requisições do mesmo navegador elas também não deveriam ter acesso a outra, ou eu estou entendendo errado? Preciso configurar algo mais para ter uma aplicação web?

Bruno Albuquerque

unread,
Jun 14, 2017, 3:28:30 PM6/14/17
to Golang Brasil
Hmmmmm... Não tem nada de errado com seu programa. O erro esta nas sua expectativas,

Você cria uma váriável global chamada Nome e está esperando que ela tenha valores diferentes para requests diferentes mas não é assim que váriaveis globais funcionam (como o próprio nome indica). Não importa qual o request que esteja sendo executado e de onde ele vem, a variável "Nome" dentro do handler é sempre a mesma.

Se você queria que ela fosse diferente em todo request (o que nõa éprovável porque, nesse caso, seu programa não faria nada de útil) você teria que declarar Nome localmente no handler. Se você queria que ela fosse diferente de acordo com o contexto, qual contexto é esse?

Por ip?
Por usuário?
Por domínio?
Po alguma outra coisa?

O ponto é que você tem que adicionar código para lidar com isso explicitamente, não tem como seu programa adivinhar o que você quer.

Everton Marques

unread,
Jun 14, 2017, 3:41:05 PM6/14/17
to golang...@googlegroups.com
Provavelmente o que você deseja é fazer um controle de contexto através de sessões.

Já que você está trabalhando com Gorilla, consulte:
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para golang-brasil+unsubscribe@googlegroups.com.

Franklin Sales

unread,
Jun 16, 2017, 5:41:36 PM6/16/17
to Golang Brasil
Olá Bruno, era isso mesmo, erro na minha expectativa. Na verdade, para ser mais exato, eu cometi um erro conceitual e para piorar tive o azar desse erro ser sustentado por um exemplo ruim o qual eu estava seguindo.

Eu venho do mundo PHP, então eu estou acostumado com uma visão diferente das coisas. No PHP a grosso modo basicamente uma servidor web recebe a requisição, invoca o interpretador PHP, o interpretador então interpreta os scripts em questão(gera uma instância nova), realizada a saída aquela instância de interpretação dos scritps deixa de existir e por fim o servidor web devolve a resposta. Ou seja, no PHP não existe uma instância única da aplicação rodando, a cada requisição o script é interpretado e finalizado. E pelo o que entendi no caso do Go, você dá build na aplicação, executa e essa instância de execução irá receber todas as conexões, então ao desenvolver a aplicação você deve desenvolvê-la com essa mentalidade de instância única de aplicação recebendo todas as requisições, que era algo que eu não estava acostumado. Eu parti do pressuposto que o pacote net/http iria de alguma forma individualizar as requisições em relação a instância de execução da aplicação, falha minha.

Enfim, agora com o conceito compreendido estou seguindo tranquilamente aqui.

Obrigado pela atenção.

Franklin Sales

unread,
Jun 16, 2017, 5:44:19 PM6/16/17
to Golang Brasil
Ainda não era essa a questão, mas o próximo passo do projeto que eu estou desenvolvendo envolve sessões, darei uma olhada no pacote sim.

Obrigado pela atenção.

Ivan Sansão

unread,
Sep 5, 2019, 9:48:26 AM9/5/19
to Golang Brasil
Morte da Sessão!

Heheh bom dia pessoal,

Gente pelo que eu vi o negócio agora é stateless e não mais sessão.

Com stateless o servidor não fica uma nova instância a cada requisição pois isso reduz desempenho.

Então o servidor stateless não mantém mais os dados do frontend, isso permite escalar o backend (caiu um, entra outro sem problemas)

E para saber quem está solicitando a requisição você deve trabalhar com token (olhe JWT.io)

Dá uma "googleada" de como usar Jwt no Go!

Não sei se estou certo mas isso é o que eu entendi sobre Stateless!
Reply all
Reply to author
Forward
0 new messages