Одиночный объект в IIS Web Garden

У меня много реализаций Singleton в приложении asp.net, и я хочу переместить свое приложение в среду IIS Web Garden по некоторым причинам производительности.

CMIIW, переходя в IIS Web Garden с n рабочим процессом, будет содержать один одноэлементный объект, созданный в каждом рабочем процессе, что делает его больше не единственным объектом, потому что n > 1.

я могу сделать все эти одноэлементные объекты, снова одноэлементные в IIS Web Garden?

1 ответ

Решение

Я не верю, что вы можете (если вы не можете заставить тех работников IIS как-то использовать объекты в общей памяти).

Это проблема сферы. Ваш экземпляр Singleton использует пространство процесса в качестве своей области. И, как вы сказали, ваша реализация теперь охватывает несколько процессов. По определению, в большинстве операционных систем синглтоны будут привязаны к определенному пространству процессов, поскольку они привязаны к одному экземпляру класса или объекту.

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

Примеры альтернативных конструкций, которые могут работать, включают...

  1. Вы можете синхронизировать несколько объектов в центральном хранилище или друг с другом.
  2. Используйте сериализацию объекта, если применимо.
  3. Используйте службу Windows и некоторую форму IPC, например. System.Runtime.Remoting.Channels.Ipc

Мне нравится вариант 3 для больших сайтов. Сопутствующая служба Windows очень полезна для крупных веб-сайтов. Многие вещи, такие как отправка почты, пакетные задания и т. Д., Уже должны быть отделены от рабочего процесса обработки внешнего интерфейса. Вы можете вставить объект-сервер singleton в этот процесс и использовать клиентские объекты в рабочих процессах IIS.

Если ваш одноэлементный класс работает с несколькими объектами, которые разделяют состояние или просто разделяют начальное состояние, то варианты 1 и 2 должны работать соответственно.

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

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

Существует множество реализаций распределенного кэша.

  1. Microsoft AppFabric (ранее называвшийся Velocity) - их недавний шаг в это пространство.
  2. Memcached ASP.Net провайдер
  3. NCache ( статья MSDN) - Пользовательский поставщик ASP.Net Cache для поддержки OutProc. Там должны быть другие пользовательские поставщики кэша там.
  4. Разверните свой собственный распределенный кеш, используя Windows Services и IPC (вариант 3)

PS. Так как вы специально смотрите в чат. Я определенно рекомендую исследовать Comet ( реализация Comet для ASP.NET? И WebSync и т. Д.)

Другие вопросы по тегам