Stateless vs Stateful - я мог бы использовать конкретную информацию - PullRequest
82 голосов
/ 16 марта 2011

Меня интересуют статьи, в которых есть конкретная информация о программировании без учета состояния и без учета состояния.Мне интересно, потому что я хочу узнать больше об этом, но я действительно не могу найти хорошие статьи об этом.Я прочитал десятки статей в Интернете, которые смутно обсуждают эту тему, или они говорят о веб-серверах и сеансах - которые также относятся к состоянию с сохранением без сохранения состояния, но меня интересует создание атрибутов без сохранения состояния с сохранением состояния в коде.,Пример: я слышал, что BL-классы не имеют состояния по своему дизайну, классы сущностей (или, по крайней мере, так я их называю - например, Person (id, name, ..)) - с состоянием и т. Д.

Я думаю,это важно знать, потому что я верю, что если я смогу это понять, я смогу написать более качественный код (например, с учетом детализации).

В любом случае, очень коротко, вот что я знаю о состоянии с сохранением состояния и без состояния:

С сохранением состояния (например, WinForms): сохраняет данные для дальнейшего использования, но ограничивает масштабируемость приложения, поскольку оно ограничено пределами ЦП или памяти.

Без сохранения состояния (как ASP.NET - хотя ASP пытается бытьStateful with ViewStates): после завершения действий данные передаются, а экземпляр передается обратно в пул потоков (аморфный).

Как видите, это довольно расплывчатая и ограниченная информация (и достаточно сфокусированная)на взаимодействие с сервером), поэтому я был бы очень признателен, если бы вы могли предоставить мне более вкусную информацию:)

Ответы [ 8 ]

71 голосов
/ 30 августа 2014

Без гражданства означает, что нет памяти о прошлом. Каждая транзакция выполняется так, как если бы она делалась в первый раз.

С состоянием означает, что есть память о прошлом. Предыдущие транзакции запоминаются и могут повлиять на текущую транзакцию.

Stateless:

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

См .: https://softwareengineering.stackexchange.com/questions/101337/whats-the-difference-between-stateful-and-stateless

71 голосов
/ 29 марта 2011

A stateful приложение - это приложение, в котором хранится информация о том, что произошло или изменилось с момента его запуска. Любая общедоступная информация о том, в каком «режиме» он находится, сколько записей обработано или что-либо еще, делает его состоящим из состояний.

Приложения без сохранения состояния не предоставляют никакой информации. Они дают один и тот же ответ на один и тот же запрос, функцию или вызов метода каждый раз. HTTP не имеет состояния в исходном виде - если вы выполняете GET для определенного URL, вы получаете (теоретически) один и тот же ответ каждый раз. Исключением, конечно, является то, что когда мы начинаем добавлять отслеживание состояния сверху, например, с веб-приложениями ASP.NET :) Но если вы подумаете о статическом веб-сайте, содержащем только HTML-файлы и изображения, вы поймете, что я имею в виду.

49 голосов
/ 22 марта 2011

Я предлагаю вам начать с вопроса в StackOverflow, в котором рассматриваются преимущества программирования без сохранения состояния.Это больше относится к функциональному программированию, но то, что вы прочтете, применимо и к другим парадигмам программирования.

Программирование без сохранения состояния связано с математическим понятием функции, которая при вызове с одинаковыми аргументами всегда возвращаетте же результаты.Это ключевая концепция парадигмы функционального программирования, и я ожидаю, что вы сможете найти много соответствующих статей в этой области.

Еще одна область, которую вы могли бы изучить, чтобы получить больше понимания, - это веб-сервисы RESTful.Они по своему замыслу являются «лицами без состояния», в отличие от других веб-технологий, которые пытаются каким-то образом сохранять состояние.(На самом деле то, что вы говорите, что ASP.NET не имеет состояния, неверно - ASP.NET изо всех сил старается сохранить состояние с помощью ViewState и определенно должна характеризоваться как сохраняющая состояние. С другой стороны, ASP.NET MVC - это технология без сохранения состояния).Есть много мест, где обсуждается «отсутствие состояния» веб-сервисов RESTful (например, это блог), но вы можете снова начать с SO вопрос .

16 голосов
/ 29 июня 2012

Прилагательное Stateful или Stateless относится только к состоянию разговора, оно не связано с концепцией функции, которая обеспечивает один и тот же выход для одного и того же ввода. В таком случае любое динамическое веб-приложение (с базой данных за ним) будет службой с отслеживанием состояния, что, очевидно, является ложным. Имея это в виду, если я возлагаю задачу на сохранение состояния разговора в базовой технологии (такой как сеанс coockie или http), я реализую службу с состоянием, но если вся необходимая информация (контекст) передается в качестве параметров I m внедряет службу без сохранения состояния. Следует отметить, что даже если переданный параметр является «идентификатором» состояния разговора (например, тикет или идентификатор сеанса), мы по-прежнему работаем в службе без сохранения состояния, поскольку диалог не имеет состояния (тикет постоянно передается между сервер) и являются двумя конечными точками, так сказать, «с состоянием».

4 голосов
/ 26 ноября 2013

Деньги переводятся онлайн с одного аккаунта на другой аккаунт с сохранением состояния, поскольку на получающем аккаунте есть информация об отправителе.Передача наличных денег от одного лица другому лицу, эта транзакция является бесстатной, потому что после получения наличных денег личность дающего не сохраняется вместе с наличными.

1 голос
/ 21 сентября 2018

Просто для добавления вклада других ... Другой способ - взглянуть на это с веб-сервера и с точки зрения параллелизма ...

HTTP по своей природе не имеет состояния по какой-то причине ... Вв случае веб-сервера с состоянием означает, что ему нужно будет помнить «состояние» пользователя для его последнего соединения и / или сохранять открытое соединение с запросчиком.Это было бы очень дорого и «напряженно» в приложении с тысячами одновременных подключений ...

Быть не имеющим состояния в этом случае имеет очевидное эффективное использование ресурсов ... т.е. поддерживать соединениев одном запросе и ответе ... Нет необходимости держать соединения открытыми и / или помнить что-либо из последнего запроса ...

0 голосов
/ 28 октября 2014

У меня были те же сомнения по поводу дизайна классов без сохранения состояния и без него, и я провел некоторое исследование. Только что завершено и мои выводы были опубликованы в моем блоге

  • Классы сущностей должны быть с состоянием
  • Вспомогательные / рабочие классы не должны быть с состоянием.
0 голосов
/ 15 января 2014

Мы делаем Webapps полными, переопределяя поведение HTTP без сохранения состояния с помощью объектов сеанса. Когда мы используем объект сеанса, состояние переносится, но мы все еще используем только HTTP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...