Проблема, созданная балансировкой нагрузки в ASP.NET - PullRequest
2 голосов
/ 27 октября 2009

0 У меня есть приложение ASP.NET 3.0, которое отлично работает на одном сервере. Он использует переменные приложения, чтобы проверить, извлек ли пользователь файл, и блокирует его для всех остальных пользователей. Когда я помещал приложение на серверы с балансировкой нагрузки, приложение не работало должным образом, так как несколько пользователей были отправлены на несколько серверов, и каждый пользователь мог получить требуемый файл.

Суть в том, что я могу поделиться переменными приложения в своем приложении, даже если оно распределено по нескольким серверам. Или есть лучший способ получить глобальную переменную?

РЕДАКТИРОВАТЬ: я проверяю, извлечен ли файл приложением ["FileLocked"], истинно или ложно

Ответы [ 4 ]

2 голосов
/ 27 октября 2009

Переменные приложения хранятся в ASP.NET, что означает, что у вас будут дубликаты переменных между серверами.

Как предположил Джон, сохраните это в базе данных. Вот где этот тип информации должен идти. Причины:

  1. Устраняет влияние балансировки нагрузки на переменные сеанса и приложения
  2. Поддерживает значения, даже если приложение сбрасывает . Обычно приложение ASP.NET выгружается (?) Через 20 минут бездействия. С вашей схемой, даже на одном сервере, это означает, что если кто-то проверит файл, вернется домой и вернется на следующий день, он больше не будет проверен. Хранение этой информации в базе данных устраняет эту проблему.
2 голосов
/ 27 октября 2009

Две вещи для вас, чтобы рассмотреть:

  1. В среде с балансировкой нагрузки данные экземпляра на одном сервере не будут доступны другому. Хотя вы можете использовать состояние сеанса вне процесса, вы не можете легко сделать элементы кэша или данные статического класса доступными на серверах. Пользовательский запрос не всегда будет перенаправлен на один и тот же сервер (если вы не используете что-то вроде липких сессий), что может вызвать другие проблемы.

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

2 голосов
/ 27 октября 2009

Как вы говорите системе, что файл извлечен? Я надеюсь, что вы не используете переменные сеанса. Вы должны сохранить состояние в поле базы данных, а затем проверить, проверено ли поле (bool / bit) / нет. Находится ли система на нескольких серверах или один не имеет значения. Соединение с приложением будет использовать ту же строку соединения, следовательно, те же данные.

0 голосов
/ 27 октября 2009

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

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