Grandes sites podem ter "carga balanceada" em várias máquinas. Em muitas configurações de balanceamento de carga, um usuário pode acessar qualquer uma das máquinas de back-end durante uma sessão. Por causa disso, existem vários métodos para permitir que muitas máquinas compartilhem sessões de usuários.
O método escolhido dependerá do estilo de balanceamento de carga empregado, bem como da disponibilidade / capacidade de armazenamento de back-end:
Informações da sessão armazenadas somente em cookies : As informações da sessão (não apenas um identificador de sessão) são armazenadas no cookie de um usuário. Por exemplo, o cookie do usuário pode conter o conteúdo do carrinho de compras. Para impedir que os usuários adulterem os dados da sessão, um HMAC pode ser fornecido junto com o cookie. Este método é provavelmente menos adequado para a maioria das aplicações:
- Nenhum armazenamento de back-end é necessário
- O usuário não precisa acessar a mesma máquina todas as vezes, portanto, o balanceamento de carga do DNS pode ser empregado
- Não há latência associada à recuperação das informações da sessão de uma máquina de banco de dados (como é fornecido com a solicitação HTTP). Útil se o seu site tiver carga equilibrada por máquinas em diferentes continentes.
- A quantidade de dados que podem ser armazenados na sessão é limitada (pelo limite de tamanho do cookie 4K)
- A criptografia deve ser empregada se um usuário não puder ver o conteúdo de sua sessão
- O HMAC (ou similar) deve ser empregado para impedir a violação de dados de sessão por parte do usuário
- Como os dados da sessão não são armazenados no servidor, é mais difícil para os desenvolvedores depurarem
O balanceador de carga sempre direciona o usuário para a mesma máquina : muitos balanceadores de carga podem definir seu próprio cookie de sessão, indicando em qual máquina de backend um usuário está fazendo solicitações, e direcioná-lo para essa máquina no futuro . Como o usuário é sempre direcionado para a mesma máquina, o compartilhamento de sessão entre várias máquinas não é necessário. Isso pode ser bom em algumas situações:
- O tratamento de sessão de um aplicativo existente pode não precisar ser alterado para se tornar ciente de várias máquinas
- Nenhum sistema de banco de dados compartilhado (ou similar) é necessário para armazenar sessões, possivelmente aumentando a confiabilidade, mas com o custo da complexidade
- Uma queda de máquina de back-end derrubará qualquer sessão de usuário iniciada com ela.
- A retirada de máquinas de serviço é mais difícil. Usuários com sessões em uma máquina a serem removidas para manutenção devem ter permissão para concluir suas tarefas, antes que a máquina seja desligada. Para suportar isso, os balanceadores de carga da Web podem ter um recurso para "drenar" solicitações para uma determinada máquina de backend.
Banco de dados de back-end ou armazenamento de chave / valor compartilhado : As informações da sessão são armazenadas em um banco de dados de back-end, que todos os servidores da Web têm acesso para consulta e atualização. O navegador do usuário armazena um cookie contendo um identificador (como o ID da sessão), apontando para as informações da sessão. Este é provavelmente o método mais limpo dos três:
- O usuário nunca precisa ser exposto às informações da sessão armazenada.
- O usuário não precisa acessar a mesma máquina todas as vezes, portanto, o balanceamento de carga do DNS pode ser empregado
- Uma desvantagem é o gargalo que pode ser colocado em qualquer sistema de armazenamento de back-end que seja empregado.
- As informações da sessão podem ter expirado e feito backup de forma consistente.
No geral, a maioria dos aplicativos da web dinâmicos realiza várias consultas ao banco de dados ou solicitações de armazenamento de chave / valor, portanto, o banco de dados ou armazenamento de chave / valor é o local de armazenamento lógico dos dados da sessão.