Logo DocIRS

No olvides que corregir o construir códigos para el  sistema, es una acción técnica, pero conversar con el responsable del tema para apurar el proceso, es una acción política. Ambas acciones van juntas de la mano..

JEGC

Microsoft Transaction Server
Una herramienta hacia los procesos distribuidos

José Enrique González Cornejo
25 de marzo 2001

 

Ver Arquitectura en Capas ~ DNA

 


Introducción

 

Microsoft Transaction Server supone una poderosa herramienta para controlar y optimizar el rendimiento de nuestras aplicaciones de servidor.

Es un elemento de servidor que se integra totalmente con IIS para mejorar el rendimiento de las aplicaciones Web: Transaction Server. Lo podemos encontrar en el Windows NT 4.0 Option Pack, un paquete de aplicaciones que extienden la funcionalidad del sistema operativo Windows Nt 4.0 para convertirlo en un auténtico y operativo servidor en Internet.

Transaction Server es un producto que ya existía, pero que muy pocos desarrolladores conocían hasta ahora, escépticos ante la idea de adentrarse en el conocimiento de un enésimo producto Microsoft. Bien, es cierto que MTS es un elemento de servidor avanzado, pero ningún desarrollador de proyectos Web en entorno servidor Microsoft va a poder seguir ignorando el servidor transaccional.

 

 

Por qué Transaction Server

En la nueva versión de IIS, Microsoft ha apostado claramente por la integración del servidor Web con el servidor de transacciones MTS. El objetivo de Microsoft es ofrecer una plataforma completa y eficiente para la creación de aplicaciones Web que hagan uso de componentes ActiveX en el servidor. Cuando decimos componentes ActiveX hacemos referencia a componentes reutilizables que siguen el modelo de objetos COM y a los que nuestras aplicaciones Web van a solicitar servicios.

 

Componentes

Qué es un componente

El desarrollo de aplicaciones se está orientando a un escenario, Internet, en el que los programas creados deben estar preparados para poder ejecutarse en máquinas desconocidas, con requerimientos y sistemas operativos también desconocidos. En este ámbito, la industria del desarrollo se está volcando en una nueva idea: el ComponentWare. Este término se refiere a la estrategia de desarrollo que pretende, antes de construir programas grandes de manera completa, dedicarse a la programación de pequeños (o no tanto) componentes que puedan colaborar entre sí, para obtener una funcionalidad mucho mayor que la que cada uno de ellos proporciona por separado.

El objetivo de esta tecnología es conseguir que los citados componentes puedan utilizarse sin preocuparse, ni conocer, el lenguaje o plataforma de desarrollo utilizada para construir cada uno de ellos. Es decir, podemos pensar en estos componentes como piezas prefabricadas que van a permitirnos, una vez ensambladas, construir el edificio de nuestra aplicación. Basta con que cada componente cumpla unas ciertas características desde el punto de vista externo y que facilite un cierto medio para que sus funcionalidades puedan ser utilizadas.

Estarás pensando que estos componentes milagrosos que estoy presentando poco a poco empiezan a parecerse peligrosamente a cualquiera de los elementos utilizados hasta el momento para la reutilización del código: sean clases, librerías estáticas o librerías dinámicas. El componentware propone una reutilización bastante más ambiciosa: cada unidad, es decir, cada componente, debe constituirse como un programa compilado, que posee la funcionalidad de generar y responder a eventos que le permitan interaccionar con el usuario, con la máquina, o con otros componentes.

 

Componentes y objetos

Component Object Model(COM) es una tecnología que se ha venido imponiendo en los últimos años como una de las apuestas tecnológicas más agresivas (y a menudo denostadas) de Microsoft. La idea que subyace a COM es dotar a los desarrolladores de un ámbito en y mediante el que crear componentes que puedan comunicarse con otros componentes o aplicaciones, proporcionándoles servicios, incluso aunque los citados componentes y aplicaciones hayan sido desarrollados por otros programadores, o en lenguajes diferentes. COM es un estándar que define un modo de interactuación de aplicaciones diseñado para conseguir la interactuación entre aplicación mediante conjuntos de funciones denominados interfaces. No podemos desarrollar aplicaciones programando en COM sino utilizar un lenguaje de programación para desarrollar aplicaciones con componentes que se comuniquen e interactúen siguiendo el estándar que COM define.

COM es un estándar binario, es decir, los objetos desarrollados siguiendo sus especificaciones deben cumplir sus características una vez creados. Por ello, los objetos COM o los objetos OLE, si así se prefiere, pueden ser escritos en cualquier lenguaje de programación. Es más, COM tiene la vocación de facilitar la comunicación entre objetos escritos en diferentes lenguajes, en espacios de proceso diferentes e incluso diseñados para plataformas distintas.

 

Conceptos fundamentales de COM

