Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 8, 2009 21:34:50

alexlp
От:
Зарегистрирован: 2009-11-12
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбор веб-сервера, ошибки в thread

С моим pylons-приложением работает около 30 человек. Шаблоны напичканы AJAX-ом, запросов от одного клиента к серверу немало. Иногда один пользователь может получить данные, которые запросил другой пользователь, либо внося изменения сервер записывает данные в сессию другого пользователя. Складывается впечатление, что сервер не определяет куда отправлять данные и/или записывает их ошибочно.
Я использовал базовый “paster”, связку apache2 + mod_wsgi, nginx+paster/flup ситуация не меняется (хотя с apache2 ошибок меньше, но и работает он медленнее). В какой-то документации по WSGI узнал, что большое число запросов в одном потоке может вызвать такие ошибки. В Apache2 я указывал в WSGIDaemonProcess threads=100 (по умолчанию 15), сервер работает медленнее, тем не менее ошибочные сессии случаются.

Есть ли лекарство от этого недуга или это родовая травма Pylons?



Офлайн

#2 Дек. 8, 2009 23:52:55

ofigetitelno
От:
Зарегистрирован: 2006-08-01
Сообщения: 136
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбор веб-сервера, ошибки в thread

:)
Какая версия pylons?
Что понимается под сессией - пилоновская сессия?



Офлайн

#3 Дек. 9, 2009 09:17:28

alexlp
От:
Зарегистрирован: 2009-11-12
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбор веб-сервера, ошибки в thread

Pylons 0.9.7 Beaker 1.5.
После ввода логина и пароля пользователем открывается сессия бейкера, в data/session создается файл с переменными пользователя. Вот только сервер почему то ошибается при работе с пользователем. Я точно не знаю с чем проблемы либо с бейкером, либо с веб-сервером. Да еще, ошибка скорее всего происходит, когда происходит одновременный запрос. Например, пользователь 1 открывает страницу /user/setuser и пользователь 2 открывает /user/setuser, увы пользователь 2 получает запрос пользователя 1 как и пользователь 1 получает свою страницу, запрос пользователя 2 почему то игнорируется.



Офлайн

#4 Дек. 9, 2009 09:59:44

estin
От:
Зарегистрирован: 2008-05-31
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбор веб-сервера, ошибки в thread

>> запрос пользователя 2 почему то игнорируется.
Вообще не получает ответа?

Кеширование есть?



Офлайн

#5 Дек. 9, 2009 10:19:53

alexlp
От:
Зарегистрирован: 2009-11-12
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбор веб-сервера, ошибки в thread

>> Вообще не получает ответа?
Получает неверный ответ. В момент запроса до его получение проходит некое время (ну пока сервер отгенерирует страницу), в случае “неверного” ответа, страница вылетает моментально.
Хуже всего, что данные посылаемые одним пользователем ложатся в сессию (выбранный из базы user с которым работает пользователь 1) другому.

Кеширований нет (насколько мне известно в pylons кеширование отключено по-умолчанию), сервер виден напрямую, прокси нет (никаких nginx, squid…).



Офлайн

#6 Дек. 9, 2009 13:53:08

ofigetitelno
От:
Зарегистрирован: 2006-08-01
Сообщения: 136
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбор веб-сервера, ошибки в thread

:)
Покажите кусок кода, где вы сохраняете данные в сессию, и где достаёте данные из неё…



Офлайн

#7 Дек. 9, 2009 14:22:11

alexlp
От:
Зарегистрирован: 2009-11-12
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбор веб-сервера, ошибки в thread

Модель авторизации была взята от сюда.
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-приложении или в веб-сервере, не знаю



Офлайн

#8 Дек. 9, 2009 18:30:35

estin
От:
Зарегистрирован: 2008-05-31
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбор веб-сервера, ошибки в thread

95% что ошибка кроится именно в вашем коде.

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

Напишите программку для тестирования которая в N потоков будет
“открывать сессию” логинится (получать куку сессии), и с этой кукой переодически делать запрос и сравнивать ответ.

Например на 15-ый запрос localhost:8080/?t=thread1 должен быть ответ thread1_15.



Офлайн

#9 Дек. 9, 2009 20:14:20

alexlp
От:
Зарегистрирован: 2009-11-12
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбор веб-сервера, ошибки в thread

Если с системой работает только один пользователь либо запросы последовательны, то ошибок не возникает. Но если сделать запрос одновременно (достаточно по счету “три, два, один..”), то возникает ошибка.
Кука на протяжении сеанса не меняется.



Офлайн

#10 Дек. 10, 2009 06:22:00

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Выбор веб-сервера, ошибки в thread

Не знаю насколько в тему, но была история с apache2 + mod_wsgi + TurboGears под windows, странным образом перескакивали куки с пользователя на пользователя, на тестовой машине с той же связкой под linux такое не наблюдалось. Полностью так и не разобрался, грешу на сборку mod_wsgi под win, я ее где-то нашел готовую, перевел на связку apache2 + mod_python.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version