alexlp
Дек. 8, 2009 21:34:50
С моим pylons-приложением работает около 30 человек. Шаблоны напичканы AJAX-ом, запросов от одного клиента к серверу немало. Иногда один пользователь может получить данные, которые запросил другой пользователь, либо внося изменения сервер записывает данные в сессию другого пользователя. Складывается впечатление, что сервер не определяет куда отправлять данные и/или записывает их ошибочно.
Я использовал базовый “paster”, связку apache2 + mod_wsgi, nginx+paster/flup ситуация не меняется (хотя с apache2 ошибок меньше, но и работает он медленнее). В какой-то документации по WSGI узнал, что большое число запросов в одном потоке может вызвать такие ошибки. В Apache2 я указывал в WSGIDaemonProcess threads=100 (по умолчанию 15), сервер работает медленнее, тем не менее ошибочные сессии случаются.
Есть ли лекарство от этого недуга или это родовая травма Pylons?
ofigetitelno
Дек. 8, 2009 23:52:55
:)
Какая версия pylons?
Что понимается под сессией - пилоновская сессия?
alexlp
Дек. 9, 2009 09:17:28
Pylons 0.9.7 Beaker 1.5.
После ввода логина и пароля пользователем открывается сессия бейкера, в data/session создается файл с переменными пользователя. Вот только сервер почему то ошибается при работе с пользователем. Я точно не знаю с чем проблемы либо с бейкером, либо с веб-сервером. Да еще, ошибка скорее всего происходит, когда происходит одновременный запрос. Например, пользователь 1 открывает страницу /user/setuser и пользователь 2 открывает /user/setuser, увы пользователь 2 получает запрос пользователя 1 как и пользователь 1 получает свою страницу, запрос пользователя 2 почему то игнорируется.
estin
Дек. 9, 2009 09:59:44
>> запрос пользователя 2 почему то игнорируется.
Вообще не получает ответа?
Кеширование есть?
alexlp
Дек. 9, 2009 10:19:53
>> Вообще не получает ответа?
Получает неверный ответ. В момент запроса до его получение проходит некое время (ну пока сервер отгенерирует страницу), в случае “неверного” ответа, страница вылетает моментально.
Хуже всего, что данные посылаемые одним пользователем ложатся в сессию (выбранный из базы user с которым работает пользователь 1) другому.
Кеширований нет (насколько мне известно в pylons кеширование отключено по-умолчанию), сервер виден напрямую, прокси нет (никаких nginx, squid…).
ofigetitelno
Дек. 9, 2009 13:53:08
:)
Покажите кусок кода, где вы сохраняете данные в сессию, и где достаёте данные из неё…
alexlp
Дек. 9, 2009 14:22:11
Модель авторизации была взята от сюда.
http://projecthq.org/documentation/introduction/demonstration.htmlпосле залогинивания на стороне сервера создается файл beaker.session с переменными
(dp1
S'session'
p2
(dp3
S'REMOTE_USER_NAME'
p4
Valexlp
p5
sS'REMOTE_USER'
p6
I1
sS'REMOTE_USER_IP'
p7
V192.168.1.1
p8
……
Старые файлы Beaker я периодически удаляю (по рекомендации разработчиков Beaker).
Если вы посмотрите исходники Project HQ, то в lib.base в методе __call__ есть переменная c.current_user которая является сcылкой на текущего пользователя. извлекается она из session
Во время разработки я работал с системой один и проблемы не замечал, но после запуска и появления “нагрузки” образовались такие проблемы с ошибками записи/получения данных.
Я не знаю где именно кроется эта ошибка, в Beaker (смущает частое обновление с критикал фиксами) или в WSGI-приложении или в веб-сервере, не знаю
estin
Дек. 9, 2009 18:30:35
95% что ошибка кроится именно в вашем коде.
Протестируйте простой код (вне вашей архитектуры, но с темже окружением), записывающий в сессию пользователя счетчкик его запросов и возвращающий это количество в ответ.
Напишите программку для тестирования которая в N потоков будет
“открывать сессию” логинится (получать куку сессии), и с этой кукой переодически делать запрос и сравнивать ответ.
Например на 15-ый запрос localhost:8080/?t=thread1 должен быть ответ thread1_15.
alexlp
Дек. 9, 2009 20:14:20
Если с системой работает только один пользователь либо запросы последовательны, то ошибок не возникает. Но если сделать запрос одновременно (достаточно по счету “три, два, один..”), то возникает ошибка.
Кука на протяжении сеанса не меняется.
PooH
Дек. 10, 2009 06:22:00
Не знаю насколько в тему, но была история с apache2 + mod_wsgi + TurboGears под windows, странным образом перескакивали куки с пользователя на пользователя, на тестовой машине с той же связкой под linux такое не наблюдалось. Полностью так и не разобрался, грешу на сборку mod_wsgi под win, я ее где-то нашел готовую, перевел на связку apache2 + mod_python.