Los siguientes son conceptos fundamentales en el ámbito de COM

  • Componente COM: Una porción de código, ya sea un ejecutable o una librería dinámica, que contiene el código binario de los objetos COM
  • Objeto COM: Un ejemplar o instancia de un componente COM, que tiene sus propios elementos de datos, definidos en la clase del componente
  • Interfaces: Las interfaces proporcionan un mecanismo para que los objetos puedan exponerse a sí mismos, permitiendo que los otros componentes de una aplicación puedan hacer uso de los servicios que el objeto ofrece. Se plasman en un conjunto de prototipos de método, con una cierta finalidad, y que deberán ser implementados posteriormente para obtener la citada funcionalidad.

mts1.gif

 

Transacciones

Transaction Server. Vamos con la primera parte del nombre. La definición más o menos clásica de transacción es "una serie de acciones que constituyen una operación atómica", esto es, que se realizan por completo o no se realizan en absoluto. Las transacciones resultan extremadamente importantes en entornos en los que existe riesgo de concurrencia entre diversos operadores que puedan estar intentando modificar el estado de ciertos datos simultáneamente, con el consiguiente peligro de inconsistencia. Sirva como ejemplo la situación en la que varias aplicaciones cliente intenten operar simultáneamente sobre un mismo conjunto de registros en un gestor de base de datos relacionales cliente/servidor.

Las transacciones deben cumplir un conjunto de propiedades que son conocidas como ACID, siglas inglesas de Atomicidad, Completitud, Aislamiento y Durabilidad. La Atomicidad hace referencia a que todas las operaciones de la transacción deban llevarse a cabo o descartarse simultáneamente mientras que el aislamiento entre transacciones está soportado por la necesidad de que las transacciones no puedan verse afectadas por las modificaciones aún no comprometidas de transacciones en curso y la durabilidad.

 

Pára qué sirve MTS

MTS nace con el objetivo de facilitar el desarrollo y gestión de componentes que llevan a cabo trabajos en el ámbito de transacciones. Pongámonos, en el lugar de un desarrollador que crea una aplicación que utiliza componentes COM para realizar tareas coordinadas. Supongamos que estas tareas deben realizarse todas concertadamente para conseguir que el resultado sea el esperado. Parece evidente que de la propia naturaleza de las citadas operaciones va a resultar poco menos que imprescindible definir transacciones que involucren a los citados componentes. ?Quién coordina esas transacciones, cuando los elementos de software que realizan las tareas (los componentes) son módulos independientes que posiblemente desconozcan por completo la existencia de los otros? La respuesta es que es necesario un servidor que cuide de estos aspectos: Transaction Server.

Toda aplicación que utilice este modelo cliente servidor puede definirse como una entidad que tiene un cierto estado (por ejemplo los stocks y la facturación en un negocio) y que permite su modificación mediante una serie de operaciones definidas por la propia aplicación. Los componentes en un servidor suelen llevar a cabo todas estas operaciones que permiten que los citados datos sean coherentes, accesibles al tiempo que facilitan su actualización y consulta.

Estas reglas de coherencia, las reglas de negocio, requieren de una cierta lógica de aplicación que es el trabajo de los programadores diseñar. Este es el cuerpo del código de los componentes. El trabajo de MTS es descargar a los programadores de todos los aspectos tangenciales que no sean estrictamente la implementación de las reglas de negocio y, especialmente, de los posibles conflictos que unos componentes puedan provocar sobre los otros. Cuando un componente está controlado durante su ejecución por MTS todas sus operaciones son susceptibles de enmarcarse en transacciones. MTS se ocupa de resolver todos los problemas de concurrencia, en memoria, en lógica de programa y en gestión de recursos.

El modelo de operaciones en MTS

Bien, hemos dicho que nuestro objetivo es crear una aplicación que se ubique en un servidor (o varios colaborando entre ellos) y que sea accedida por clientes que van a consultar, actualizar o gestionar los datos que conforman el estado de la citada aplicación. Las operaciones sobre el estado de la aplicación, la lógica de negocio, van a implementarse con componentes COM cuyos aspectos transaccionales van a ser controlados y gestionados por Microsoft Transaction Server.

Los componentes MTS

Cada uno de los componentes de la aplicación, que en principio es un componente COM cualquiera, se convierte en un componente MTS. Un componente MTS es un componente COM constituido como una DLL, y que se ejecuta en el entorno de Transaction Server. Para ello los componentes deben cumplir un conjunto de características avanzadas que no vamos a exponer aquí.

Del mismo modo que una instancia de un componente COM es un objeto COM, toda instancia de un componente MTS es un objeto MTS. Cuando creamos un ejemplar de un componente MTS el servidor crea automáticamente un objeto asociado de contexto (Context Object) que contiene información sobre quién originó la creación del objeto y cómo se está ejecutando, principalmente desde el punto de vista de las transacciones en las que el objeto está inmerso.

mts2.gif

Cada uno de estos objetos será accedido por los clientes, y él a su vez realizará solicitudes a otros componentes o a los recursos (esencialmente datos) que desee manejar.

 

