Объект Singleton в веб-Саду IIS

Я имею большую реализацию Singleton в приложении asp.net и хочу переместить свое приложение в веб-среду Сада IIS по некоторым причинам производительности.

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

я могу сделать все те одноэлементные объекты, одиночный элемент снова в веб-Саду IIS?

6
задан Anwar Chandra 23 May 2010 в 19:53
поделиться

1 ответ

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

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

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

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

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

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

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

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

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

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

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

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

10
ответ дан 10 December 2019 в 00:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: