2009-07-24 6 views

ответ

4

Использование состояний обычно облегчает работу программиста.

Однако в штатах также представлены всевозможные проблемы параллелизма, которые просто отсутствуют в ситуациях без гражданства.

Это по существу дискуссия между функциональным и императивным программированием.

+0

Я действительно не понимаю, какие «проблемы параллелизма» вы можете получить в веб-приложении ... –

+0

Предположим, у вас одновременно есть два пользователя на вашем сайте. Если оба они представят одновременно, возможно ли, что они оба попадут в вашу базу данных или какую-то другую услугу, и наступит гонка? – samoz

+6

Но это проблема с базой данных; это не имеет никакого отношения к тому, сохраняете ли вы состояние в своем веб-приложении или нет. Для обработки этих проблем записываются базы данных, совместимые с ACID (т. Е. Все реляционные базы данных). –

1

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

8

В нашем проекте используется веб-каркас Wicket, который позволяет взаимодействовать с состоянием или без состояния. Межсетевые страницы имеют ряд преимуществ:

  • Используя динамическую страницу в калитке делают его легче выполнять частичные обновления страницы с помощью AJAX рамки калитки в
  • Stateful является более «интуитивно» моделью программирования. Например, в классе страницы калитки я могу объявить поле частного члена на стороне сервера, установить его, когда страница загружена, и получить к нему доступ каждый раз, когда запрос AJAX попадает на страницу для выполнения некоторого обновления.
  • Wicket предотвращает большинство распространенных проблем параллелизма в веб-уровне путем синхронизации на объекте пользовательского сеанса при обработке запроса.
  • Хранение состояния на стороне сервера может иногда улучшить производительность; например, объект, который требует времени для создания, но должен быть доступен для страницы, может быть загружен только один раз, когда страница сначала создается.

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

Ссылка на калитке: http://wicket.apache.org/

1

Я в statefull клиента-сервера без гражданства из-за лагеря к масштабированию, но когда сталкиваются с препятствиями, объясняющим, почему это и что стало труднее реализовать с помощью сервера без гражданства, вы получите вид ушел в отставку в конечном итоге, это то, где светит сервер с поддержкой состояния :). Несмотря на то, что я предпочитаю statefull client, это непросто эффективно реализовать с помощью asp.net viewstate, и, возможно, это то, где statefull web становится практически. Я думаю, что statefull client, сервер без гражданства делает вас более осведомленным о количестве данных, которые транспортируются между шинами. Это иногда скрывается до тех пор, пока не возникнет проблема с использованием модели statefull server programming. Кроме того, переход от stateless к statefull легко (просто игнорируйте информацию о состоянии, которую вы предоставляете, поскольку вы уже знаете это ..). Переход на противоположное почти невозможно/не стоит. Еще одна вещь, использующая statefull-сервер, заключается в том, что состояние очистки/кеш часто является проблемой, когда вы используете также statefull-клиент.Это просто неинтуитивно и сбивает с толку, или мабы просто я :)

В любом случае GWT и многие другие современные инструментальные средства (Silverlight, говорящие с WCF), по-видимому, предпочитают клиента с сохранением состояния, сервера без гражданства из-за проблем с масштабируемостью. Может быть, сервер с состоянием должен быть исключением из правила без сохранения ... можно выбрать одну страницу/окно.

источники: http://groups.google.com/group/google-web-toolkit/browse_thread/thread/2871ef5076c1bdb6/43e7a5377047aa44?#43e7a5377047aa44

1

Stateless веб-приложения необходимы, когда вы начинаете иметь более высокий трафик.

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

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

Лучший подход заключается в том, чтобы хранить сеанс за веб-серверами в каком-то хранилище данных, в эти дни для этого доступны множество отличных продуктов nosql (redis, mongo, elasticsearch, memcached). Таким образом, веб-серверы не имеют состояния, но у вас все еще есть государственная серверная часть, и доступность этого состояния может управляться путем выбора правильной настройки хранилища данных. Эти хранилища данных обычно имеют большую избыточность, поэтому почти всегда возможно вносить изменения в ваше веб-приложение и даже в хранилище данных, не затрагивая пользователей.

+0

Думаю, я точно не ответил на вопрос OPs, действительно наоборот! Но я почувствовал, что мой ответ вступил в дискуссию ... – shmish111