Активизация Just-in-time
Способность объекта быть деактивированным и повторно активированным, пока клиент сохраняет ссылку на него, называется активизацией Just-in-time.
В процессе работы приложения часто бывает необходимо использовать один экземпляр объекта COM+ несколько раз через определенные промежутки времени. При обращении к объекту он активизируется, а некоторое время после прекращения использования приложение удерживает ссылку на неиспользуемый объект.
Когда создается объект как часть среды COM+, также создается соответствующий контекст объекта. Этот контекст объекта существует в течение всего времени жизни соответствующего объекта COM+, через один или несколько циклов. COM+ использует контекст объекта для сохранения информации о нем при деактивизации.
Объект создается в неактивном состоянии и становится активным только после запроса клиента.
Когда объект становится неактивным, среда уничтожает все ресурсы объекта, в том числе, например, соединение к базе данных.
Объект COM+ становится неактивным при возникновении следующих событий:
Вызов методов SetComplete или SetAbort интерфейса IobjectContext. Если объект вызывает метод SetComplete, когда он успешно завершил свою работу и нет необходимости сохранять внутреннее состояние объекта для следующего вызова клиента. Если объект вызывает SetAbort, указывая на невозможность успешного завершения своей работы и отсутствие необходимости сохранения состояния объекта. После чего объект возвращается в состояние предшествующее этой транзакции. При нормальной реализации stateless-объекта деактивизация происходит после вызова каждого метода. Транзакция сохраняется либо прерывается. Затем объект также деактивизируется. Среди этих объектов могут продолжить свое существование только те, что имеют ссылку на клиентов за пределами данной транзакции. Последующий вызов этих объектов повторно активирует их и служит причиной для выполнения в следующей транзакции. Последний клиент освобождает объект. При этом объект деактивизируется и контекст объекта тоже освобождается.
Безопасность данных
Одним из удобных сервисов, предоставляемых COM+, является реализация возможности обеспечить доступ к компонентам (и даже к отдельным интерфейсам) в зависимости от прав, которыми обладает клиент. Безопасность COM+ состоит из двух частей:
декларативная защита данных; программная защита данных.
В обоих случаях для обеспечения безопасности среда COM+ использует роли, которые являются абстрактным представлением некоторой совокупности пользователей. Это могут быть отдельные пользователи или группы пользователей. При помощи приложения MTS Explorer администратор создает необходимые роли и заносит в них пользователей и группы. Каждая роль наделяется необходимыми правами. При этом для аутентификации можно использовать механизм аутентификации Windows.
Блокировка транзакций
Одним из основных принципов грамотного управления транзакциями является их изоляция. Для достижения этого используются различные механизмы блокировок влияния транзакций друг на друга. COM+ реализует систему изоляции транзакций на высоком уровне. Пока данные в одной транзакции не будут обработаны, они не видны в другой транзакции. Таким образом, снижается производительность системы. Для решения проблемы необходимо свести время работы каждой транзакции к минимуму и не забывать о правильном использовании таких методов, как SetComplete и SetAbort интерфейса IobjectContext (см. выше).
Действия COM+
Кроме этого, одним из наиболее важных и фундаментальных аспектов программирования для COM+ является такое понятие, как "действие" (activity). Очень часто на правильное использование действий не обращают серьезного внимания, хотя именно из-за неправильной работы с действиями возникают некоторые проблемы и трудности.
Действие - это совокупность объектов, которые действуют сообща в интересах единственного клиента. Действие может содержать объекты из разных пакетов. Каждый объект COM+ существует только в одном действии, хотя действие может содержать несколько объектов. Каждая транзакция существует только в одном действии, хотя действие может содержать несколько транзакций.
Программирование для COM+ подразумевает, что объекты COM+ не должны разделяться между действиями. Параллельное использование объектов внутри действия очень опасно, поскольку возможна ситуация, когда объект, работающий в интересах одного потока, может попытаться принять транзакцию, пока объект, работающий в интересах второго потока, находится в процессе выполнения работы внутри той же транзакции. Если транзакция была действительно принята, это привело бы к фиксации частично выполненной транзакции.
Декларативная защита данных
Декларативная защита данных создается на этапе настройки среды COM+ и выполняется средствами утилиты MTS Explorer. Она заключается в ограничении доступа к тому или иному объекту или пакету для пользователей и групп, являющихся членами тех или иных ролей.
По умолчанию в среде COM+ настроен пакет System Package, для которого предопределены две роли: администратора (Administrator) и читателя (Reader). Перед началом работы необходимо связать роль администратора с хотя бы одной учетной записью.
Как работает COM+
Итак, COM+ - это совокупность программных средств, обеспечивающих разработку, распространение и функционирование распределенных приложений для сетей Интернет и интранет. В ее состав входят:
Программное обеспечение промежуточного уровня, обеспечивающее функционирование объектов транзакций во время выполнения. Утилита MTS Explorer, позволяющая управлять объектами транзакций. Интерфейсы прикладного программирования. Средства управления ресурсами.
Стандартная программная модель приложений, использующих COM+, представляет собой трехзвенную архитектуру распределенных приложений, состоящую из серверов, клиентов и ПО промежуточного уровня. При этом бизнес-логика приложения сконцентрирована в объектах транзакций, а ПО промежуточного уровня, управляющее этими объектами, построено с использованием компонентной модели.
Разработчики, использующие COM+ в своих приложениях, создают объекты бизнес-логики, удовлетворяющие требованиям к объектам COM+; затем компилируют их и устанавливают в среде COM+ при помощи пакетов. Пакет COM+ представляет собой контейнер, обеспечивающий группировку объектов в целях защиты данных, улучшения управления ресурсами и увеличения производительности. Управление пакетами осуществляется при помощи утилиты MTS Explorer.
Контекст объекта COM+
Для каждого объекта транзакции сервер транзакций автоматически создает специальный объект, который носит название объект контекста транзакции или контекст объекта COM+. Функциональность контекста обеспечивается интерфейсом IobjectContext.
Два метода интерфейса определяют способ выхода объекта из транзакции.
Метод SetComplete сообщает транзакции, что он готов к завершению своей работы в транзакции.
Использование метода SetAbort означает, что исполнение кода объекта привело к возникновению обстоятельств, препятствующих успешному завершению транзакции.
После использования любого из этих двух методов объект завершает свое участие в транзакции.
Методы EnableCommit и DisableCommit сообщают о текущем состоянии объекта. Метод EnableCommit сообщает, что объект позволяет завершить транзакцию, хотя его функционирование еще не завершено.
Рис. 1. Роль контекста объекта COM+
Вызов метода DisableCommit показывает, что в настоящий момент текущее состояние объекта не позволяет завершить транзакцию. При попытке завершить транзакцию после вызова этого метода, транзакция будет прервана.
При помощи перечисленных методов объект контекста обеспечивает среду COM+ информацией о состоянии объекта транзакции.
Например, распределитель ресурсов может использовать контекст объекта COM+ для обеспечения сервисов на основе транзакций. Пусть объект выполняется внутри транзакции, которая зарезервировала соединение с базой данных, используя провайдер ADO. Это соединение автоматически организует транзакцию. Все изменения в базе данных, использующие такое соединение, становятся частью транзакции и затем либо принимаются, либо откатываются. Дополнительно разработчики могут использовать несколько вспомогательных методов интерфейса IobjectContext.
Объект COM+
Так как технология COM+ основана на COM, ее объекты должны удовлетворять основным требованиям к объектам COM. Помимо этого объекты COM+ имеют ряд особенностей:
объект должен быть реализован в составе внутреннего сервера (динамическая библиотека); объект должен содержать ссылку на библиотеку типов COM+; объект должен использовать только стандартный механизм маршаллинга COM; объект должен имплементировать интерфейс IobjectControl.
Исходя из общих принципов работы COM+, создаваемый объект может быть двух типов:
statefull (с сохранением информации о состоянии объекта); stateless (без сохранения информации о состоянии объекта).
Выбор типа объекта зависит от конкретной задачи и назначения объекта. Подобно любому объекту COM, объекты COM+ могут сохранять внутреннее состояние при многократном использовании одного экземпляра. При каждом использовании объект сохраняет текущие значения своих свойств. При последующем вызове объект может вернуть запрашивающему клиенту текущее состояние. Такой объект имеет тип statefull. Объекты этого типа позволяют решать более широкий спектр задач.
Сохранение состояния объекта требует, чтобы тот оставался активным и сохранял такие ценные ресурсы как, например, соединение с базой данных. На практике это означает не что иное, как работу с глобальными переменными, потому что именно в них хранится промежуточное состояние объекта.
Если объект не может сохранять свое промежуточное состояние, то он относится к типу stateless. Объекты этого типа более эффективны. Когда транзакция успешно завершена или прервана, все объекты, вовлеченные в транзакцию, деактивируются и, соответственно, теряют информацию о своем состоянии, приобретенную во время транзакции. Это помогает убедиться в изоляции транзакции и согласованности базы данных, а также освобождает ресурсы сервера для использования другими транзакциями. Завершение транзакции позволяет COM+ деактивировать объект и обновить ресурсы.
Оптимизация работы с COM+
Разработать приложение, использующее COM+, формально просто. Более сложной задачей является проектирование приложения таким образом, когда оно не только работает, но и приносит максимальный эффект от своей работы, воплощая все возможности используемой технологии. Для этого надо хорошо представлять механизм работы объектов COM и принципы работы с транзакциями.
Освобождение ресурсов
Обычно освобождение ресурсов объекта делается при помощи вызова методов SetComplete и SetAbort после обслуживания запроса клиента. Эти методы освобождают ресурсы, зарезервированные распределителем ресурсов COM+.
В то же самое время необходимо освобождать ссылки на другие ресурсы, включая ссылки на другие объекты (и объекты COM+ и контексты объектов) и память, занятую экземплярами компонентов. Этого не следует делать лишь в случае, если надо сохранить информацию о состоянии между вызовами клиентов.
Программная защита данных
Программная защита данных обеспечивается объектом контекста (см. выше) и методами IsSecurityEnabled и IsCallerInRole интерфейса IobjectContext этого объекта. Программная защита данных проектируется на этапе разработки приложения и исполняется при функционировании приложения, использующего данный объект COM+.
Когда приложение пытается использовать некоторый объект COM+, необходимо применить метод IsCallerInRole. В качестве параметра метода передается роль, исполняемая приложением. Если объект или пакет COM+ разрешен для роли, его использование разрешается и метод возвращает значение True.
Если же несколько объектов MTS используются в рамках одного процесса, метод IsCallerInRole возвращает True всегда. В этом случае для более точной идентификации применяется метод IsSecurityEnabled.
Пулинг объектов
COM+ реализует не только пулинг ресурсов, но и пулинг объектов. Правда, эта возможность доступна только в рамках технологии COM+, работающей под управлением операционных систем Windows 2000 и Windows 2003. В COM+ более старых версий пулинг объектов лишь декларирован для будущего использования.
Рис. 2. Схема пулинга объектов COM+
Суть этого механизма проста.
При выполнении приложений в среде COM+ создается специальный пул объектов.
Для управления пулом и размещения в нем объектов используется интерфейс IobjectControl. Если объект предназначен для использования в пулинге, то метод CanBePooled-интерфейса должен возвращать значение True. После деактивизации такого объекта сервер COM+ помещает его в пул. Объекты внутри пула доступны для немедленного использования любыми другими запросами клиентов. В случае если объект запрошен, но пул объектов пуст, MTS автоматически создает новый экземпляр объекта.
Пулинг ресурсов
После освобождения ресурсов при деактивизации объекта COM+ они становятся доступными для других серверных объектов. Этот процесс называется пулингом ресурсов.
Рассмотрим, например, соединение с базой данных через провайдер ADO. Известно, что выделение ресурсов, открытие и закрытие соединения с базой данных занимает довольно много времени. Частое повторение этой операции различными объектами COM+ применительно к одной базе данных вызовет повышенный расход ресурсов.
Именно в таких случаях и используется пулинг ресурсов. Соединение с базой данных, больше не используемое одним серверным объектом, может быть использовано другим объектом.
Для выполнения задач пулинга ресурсов COM+ использует распределитель ресурсов.
Ресурсы
Для управления ресурсами MTS использует три способа:
активизация Just-in-time; пулинг ресурсов (Resource pooling); пулинг объектов (Object pooling).
Рассмотрим конкретнее каждый из способов.
Технология COM+ (Microsoft Transaction Server)
Евгений Марков, Генеральная Сервисная Компания (Санкт-Петербург)
Источник:
Для распределенных приложений большое значение имеют вопросы обеспечения надежности, производительности, масштабируемости. Технология COM+ (старое название Microsoft Transaction Server, MTS) входит в состав серверных операционных систем Microsoft и предназначена для поддержки систем обработки транзакций.
COM+ может устанавливаться и работать на компьютерах с операционными системами Windows 95/98, Windows NT, Windows XP, Windows 2000, Windows 2003. Однако необходимо отметить, что система безопасности транзакций не реализована для операционных систем Windows 95/98 вследствие объективных ограничений, накладываемых этими системами.
Технология COM+ базируется на возможностях COM и обеспечивает поддержку распределенных приложений на компонентной основе. Объекты транзакций COM+ обладают основными свойствами объектов COM. Кроме этого, объекты транзакций реализуют специфические возможности, присущие только объектам MTS:
управление транзакциями; безопасность; пулинг ресурсов; пулинг объектов.
Для управления объектами транзакций и настройки параметров COM+ используется ряд приложений и утилит.
Координатор распределенных транзакций (Distributed Transaction Coordinator, DTC) представляет собой службу, управляющую транзакциями на низком уровне с использованием протокола двухфазной фиксации транзакций. Административное приложение MTS Explorer позволяет настраивать параметры среды COM+, хранимые в системном реестре; управлять пакетами и ролями COM+. Утилиты COM+ для работы в командной строке или batch-файле. Исполняемый файл MTX.EXE, который реализует автоматические транзакции, безопасность и активизацию (Just-In-Time, JIT).
Помимо перечисленных средств, для управления COM+ можно использовать и стандартные системные средства. Причем для выполнении любых операций необходимо иметь полномочия администратора на данном компьютере.
Тестирование и установка компонентов COM+
При настройке среды COM+ среди многих параметров администратор может задавать время пребывания объекта транзакции в активном состоянии без вызовов со стороны клиентов. Это параметр transaction timeout. По умолчанию это время равно 60 секундам.
При отладке объектов COM+ необходимо отключить этот параметр (присвоить значение, равное нулю), иначе объект может быть выгружен средой, пока вы работаете с исходным кодом или значениями переменных в процессе отладки.
В стадии разработки компонент нельзя перекомпилировать, пока он находится в памяти. В этом случае появится сообщение об ошибке "Cannot write to DLL while executable is loaded.". Для устранения такой ситуации необходимо с использованием MTS Explorer установить в свойствах пакета параметр shut down after being idle for 3 minutes, изменив соответственно время.
Для этого надо:
В MTS Explorer щелкнуть правой кнопкой мыши на пакете, в котором инсталлирован интересующий объект транзакции и из всплывающего меню выбрать пункт Properties. В появившемся диалоге выбрать закладку Advanced. Изменить время ожидания на 0. Нажать кнопку OK для сохранения параметров и вернутся в среду MTS Explorer.
Транзакции
Способность объекта COM+ "жить" внутри своей собственной транзакции или быть частью большой группы аналогичных объектов, которые принадлежат одной транзакции, - огромное преимущество COM+. Это позволяет применять компонент для решения различных задач, таким образом, что разработчики могут использовать код заново без модернизации логики приложения. Транзакции COM+ гарантируют, что: все изменения в одной транзакции будут либо приняты, либо возвращены в свое предыдущее состояние; транзакция правильно и однозначно преобразует состояние системы; одновременные транзакции не видят частичные и не сохраненные изменения, которые могут создавать конфликты; подтверждение изменений управляемых ресурсов (таких как записи баз данных) защищает от ошибок, включая ошибки сети и процессов; регистрация транзакций позволяет восстанавливать исходное состояние даже после ошибок на дисках.
Клиенты могут использовать прямой контроль над транзакциями с помощью контекста объекта, используя интерфейс ItransactionContext. Однако существует возможность и автоматического управления транзакциями.
Атрибуты транзакций можно устанавливать тремя способами:
на этапе разработки; с помощью редактора библиотеки типов; в среде MTS Explorer.
Завершение транзакции по умолчанию происходит через время, указанное в параметре transaction timeout, который выставляется для каждого объекта отдельно через утилиту MTS Explorer. По умолчанию это время равно 60 секундам. По истечении данного периода, если транзакция не успела завершиться, она автоматически прерывается.