ASP - Разработка масштабируемых компонентов
Разработка масштабируемых компонентов
Поскольку большую часть бизнес-логики следует заключать в компоненты COM, важно, чтобы компоненты обеспечивали высокое быстродействие в дополнение к масштабируемости.
Ниже приведены некоторые предложения по созданию масштабируемых компонентов:
- Оптимизируйте алгоритмы.
- Привяжите компонент к соответствующей модели потоков. Компоненты со страничной областью определения должны использовать замкнутую (Apartment) или двойную (Both) модель потоков. Компоненты с областью определения — приложением должны использовать двойную модель и должны также включать в себя сортировщик свободных потоков. Дополнительные сведения о вопросах моделей потоков компонентов см. раздел Selecting a Threading Model в документации IIS в пакете SDK операционной системы.
- Если компонент интенсивно использует кучу, рассмотрите другие альтернативы использованию кучи. Интенсивное использование кучи Windows® может вызвать конфликт ресурсов. Следует рассмотреть несколько альтернатив выделения памяти, включая:
- Разделение кучи, сопровождаемое созданием нескольких пользовательских куч, в дополнение к стандартной куче процесса. Каждая пользовательская куча должна контролироваться отдельной, не глобальной, блокировкой, а конфликт блокировки должен быть уменьшен.
- Кэшируемое выделение, которое заключается в использовании специальных операций выделения, которые действуют как промежуточный слой между пользователями объекта и кучей. Вызовы кучи Win32 производятся нечасто и только для больших блоков памяти. Эти блоки подразделяются и управляются пользовательской программой распределения памяти.
- Выделение стека, используя функцию языка C _alloca для выделения памяти объектам в стеке вместо кучи. Использование этого метода возможно только для относительно небольших объектов, поскольку пространство, доступное для стека, ограниченно. Кроме того, каждый вновь размещенный объект будет доступен только внутри текущей функции или функций, вызываемых из нее. При завершении текущей функции память, выделенная под стек, будет утеряна.
- Инкапсуляция объектов, сопровождаемая включением буфера в структуру данных класса компонента. Этот буфер затем используется для задач, которые будут требовать доступа к куче Win32.
- Избегайте использования глобальных блокировок внутри компонента, если это возможно. Глобальные блокировки часто отрицательно сказываются на масштабируемости компонента.
- Если компонент выполняется как часть приложения, для отладки укажите приложение как внешнее (out-of-process). Изоляция приложений, введенная в IIS 4.0, является полезной возможностью. Межпроцессная сортировка требуется для поддержки изолирования процессов, однако она может вызвать некоторые накладные расходы выполнения компонента. Эта разница в накладных расходах довольно существенна для простых компонентов и менее заметна для более сложных. Чтобы увеличить быстродействие и улучшить масштабируемость, рассмотрите запуск приложения вне процесса, пока оно не отлажено и не работает достаточно устойчиво, чтобы выполняться в одном процессе с IIS.
- Рассмотрите возможность помещения компонента в библиотеку (внутреннюю) COM+ приложения. Как часть возможности своевременной активизации в службе компонентов, фабрика классов компонента COM кэшируется и используется повторно для каждого запроса на создание экземпляра посредством CreateInstance.