¿Cuál es la diferencia entre stateful y stateless?

86

Los libros y la documentación sobre el MVC simplemente se acumulan al usar los términos con estado y sin estado. Para ser honesto, no puedo entender la idea de lo que hablan los libros. No dan un ejemplo para comprender ninguno de los dos estados, en lugar de simplemente decir que HTTP no tiene estado y que con ASP.NET MVC microsoft lo acompaña. Me estoy perdiendo algunos conocimientos fundamentales, ya que no puedo entender lo que tiene estado y por qué tiene estado y lo mismo ocurre con los apátridas.

Un ejemplo simple y breve que habla de un control como botón o cuadro de texto puede simplificar la comprensión, supongo.

Pankaj Upadhyay
fuente

Respuestas:

40

Sin estado significa que HTTP no tiene soporte incorporado para los estados; por ejemplo, no puede almacenar si un usuario ha iniciado sesión o ha hecho otra cosa.

La solución más común es usar sesiones para superar ese problema. Esto significa que debe poder incluir un identificador de sesión en cada respuesta o solicitud. Esto se hace creando una cookie de sesión o incluyendo el identificador de sesión en todos los enlaces.

WebForms intenta hacer todo eso transparente (usando ViewState) mientras MVC lo obliga a manejarlo manualmente.

En su ejemplo, mencionó Botones y cuadros de texto. La forma más fácil de dejar que mantengan su estado es simplemente dejar de publicar toda la página. MVC obtuvo un excelente soporte para ajax (a través de jQuery) y le sugiero que use ajax si solo quiere hacer algo en la página actual.

jgauffin
fuente
3
Esto significa que si he iniciado sesión en un sitio web, cada página que visito solo vuelve a comprobar la autenticación antes de mostrar el contenido a través del identificador de sesión o una cookie de sesión.
Pankaj Upadhyay
3
si eso es correcto.
jgauffin
entonces, ¿es apátrida mejor o peor?
Lucas - Better Coding Academy
1
@ think123: Es más eficiente ya que no tiene que administrar el estado (es decir, el equilibrio de carga, etc. es mucho más fácil). Es cada vez más complejo ya que tienes que manejar un estado artificial.
jgauffin
55
@jgauffin: Performant es la palabra incorrecta aquí. Sin estado tiene menos rendimiento ya que no tiene la oportunidad de almacenar en caché el estado y tiene que buscarlo repetidamente. Lo que es es más escalable ; ahí es donde entra el equilibrio de carga, y las ganancias de la escalabilidad pueden compensar las pérdidas de rendimiento cuando su sistema se vuelve lo suficientemente grande.
Mason Wheeler
108

Sin estado: el programa no mantiene memoria (estado)

Con estado: el programa tiene una memoria (estado)

Para ilustrar el concepto de estado, definiré una función con estado y otra sin estado.

Apátrida

//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;
}

Como otros han dicho, http es inherentemente sin estado. Por lo tanto, el estado debe integrarse en sus aplicaciones.

Imagine una solicitud en la web donde tiene un navegador cliente que se comunica con un proceso de servidor. Para mantener el estado sobre el protocolo http sin estado, el navegador generalmente enviará un identificador de sesión al servidor en cada solicitud. Para cada solicitud, el servidor será como "ah, es este tipo". La información de estado se puede buscar en la memoria del lado del servidor o en una base de datos basada en esta identificación de sesión.

En un entorno puramente sin estado, no necesitaría esta identificación de sesión. Cada solicitud contendría toda la información que el servidor necesitaría procesar. Pero muchas aplicaciones necesitan mantener el estado para realizar un seguimiento de si una sesión está autenticada o no para ver cierto contenido o para realizar un seguimiento de lo que está haciendo un usuario. No querrá enviar credenciales de usuario por cable para cada solicitud.

descifrador
fuente
pregunta rápida: entonces, si el ID de sesión es utilizado (es decir, robado) por otro usuario, el servidor no tendría idea de que se trata de otra persona.
mihai
44
Eso es correcto. Hay formas de proteger la identidad de un usuario, como el uso de https o httponly cookies. Pero si la computadora de un usuario se ve comprometida, entonces un atacante podría engañar al servidor haciéndole creer que es el usuario.
codificador
2
+1 para un ejemplo de código claro y crujiente. Estoy cada vez más convencido de que los términos de TI más complejos solo pueden entenderse en contexto.
Sebastian
La posibilidad de que una ID de sesión sea robada es una de las razones por las que debes tener cuidado y las aplicaciones como un CMS o algo así como OAuth se construyen para hacer que hacer eso sea mucho más difícil.
Elin
44
Para cada solicitud, el servidor será como "ah, es este tipo" - mejor dicho que en todos los demás ejemplos que he visto
Rafael Eyng
69

