Как мне поддерживать состояние на стороне сервера с помощью Snap Framework? - PullRequest
5 голосов
/ 11 октября 2010

Сеансы на стороне сервера [пока] не являются частью Snap Framework.Есть ли способ добавить какое-либо состояние на стороне сервера?

Давайте представим, что я хочу увеличить счетчик для каждого запроса HTTP.Как бы я это сделал?

Ответы [ 3 ]

8 голосов
/ 12 октября 2010

Приведенный выше ответ верен, но он не имеет отношения к некоторым реальным проблемам.

Сначала перезапускается сервер.Если ваше хранилище больше, чем кэширование, оно должно быть долговечным при перезапусках сервера.

Второе - это перезагрузка кода.Будущие версии Snap, начиная с версии 0.3 (вероятно, в начале декабря), будут иметь динамическую перезагрузку кода при использовании в разработке.Это огромное преимущество с точки зрения скорости разработки, но оно делает локальное состояние сервера интересным умственным упражнением.Если программист изменяет тип / инициализацию / что-либо из локального состояния сервера, он должен быть повторно инициализирован.Там есть некоторые огромные инженерные проблемы.

Когда я писал код динамической перезагрузки для 0.3, я некоторое время боролся с этой проблемой.Затем я посмотрел на другие платформы.PHP?Хранит все внешне (база данных, memcache, что угодно).Нет хранения кросс-запросов в памяти вообще.Рубин на рельсах?То же самое.

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

Поэтому я разработал общий интерфейс, используемый загрузчиками для производства и разработки (один использует статическую загрузку, другой динамическую загрузку) для выполнения 3 функций:функция инициализации, функция очистки и обработчик, который использует состояние, возвращаемое функцией инициализации.В рабочем режиме это сводится к инициализации вызова при запуске сервера и очистке при завершении работы сервера.В режиме разработки он компилируется так: для каждого запроса динамически загружаются все 3, затем запускаются init, handler, cleanup.Очевидно, что ни одно состояние не выдержит перекрестного запроса таким образом.

И тогда я отвечу так: сделайте хранилище перекрестных запросов с помощью какого-либо механизма со встроенной надежностью, и состояние сервера будет просто интерфейсом для этого,Используйте что-то вроде happstack-state или sqlite, если вы хотите работать в процессе, или базу данных или какое-то другое внешнее хранилище, если вы хотите работать вне локального процесса.

Как добавленная заметка, управление "глобальным"«Ресурсы, такие как пул соединений и т. п., также намного проще в Snap 0.3 благодаря добавлению интерфейса MonadSnap.

3 голосов
/ 11 октября 2010

Самый простой способ - указать состояние за мваром:

fooHandler :: MVar Int -> Snap ()
fooHandler mvar = do
    x <- liftIO $ modifyMVar mvar $ \y -> let y'=y+1 in (y',y')
    writeBS $ S.pack $ "Incremented counter to: " ++ show x

Инициализируйте mvar при инициализации сайта. Надеюсь, это поможет.

1 голос
/ 09 октября 2011

Я нашел два пакета, относящихся к сеансу:

snap-auth производится командой Snap Framework или, по крайней мере, одним из ее авторов / авторов (Озгун Атаман). Он нацелен на аутентификацию и управление сессиями. Управление сеансом осуществляется с помощью сопоставления ByteString с ByteString, подразумевая, что вы можете хранить только данные, которые уже были сериализованы в ByteString:

type Session = Map ByteString ByteString

С другой стороны, mysnapsession позволяет вам использовать произвольный тип для моделирования вашего сеанса. Однако есть некоторые вспомогательные функции для сеансов типа Map. Подробнее здесь . Автор, Крис Смит, также является частью проекта Snap Framework.

...