Sessões aderentes e NÃO aderentes

255

Quero saber a diferença entre sessões com e sem aderência. O que eu entendi depois de ler da internet:

Fixo : apenas um único objeto de sessão estará lá.

Sessão não aderente : objeto de sessão para cada nó do servidor

Sunny Gupta
fonte

Respostas:

612

Quando o site é servido por apenas um servidor da web, para cada par cliente-servidor, um objeto de sessão é criado e permanece na memória do servidor da web. Todas as solicitações do cliente vão para este servidor da web e atualizam este objeto de sessão. Se alguns dados precisarem ser armazenados no objeto da sessão durante o período de interação, eles serão armazenados nesse objeto da sessão e permanecerão lá enquanto a sessão existir.

No entanto, se o seu site for atendido por vários servidores da web que ficam atrás de um balanceador de carga, o balanceador de carga decidirá para qual servidor da Web (físico) real cada solicitação deve ser acessada. Por exemplo, se houver três servidores Web A, B e C atrás do balanceador de carga, é possível que www.mywebsite.com/index.jsp seja servido no servidor A, www.mywebsite.com/login.jsp seja servido em servidor B e www.mywebsite.com/accoutdetails.php são servidos no servidor C.

Agora, se as solicitações estiverem sendo atendidas de (fisicamente) três servidores diferentes, cada servidor criou um objeto de sessão para você e, como esses objetos de sessão ficam em três caixas independentes, não há como saber o que há no objeto de sessão. do outro. Para sincronizar entre essas sessões do servidor, você pode precisar gravar / ler os dados da sessão em uma camada comum a todos - como um banco de dados. Agora, escrever e ler dados para / de um banco de dados para esse caso de uso pode não ser uma boa ideia. Agora, aqui vem o papel da sessão pegajosa .

Se o balanceador de carga for instruído a usar sessões persistentes, todas as suas interações ocorrerão com o mesmo servidor físico, mesmo que outros servidores estejam presentes. Assim, seu objeto de sessão será o mesmo durante toda a interação com este site.

Para resumir, no caso de sessões fixas, todas as suas solicitações serão direcionadas para o mesmo servidor da web físico, enquanto no caso de um loadbalancer não aderente, poderá escolher qualquer servidor da web para atender às suas solicitações.

Como exemplo, você pode ler sobre o Elastic Load Balancer da Amazon e sessões persistentes aqui: http://aws.typepad.com/aws/2010/04/new-elastic-load-balancing-feature-sticky-sessions.html

TJ-
fonte
4
@ TJ- o que acontecerá se um nó não estiver disponível?
Gtackoverflow #
20
Na maioria dos casos, a sessão será perdida. No caso do AWS ESB Se uma instância falhar ou se tornar prejudicial, o balanceador de carga interromperá a solicitação de roteamento para essa instância, em vez disso, escolherá uma nova instância íntegra com base no algoritmo de balanceamento de carga existente. O balanceador de carga trata a sessão como agora "travada" para a nova instância íntegra e continua encaminhando solicitações para essa instância, mesmo que a instância com falha retorne.
TJ-
8
De acordo com quais informações o LoadBalancer torna uma sessão HTTP pegajosa? Especialmente nas conexões HTTPS, esse problema se torna interessante. Você alimenta o LB com a chave privada de servidores da Web, para que ele possa interromper a conexão SSL e buscar a sessão HTTP? Ou o LB simplesmente utiliza o endereço IP do cliente? Nesse caso, e o servidor proxy em que vários clientes usam o mesmo endereço IP? Ou pior ainda, clientes móveis, onde o endereço IP muda frequentemente? Ou existe ainda uma técnica melhor para isso? Graças
g000ze
6
Sim, você está absolutamente correto. Para usar o cabeçalho "x-forwarded-for" ou um cookie fixo neste contexto, é necessário usar a terminação SSL e, portanto, a solicitação precisa ser descriptografada no LB.
precisa saber é
4
@ g000ze Ao lidar com aplicativos que não são atendidos diretamente na Internet, acredito que é comum ativar o TLS apenas no servidor proxy mais externo. (Um balanceador de carga pode ser considerado, talvez simplista, como um tipo especial de servidor proxy, que pode passar a solicitação para qualquer servidor múltiplo.) O tráfego entre o balanceador de carga e os outros servidores ocorrerá em uma rede local segura e, portanto, muitas vezes não é necessário criptografá-lo ou, se precisar ser criptografado, um certificado autoassinado pode ser suficiente (já que o proxy pode ser configurado para confiar nele).
Jpmc26
106