sin estado significa que no hay memoria del pasado. Cada transacción se realiza como si se hiciera por primera vez.

statefull significa que hay memoria del pasado. Las transacciones anteriores se recuerdan y pueden afectar la transacción actual.

CWallach
fuente
99
Esto debería haber recibido la respuesta. Es, con mucho, la respuesta más clara y precisa aquí.
Mawg
3
Simple y preciso
Ivan Ivković
2
Es preciso para cualquiera que ya sepa la diferencia.
Rafael Eyng
3

En mi opinión simple, la diferencia entre ASP.NET (con estado) y ASP.NET-MVC (sin estado) se puede aislar al hecho de que el primero proporciona controles del lado del servidor y el otro no.

Vale la pena señalar que el enfoque de formularios web ASP.NET está orientado a la transición de los antiguos programadores VB y VC ++ que se utilizan en el modelo basado en el modelo de eventos para tener una buena forma rápida de aprender programación web siguiendo el mismo paradigma del modelo de eventos, como hacer clic un botón y listo ¡desencadena un evento! Todo lo que necesita hacer ahora es escribir su código en el controlador de eventos. Debido a eso, ASP.NET necesitaba tener conceptos como ver estado y devoluciones para monitorear el estado de los controles del lado del servidor en cada viaje de ida y vuelta.

ASP.NET-MVC, sin embargo, no utiliza controles del lado del servidor, por lo que no tiene que mantener el estado. El modelo MVC separa el dominio del problema en las tres particiones para que los datos se entreguen al cliente de manera simplificada.

En resumen, los controles del lado del servidor son lo que los hace diferentes en cuanto a ser con estado y sin estado.

Ronald
fuente
1

Además de @coder respuesta exacta.

La idea de estado es recordar datos anteriores .
Por ejemplo, tiene un control de lista en el servidor con los valores "A, B, C" y "A" seleccionado. La lista va al navegador del cliente. Usted selecciona "B". Y publicar de nuevo en el servidor. ¿Cómo sabrías que el valor ha cambiado?

  • ASP.NET
    Microsoft usa el término ViewState en ASP.NET. Hay un gran malentendido entre los desarrolladores al respecto.
    ViewState contiene todos los estados iniciales de la lista en <input type="hidden" value="base64 encoded" />: valores "A, B, C" y marca "A is selected".
    Luego, con el navegador posterior, envía ViewState y "B está seleccionado" al servidor. ASP.NET restaura el estado inicial de la lista y aplica la nueva selección "B". Esto se hizo para atraer a los desarrolladores de WinForms (mencionado por @Ronald). En el servidor web, puede suscribirse a la lista de cambios listObject.Changed += OnChanged.

  • ASP.NET MVC
    El problema con ViewState es el tamaño. Durante años, los desarrolladores de .NET se vieron obligados a transferir kilobytes de información inútil, como estados de 20 controles para cada viaje de ida y vuelta.
    El nuevo enfoque es enviar solo un nuevo y pequeño valor "B".
    O si desea realizar un seguimiento del cambio de "A" a "B", impleméntelo usted mismo. Usando JavaScript y enviando "Was A, Now B". O guarde y recupere el estado por ID en SQL Server.

  • ASP.NET MVC y ASP.NET implementa el estado de autenticación y cobro. Por lo tanto, no es correcto decir que ASP.NET MVC no tiene estado.
  • La memoria mencionada en las respuestas significa "recordar", no la memoria de la computadora. El estado se puede implementar almacenando datos en el sistema de archivos, el servidor SQL o la memoria de la computadora.
Artru
fuente
por favor sea constructivo y explique el error antes de poner menos
Artru
0

Una operación con estado modifica o requiere algún estado del sistema, y ​​una operación sin estado no lo hace.

Un ejemplo de un cuadro de texto con estado sería un comentario editado previamente en StackExchange: el cuadro de texto debe mostrar su comentario anterior y conocer el subproceso en el que estuvo involucrado para aceptar y procesar su entrada.

Un formulario genérico de comentarios por correo electrónico con una etiqueta mailto: sería un cuadro de texto sin estado: acepta su entrada y la arroja a la aplicación de correo de su estación de trabajo sin retener ninguna información.

Lonstar
fuente
Un formulario típico de "deje su dirección de correo electrónico y un mensaje y nos pondremos en contacto con usted" también no tiene estado. Cuando envía el formulario, al servidor no le importa de dónde lo obtuvo, y simplemente copia los datos en alguna lista de tareas del servicio al cliente y se olvida de ello.
StarWeaver