Se você estiver armazenando o estado no servidor necessário para processar uma solicitação de entrada do cliente, o servidor estará com estado. Dito de outra maneira, ele afirma que armazena e precisa acessar para processar solicitações de clientes. Portanto, seu hashmap é state e seu servidor é stateful.
Agora, existem muito poucos aplicativos da Web reais que fazem coisas ricas que não são de estado algum. Afinal, se você deseja ter um login de usuário e depois processar solicitações a pedido de um cliente conectado, então, por definição, você está armazenando o estado no servidor que pertence a um cliente específico e o servidor é estável , mesmo que seja apenas para as informações de login.
Portanto, eu não ficaria muito desconfortável com o estado zero no servidor. O que importa é quanto estado existe no servidor, qual o custo (em termos de processamento, armazenamento, etc ...) é armazenar e acessar esse estado e você ainda pode dimensionar seu aplicativo horizontalmente com esse estado. E, sempre que possível, mantenha o estado no cliente, não no servidor. Como um exemplo trivial, suponha que você tenha um aplicativo cliente com um botão "próxima página". Você pode implementar a "página seguinte" com o estado do lado do cliente ou do lado do servidor.
Se você tivesse o estado do lado do servidor para a página atual do cliente, basta enviar um comando ao servidor que gostaria de exibir na página "próxima". O servidor examinaria seu estado para esse cliente, incrementaria a página e retornaria os dados para a próxima página.
Ou você pode armazenar a página atual no cliente. Quando o cliente deseja a próxima página, ele pega seu número de página atual, incrementa-o em um e faz uma solicitação genérica para o número de página específico que deseja visualizar a seguir.
Qual dessas implementações você acha que escala melhor? O que é mais simples de implementar quando o usuário abre uma segunda guia exibindo uma página diferente? O que é mais simples de dimensionar horizontalmente. A resposta para todos é a que não armazena a página atual no servidor, mas a mantém no cliente e apenas faz solicitações genéricas da página N ao servidor. Manter esse estado no lado do cliente facilita o dimensionamento individual e horizontal e oferece suporte a várias visualizações para o mesmo cliente.