Stateless vs Stateful - eu poderia usar algumas informações concretas

93

Estou interessado em artigos que têm algumas informações concretas sobre design sem estado e com estado em programação. Estou interessado porque quero aprender mais sobre isso, mas realmente não consigo encontrar nenhum artigo bom sobre isso. Eu li dezenas de artigos na web que discutem vagamente o assunto, ou eles estão falando sobre servidores da web e sessões - que também são sobre com estado versus sem estado, mas estou interessado em design de atributos sem estado versus com estado na codificação . Exemplo: ouvi dizer que as classes BL são sem estado por design, classes de entidade (ou pelo menos é como eu as chamo - como Pessoa (id, nome, ..)) têm estado, etc.

Eu acho que é importante saber, porque eu acredito que se eu puder entender, posso escrever um código melhor (por exemplo, granularidade em mente).

De qualquer forma, resumindo, aqui está o que eu sei sobre stateful vs stateless:

Stateful (como WinForms): armazena os dados para uso posterior, mas limita a escalabilidade de um aplicativo, porque é limitado por limites de CPU ou memória

Stateless (como ASP.NET - embora ASP tente ser stateful com ViewStates): Depois que as ações são concluídas, os dados são transferidos e a instância é devolvida ao pool de threads (Amorfo).

Como você pode ver, é uma informação muito vaga e limitada (e bastante focada na interação do servidor), então eu ficaria muito grato se você pudesse me fornecer informações mais saborosas :)

Team-JoKi
fonte

Respostas:

58

Sugiro que você comece com uma pergunta em StackOverflow que discute as vantagens da programação sem estado. Isso está mais no contexto da programação funcional, mas o que você vai ler também se aplica a outros paradigmas de programação.

A programação sem estado está relacionada à noção matemática de uma função, que quando chamada com os mesmos argumentos, sempre retorna os mesmos resultados. Este é um conceito-chave do paradigma de programação funcional e espero que você possa encontrar muitos artigos relevantes nessa área.

Outra área que você pode pesquisar para entender melhor são os serviços da Web RESTful. Eles são "sem estado" por design, em contraste com outras tecnologias da web que tentam de alguma forma manter o estado. (Na verdade, o que você diz que o ASP.NET não tem estado não é correto - o ASP.NET se esforça para manter o estado usando ViewState e definitivamente deve ser caracterizado como com estado. O ASP.NET MVC, por outro lado, é uma tecnologia sem estado). Há muitos lugares que discutem a "ausência de estado" de serviços da Web RESTful (como este ponto de blog), mas você poderia começar novamente a partir de uma pergunta SO .

kgiannakakis
fonte
Tudo bem, obrigado pela informação, dei uma olhada no link e encontrei algumas informações interessantes! Embora eu ainda esteja aberto para mais;)
Team-JoKi
Eu adicionei outra área com estado e sem estado é um fator importante (serviços da Web RESTful).
kgiannakakis
Obrigado pela informação! Eu votaria em sua resposta, mas não tenho representantes suficientes ainda> _>
Team-JoKi
muitos aplicativos da web são statefull porque a mesma página de inscrição fornece resultados diferentes para os créditos do usuário ... A inscrição na primeira vez será bem-sucedida ... na segunda vez com a mesma entrada, a inscrição falhará ... porque o webapp tem o estado do usuário em algum lugar armazenado. . pode ser banco de dados ou armazenamento diferente
sinta
83

Sem estado significa que não há memória do passado. Cada transação é executada como se fosse a primeira vez.

Stateful significa que há memória do passado. As transações anteriores são lembradas e podem afetar a transação atual.

Sem estado:

// The state is derived by what is passed into the function

function int addOne(int number)
{
    return number + 1;
}

Stateful:

// The state is maintained by the function

private int _number = 0; //initially zero

function int addOne()
{
   _number++;
   return _number;
}

Consulte: /software/101337/whats-the-difference-between-stateful-and-stateless

Ankit
fonte
73

Um aplicativo com estado é aquele que armazena informações sobre o que aconteceu ou mudou desde que começou a ser executado. Qualquer informação pública sobre em que "modo" está, ou quantos registros foram processados, ou o que quer que seja, torna-o com estado.

Aplicativos sem estado não expõem nenhuma dessas informações. Eles sempre dão a mesma resposta à mesma solicitação, chamada de função ou método. O HTTP não tem estado em sua forma bruta - se você fizer um GET para uma URL específica, obterá (teoricamente) a mesma resposta todas as vezes. A exceção, é claro, é quando começamos a adicionar statefulness no topo, por exemplo, com aplicativos da web ASP.NET :) Mas se você pensar em um site estático com apenas arquivos HTML e imagens, você saberá o que quero dizer.

Lucas Wilson-Richter
fonte
18

O adjetivo com estado ou sem estado se refere apenas ao estado da conversação, não está relacionado ao conceito de função que fornece a mesma saída para a mesma entrada. Nesse caso, qualquer aplicativo da Web dinâmico (com um banco de dados por trás dele) seria um serviço com estado, o que é obviamente falso. Com isso em mente, se eu confiar a tarefa de manter o estado de conversação na tecnologia subjacente (como uma sessão coockie ou http), estou implementando um serviço com estado, mas se todas as informações necessárias (o contexto) forem passadas como parâmetros I ' estou implementando um serviço sem estado. Deve-se notar que mesmo se o parâmetro passado for um "identificador" do estado de conversação (por exemplo, um tíquete ou um sessionId), ainda estamos operando em um serviço sem estado,

Marco
fonte
Não tenho certeza se passar um session identifierem cada solicitação pode ser considerado sem estado. Em meu ponto de vista, tal caso seria considerado com estado. Se, no entanto, você sempre passar um tokenpara o usuário, mas não tiver nenhum outro estado, a não ser que seja sem estado. Mas parece XD com estado. Isso é tão confuso.
7hi4g0
4

O dinheiro transferido online de uma conta para outra conta com monitoração de estado, porque a conta que recebe contém informações sobre o remetente. Entregar dinheiro de uma pessoa para outra, esta transação não tem estado, porque depois que o dinheiro é recebido, a identidade do doador não está lá com o dinheiro.

S Upendra rao
fonte
1

Apenas para adicionar contribuições de outros ... Outra maneira é olhar para isso de um servidor web e do ponto de vista da concorrência ...

O HTTP é sem estado por natureza por uma razão ... No caso de um servidor web, ser com estado significa que ele teria que se lembrar do 'estado' de um usuário para sua última conexão e / ou manter uma conexão aberta com um solicitante. Isso seria muito caro e 'estressante' em um aplicativo com milhares de conexões simultâneas ...

Ser sem estado , neste caso, tem um uso eficiente e óbvio de recursos ... isto é, suporta uma conexão em uma única instância de solicitação e resposta ... Nenhuma sobrecarga de manter as conexões abertas e / ou lembrar de qualquer coisa da última solicitação ...

Ken.Fukizi
fonte
-3

Tornamos Webapps com estado substituindo o comportamento sem estado de HTTP usando objetos de sessão. Quando usamos objetos de sessão, o estado é carregado, mas ainda usamos apenas HTTP.

sinta-se bem e programando
fonte
-3

Tive a mesma dúvida sobre o design de classes sem estado v / s e fiz algumas pesquisas. Acabei de concluir e minhas descobertas foram postadas em meu blog

  • As classes de entidade precisam ter estado
  • As classes auxiliares / trabalhadoras não devem ter estado.
Joy George Kunjikkuru
fonte