Одиночный объект в IIS Web Garden - PullRequest
6 голосов
/ 23 мая 2010

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

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

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

1 Ответ

10 голосов
/ 04 июня 2010

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

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

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

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

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

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

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

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

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

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

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

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

...