Los dispensadores y gestores de recursos

Los recursos de los que hablamos son básicamente los datos, que se ubican en uno o varios servidores, pongamos como ejemplo, y para centrar ideas, SQL Server. Cada uno de estos datos, que conforman el estado de nuestra aplicación, es controlado por un gestor de recursos (Resource Manager). SQL Server es un ejemplo de gestor de recursos que puede atender a transacciones distribuidas.

Los gestores de recursos son consultados y tomados bajo su ámbito de acción por MTS para asegurar que las transacciones que operan sobre los citados datos son llevadas a cabo correctamente.

Los componentes MTS no acceden directamente a los gestores de recursos, sino que lo hacen a través de un módulo intermedio (el dispensador de recursos Resource Dispenser) que permite la independencia de la llamada a los gestores de recursos, con lo que diferentes componentes podrán llamar a diferentes gestores de recursos sin variar significativamente la tarea de programación. Este enredo quedará claro inmediatamente si ponemos un ejemplo de cada uno de estos elementos. Si SQL Server es un gestor de recursos, ODBC es un dispensador para él.

mts3.gif (11090 bytes)

 

El explorador de Transaction Server

Microsoft Transaction Server nos proporciona una herramienta, el explorador de Transaction Server, que nos permite ver qué es lo que está sucediendo con un conjunto de componentes MTS que están ejecutándose en el ámbito de Microsoft Transaction Server.

mts4.gif

Los componentes en el explorador se agrupan en paquetes (packages). Un paquete es un conjunto de componentes COM que se agrupan para su gestión conjunta con Transaction Server. Normalmente se agrupan aquellos componentes que llevan a cabo tareas relacionadas en la aplicación. Los componentes de un paquete se ejecutan en el ámbito de un mismo proceso en el servidor.

El explorador presenta los componentes precisamente estructurados en paquetes según una cierta estructura jerárquica Los paquetes están asociados a una máquina y contienen un conjunto de componentes. Cada uno de estos componentes tiene asociado interfaces y métodos. Cada una de estas entidades corresponde a un nodo del árbol jerárquico del explorador.

 

Creación e instalación de paquetes

Pueden crearse paquetes con componentes ya existentes no instalados en ningún paquete (es decir, DLL que pueden o no estar registradas en la máquina), o incorporar al paquete componentes incluidos en otros. Cuando incorporamos un componente COM no registrado a un paquete, el proceso se encarga de registrar la DLL en el registro del sistema. Cada componente puede estar en múltiples paquetes.

El explorador nos proporciona un asistente para la creación de paquetes vacíos. En este modo de creación se nos solicita simplemente el nombre que deseamos dar al paquete y la cuenta de Windows NT bajo la que los componentes en el paquete se ejecutarán.

Una vez creado el paquete podemos crear componentes nuevos e incluirlos en él. Crear nuevos componentes no significa aquí desarrollar los componentes desde el punto de vista binario, sino más bien "darlos de alta" en el paquete, con lo que les damos un lugar y un ámbito en el que ejecutarse en el marco del run time environment del servidor de transacciones. También contamos con un asistente para la creación de nuevos componentes, en el que se nos presenta la opción de crear un nuevo componente a partir de un fichero DLL aún no registrado u obtener una lista de los componentes registrados que cumplen la condición indispensable de ser in-process, para que podamos elegir cual es el que deseamos añadir al paquete.

Monitorizando y gestionando los componentes de un paquete

Cuando disponemos de un conjunto de componentes agrupados en un paquete ya estamos preparados para monitorizar el comportamiento de los citados componentes. EL proceso de instalación de Microsoft Transaction Server crea un conjunto de paquetes predefinidos que pueden servirnos de aprendizaje. Uno de ellos, "Sample Bank", simula una aplicación bancaria que hace uso de componentes controlados por MTS para llevar a cabo las operaciones de la lógica de negocio, tales como hacer ingresos, reintegros, etc.

La instalación también genera una aplicación cliente que va a permitirnos comprobar cómo las llamadas a los componentes van a desatar la ejecución de transacciones.

El explorador nos presenta dos vistas de las propiedades de cada componentes de cada paquete: la visión de estado y de propiedad. La primera de ellas (State View), presenta el estado (incluyendo si están recibiendo peticiones de servicio o no) de las máquinas, los paquetes o los componentes. La vista de propiedades (Property View) muestra las propiedades de cada uno de los elementos, incluyendo el identificador de clase de cada componente.

Otro aspecto monitorizable son las transacciones. El explorador dispone de dos nodos especialmente diseñados para presentar esta información. En la figura, mostramos las estadísticas de las transacciones a las que se ha visto sometido el componente Bank en una sesión de prueba.

mts5.gif

 

Conclusión

En este artículo se pretende mostrar la necesidad y conveniencia de utilizar Microsoft Transaction Server presentando la naturaleza básica de este servidor. Transaction Server no es un elemento abordable en una pocas líneas.