Одиночный объект в IIS Web Garden
У меня много реализаций Singleton в приложении asp.net, и я хочу переместить свое приложение в среду IIS Web Garden по некоторым причинам производительности.
CMIIW, переходя в IIS Web Garden с n рабочим процессом, будет содержать один одноэлементный объект, созданный в каждом рабочем процессе, что делает его больше не единственным объектом, потому что n > 1.
я могу сделать все эти одноэлементные объекты, снова одноэлементные в IIS Web Garden?
1 ответ
Я не верю, что вы можете (если вы не можете заставить тех работников IIS как-то использовать объекты в общей памяти).
Это проблема сферы. Ваш экземпляр Singleton использует пространство процесса в качестве своей области. И, как вы сказали, ваша реализация теперь охватывает несколько процессов. По определению, в большинстве операционных систем синглтоны будут привязаны к определенному пространству процессов, поскольку они привязаны к одному экземпляру класса или объекту.
Тебе действительно нужен синглтон? Это очень важный вопрос, чтобы задать перед использованием этого шаблона. Как говорит Википедия, некоторые считают это анти-паттерном (или запахом кода и т. Д.).
Примеры альтернативных конструкций, которые могут работать, включают...
- Вы можете синхронизировать несколько объектов в центральном хранилище или друг с другом.
- Используйте сериализацию объекта, если применимо.
- Используйте службу Windows и некоторую форму IPC, например. System.Runtime.Remoting.Channels.Ipc
Мне нравится вариант 3 для больших сайтов. Сопутствующая служба Windows очень полезна для крупных веб-сайтов. Многие вещи, такие как отправка почты, пакетные задания и т. Д., Уже должны быть отделены от рабочего процесса обработки внешнего интерфейса. Вы можете вставить объект-сервер singleton в этот процесс и использовать клиентские объекты в рабочих процессах IIS.
Если ваш одноэлементный класс работает с несколькими объектами, которые разделяют состояние или просто разделяют начальное состояние, то варианты 1 и 2 должны работать соответственно.
редактировать
Судя по вашим комментариям, первый вариант в форме распределенного кэша должен работать на вас.
Существует множество реализаций распределенного кэша.
- Microsoft AppFabric (ранее называвшийся Velocity) - их недавний шаг в это пространство.
- Memcached ASP.Net провайдер
- NCache ( статья MSDN) - Пользовательский поставщик ASP.Net Cache для поддержки OutProc. Там должны быть другие пользовательские поставщики кэша там.
- Разверните свой собственный распределенный кеш, используя Windows Services и IPC (вариант 3)
PS. Так как вы специально смотрите в чат. Я определенно рекомендую исследовать Comet ( реализация Comet для ASP.NET? И WebSync и т. Д.)