Fiz uma resposta com mais alguns detalhes aqui: https://stackoverflow.com/a/11045462/592477

Ou você pode lê-lo lá ==>

Quando você usa o balanceamento de carga, significa que você tem várias instâncias do tomcat e precisa dividir as cargas.

  • Se você estiver usando a replicação de sessão sem sessão persistente: imagine que você tenha apenas um usuário usando seu aplicativo Web e três instâncias do tomcat. Este usuário envia várias solicitações para o seu aplicativo, o loadbalancer envia algumas dessas solicitações para a primeira instância do tomcat e envia outras para a segunda instância e outras para a terceira.
  • Se você estiver usando uma sessão permanente sem replicação:Imagine que você tem apenas um usuário usando seu aplicativo Web e possui 3 instâncias do tomcat. Esse usuário envia várias solicitações para o seu aplicativo, o loadbalancer envia a primeira solicitação de usuário para uma das três instâncias do tomcat e todas as outras solicitações enviadas por esse usuário durante sua sessão são enviadas para a mesma instância do tomcat. Durante essas solicitações, se você encerrar ou reiniciar essa instância do tomcat (instância do tomcat usada), o loadbalancer envia as solicitações restantes para outra instância do tomcat que ainda está em execução, MAS como você não usa a replicação de sessão, a instância do tomcat que recebe as solicitações restantes não possuem uma cópia da sessão do usuário e, para esse tomcat, o usuário inicia uma sessão: o usuário perde a sessão e é desconectado do aplicativo Web, embora o aplicativo Web ainda esteja em execução.
  • Se você estiver usando uma sessão fixa COM replicação de sessão:Imagine que você tem apenas um usuário usando seu aplicativo da web e possui três instâncias do tomcat. Esse usuário envia várias solicitações para o seu aplicativo, o loadbalancer envia a primeira solicitação de usuário para uma das três instâncias do tomcat e todas as outras solicitações enviadas por esse usuário durante sua sessão são enviadas para a mesma instância do tomcat. Durante essas solicitações, se você encerrar ou reiniciar esta instância do tomcat (instância do tomcat usada), o loadbalancer envia as solicitações restantes para outra instância do tomcat que ainda está em execução, ao usar a replicação de sessão, a instância do tomcat que recebe as solicitações restantes uma cópia da sessão do usuário e o usuário mantém a sessão: o usuário continua navegando no seu aplicativo Web sem ser desconectado, o desligamento da instância do tomcat não afeta a navegação do usuário.
Nico
fonte
8
Hmm .. lendo isso, eu me pergunto: não faria sentido ter uma quarta opção: replicação de sessão WITH Non-Sticky? Ou, colocando de outra forma: qual é a vantagem de ter uma sessão complicada, se alguém replicar a sessão para diferentes instâncias? Quero dizer, se você estiver replicando as sessões entre as instâncias, poderá encaminhar a solicitação para qualquer servidor também, certo? o que estou perdendo?
dingalapadum 14/01/19
@dingalapadum você está certo, teoricamente você pode ter replicação de sessão sem uma sessão pegajosa. Mas no caso de um cluster grande, isso prejudica o desempenho da rede. Existem algumas estratégias no uso da replicação de sessão com sessão persistente como esta no tomcat ( tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html ) é colocar uma sessão persistente e apenas uma réplica (um nó aqui chamado gerenciador de backup que mantém toda a replicação da sessão do nó).
Nico
Em seguida, a sessão permanente permite que você tenha apenas uma réplica da sessão, a melhor em cluster grande.
Nico
2
Ah, entendo - se eu entendi direito, você quer dizer que replicar todas as sessões em todo o cluster inundaria o cluster internamente - eu vejo o problema. Ah, e agora, olhando mais atentamente para a sua resposta, acabei de ver que este é realmente o primeiro caso que você descreve ... 'duh me' .. ..
dingalapadum 14/01/19
@dingalapadum sua pergunta é bem-vinda, ela permite melhorar a resposta #
Nico