3 / * * 2+ = ' 8+ 9
+39/9:+3'9
*/9:8/(;±*59
4 MIDDLEWARE.................................................................................................................................3
1 INTRODUÇÃO
Quando se pensa na construção de sistemas distribuídos o hardware tem grande importância, mas na
verdade o software é largamente o fator determinante da aparência do sistema. Sistemas distribuídos
são muito parecidos aos sistemas operacionais tradicionais. Primeiro, eles atuam como gerenciadores
de recurso para o hardware, permitindo que múltiplos usuários e aplicações compartilhem recursos
como CPUs, memórias, periféricos, a rede, e dados de todos os tipos. Segundo, e provavelmente o mais
importante, é que sistemas distribuídos tentam esconder a natureza complexa e heterogênea do
hardware provendo uma máquina virtual na qual aplicações podem ser facilmente executadas.
Para entender a natureza dos sistemas distribuídos, nós iremos, portanto primeiro dar uma olhada nos
sistemas operacionais em relação aos sistemas distribuídos. Sistemas operacionais para computadores
distribuídos podem ser divididos em duas categorias: sistemas fortemente acoplados e sistemas
fracamente acoplados. Nos sistemas fortemente acoplados, o sistema operacional essencialmente tenta
manter uma única visão global dos recursos que ele gerencia. Já os sistemas fracamente acoplados
podem ser pensados como uma coleção de computadores cada qual rodando o seu próprio sistema
operacional. Porém, estes sistemas operacionais trabalhando junto para tornar seus próprios serviços e
recursos disponíveis para os outros sistemas.
O sistema operacional de rede (SOR) fracamente acoplado é usado para sistemas heterogêneos de
multicomputadores. Embora o gerenciamento do hardware seja um importante assunto para o SOR, a
distinção entre sistemas operacionais tradicionais vem do fato dos serviços locais serem tornados
disponíveis a clientes remotos. Para um SOR se tornar verdadeiramente um sistema distribuído
melhorias aos seus serviços são necessários de maneira que suporte para transparência de distribuição
seja provido. Estas melhorias levam ao que nós conhecemos de middleware, o que é o coração dos
sistemas distribuídos modernos.
A maioria desses middlewares é baseado em algum modelo, ou paradigma, para realizar a distribuição e
comunicação. Basicamente são quatro esses paradigmas: Transaction Processing Monitors (TPs), que
controlam aplicações de transações e executam computações de negócios e atualizações em bancos de
dados; Remote Procedure Calls (RPCs), que permitem que clientes de uma aplicação chamem funções
para acessar servidores em sistemas remotos; Message-Oriented Middlewares (MOMs), que residem em
ambas partes de uma arquitetura cliente/servidor e suportam chamadas assíncronas entre as aplicações;
e os Object Request Brokers (ORBs), que permitem que objetos que compõem uma aplicação sejam
distribuídos em redes heterogêneas.
Dentre os padrões de ORBs quatro se destacam sendo os mais difundidos, que são CORBA, DCOM e
Java/RMI. Cada um desses padrões, ou plataformas, apresenta suas características particulares que os
tornam mais apropriados a certas aplicações para construção de sistemas de objetos distribuídos.
4 MIDDLEWARE
Para que um SOR se torne verdadeiramente um sistema distribuído melhorias aos seus serviços são
necessários de maneira que seja provido suporte para transparência de distribuição. A questão que vem
a mente nesse ponto é como isso pode ser feito. A solução é achada em adicionar uma camada de
software que é usada junto aos SOR para não só ocultar a heterogeneidade da coleção de plataformas,
mas também melhorar a distribuição de transparência. Muitos sistemas distribuídos modernos são
construídos por meio de uma camada adicional, que é chamada de middleware.
Essa camada adicional de software é colocada entre as aplicações e o sistema operacional de rede,
oferecendo um alto nível de abstração. Assim, tais aplicações não fazem uso direto da interface de
programação oferecida pelos SORs, como o caso do uso dos sockets, que permitem que processos em
diferentes máquinas troquem mensagens, ou do acesso ao sistema de arquivo local, o que aumenta a
transparência de distribuição. Na Figura 4 é mostrado o posicionamento do middleware.
Cada sistema local que forma parte do sistema operacional de rede provê gerenciamento local de
recursos além de ser um simples meio de comunicação para conectar os computadores. Em outras
palavras, middleware em si mesmo não gerencia individualmente o nó; isto é deixado para ser feito
inteiramente pelo sistema operacional local.
Um importante objetivo é esconder a heterogeneidade das plataformas das aplicações. Portanto, muitos
sistemas de middleware oferecem uma mais-ou-menos completa coleção de serviços e desencorajam a
utilização de qualquer outra interface que não seja a desses serviços. Em outras palavras, chamar
serviços de um SOR sem passar pela camada de middleware é freqüentemente visto com desagrado.
É interessante notar que o middleware não foi inventado como um exercício acadêmico na tentativa de
se atingir a transparência de distribuição. Após a introdução e difusão dos SOR, muitas organizações se
acharam com muitas aplicações de rede que não podiam ser facilmente integradas em um único
sistema. Neste ponto, produtores começaram a fazer em um alto nível, serviços independentes de
aplicação que poderiam ser usadas por várias aplicações distintas. Exemplos típicos incluem suporte
para transações distribuídas e recursos para comunicação avançada.
Dando uma definição mais precisa, podemos dizer que “um middleware é um software de conectividade
que consiste de um conjunto de serviços disponíveis que permite que múltiplos processos, executando
em uma ou mais máquinas, interajam através de uma rede”. Um middleware é essencialmente uma
migração das aplicações mainframe para aplicações cliente/servidor que provê comunicação através de
1
plataformas heterogêneas. Colocado de forma mais técnica, o middleware é uma API (Application
1
Uma API é uma lista de regras para a escrita de funções ou chamadas de sub-rotinas que acessam funções em uma biblioteca.
Programas que usam estas regras ou funções nas suas chamadas de API podem se comunicar com qualquer outro programa que
usa essa API, sem se importar com outras particularidades. APIs trabalham com um grande espectro de diálogos de aplicações
(isto é, esquemas de comunicação entre programas) para facilitar a troca de informação. Dessa forma, APIs também podem ser
consideradas como um tipo de middleware que provê o compartilhamento de dados através de diferentes plataformas; isto é uma
importante melhoria quando no desenvolvimento ou atualização de sistemas distribuídos.
Middlewares em Sistemas Distribuídos 4
Programming Interface) de fácil utilização que se localiza entre a aplicação e os recursos que a aplicação
necessita. A Figura 5 mostra o uso do middleware.
Tão ruim quanto essa situação está à situação na qual a definição de interfaces não completas leva a
uma situação na qual duas implementações diferentes podem nunca interoperar, apesar do fato elas
implementarem exatamente a mesma lista de interfaces, mas diferentes protocolos de comunicação. Por
exemplo, se duas implementações diferentes de protocolos confiam em protocolos incompatíveis de
comunicação como disponíveis nos sistemas operacionais de rede, existe uma pequena esperança de
que a interoperabilidade seja facilmente alcançada. O que nós precisamos é que protocolos de
middleware e as interfaces para o middleware sejam as mesmas, como mostrado na Figura 6.
A tecnologia TP monitor é um software que é considerado um middleware. Ela pode prover serviços de
aplicações para milhares de clientes em um ambiente cliente/servidor distribuído. Tal tecnologia realiza
isso através da multiplexação de pedidos de transações de clientes (por tipo) sobre um número
controlado de rotinas de processo que suportam serviços particulares. Estes eventos são mostrados na
Figura 7.
Client
Client
Client Processing
Routines
Transaction Services
Client Processing
Monitor
Client
Client
A tecnologia TP monitor mapeia vários pedidos de clientes através de rotinas de serviços de aplicação
para melhorar a performance do sistema. Tal tecnologia (locada com um servidor) pode também realizar
as transições lógicas para o cliente. Isto reduz o número de atualizações requeridas por estas
plataformas de clientes. Além disso, essa tecnologia inclui várias características de gerenciamento, tais
como reinicio de processos falhos, balanceamento dinâmico de carga e obriga a consistência de dados
distribuídos. Essa tecnologia é escalável pela adição de mais servidores.
Tal tecnologia é independente de arquitetura de banco de dados. Ela suporta modelagem flexível e
robusta de negócios e encoraja procedimentos modulares e reusáveis. O projeto dessa tecnologia
Middlewares em Sistemas Distribuídos 6
permite que APIs suportem componentes tais como bibliotecas heterogêneas de clientes, banco de
dados e gerenciadores de recursos, e sistemas de aplicação do mesmo nível (peer-level).
Dentro de sistemas cliente/servidor distribuídos, cada cliente que é suportado adiciona overhead aos
recursos do sistema (tal como memória). Tal overhead pode ser reduzido através da adoção da
tecnologia TP monitor para multiplexar vários clientes sobre uma lista menor de rotinas de serviços de
aplicação. Essa tecnologia provê um sistema altamente ativo que inclui serviços para entrega de pedidos
de processamento, terminal e formas gerenciamento, gerenciamento de dados, acesso à rede,
autorização e segurança.
Tal tecnologia suporta um número de modelos de comunicação programa-a-programa, tal como store-
and-foward, assíncrono, RPC, e conversational. Isto melhora as interações entre componentes de
aplicação. A tecnologia TP monitor provê a capacidade para construir aplicações complexas de negócios
a partir de componentes funcionais modulares e bem definidos. Como esta tecnologia é bem conhecida
e bem definida ela pode reduzir os risco de programação associada a custo.
O MOM, como mostrado na Figura 8, é um software que reside em ambas as partes da arquitetura
cliente/servidor e tipicamente suporta chamadas assíncronas entre o cliente e os servidores de
aplicações. Filas de mensagens provêem armazenamento temporário quando o programa destino está
ocupado ou não conectado. O MOM reduz o envolvimento dos desenvolvedores de aplicações com a
complexidade com a natureza mestre-escravo do mecanismo de cliente/servidor.
A T T A
P R R P
L MOM A A MOM L
I (com fila de N R R N (com fila de I
mensagem) S E E S mensagem) C
C
A P D D P A
Ç O E E O Ç
à R R Ã
O T T O
E E
O MOM aumenta a flexibilidade de uma arquitetura por habilitar que aplicações troquem mensagens com
outros programas sem ter de conhecer em qual plataforma ou processador a outra aplicação reside
dentro da rede. As mensagens acima mencionadas podem conter dados formatados, pedidos de ações,
ou ambos. Normalmente, o sistema MOM provê uma fila de mensagem entre os processos
interoperantes, assim se o processo destino estiver ocupado, a mensagem é armazenada
temporariamente até que ela possa ser processada. O MOM é tipicamente assíncrono e peer-to-peer,
mas muitas implementações suportam também passagem síncrona de mensagens.
Middlewares em Sistemas Distribuídos 7
A tecnologia ORB permite a comunicação de objetos entre diferentes máquinas, diferentes softwares e
diferentes fornecedores. Um ORB provê um diretório de serviços e auxilia a estabelecer conexões entre
clientes e estes serviços. Esta definição pode ser ilustrada na Figura 9.
Um ORB deve suportar muitas funções com o objetivo de operar consistente e efetivamente, e, além
disso, muitas dessas funções são transparentes ao usuário do ORB. É de responsabilidade do ORB
fornecer a transparência de localidade, ou seja, fazer com que o objeto requisitado pareça local para o
cliente, enquanto que na realidade ele se localiza em um processo ou máquina diferentes. Portanto, um
ORB fornece um barramento para a comunicação entre objetos em diferentes sistemas. Este é o
primeiro passo para alcançar a interoperabilidade em sistemas de objetos distribuídos.
O próximo passo é a comunicação de objetos entre plataformas. Um ORB permite aos objetos esconder
seus detalhes de implementação dos clientes. Isto inclui linguagens de programação, sistemas
operacionais, hardware, e localização de objetos. Cada um desses itens deve ser pensado como uma
transparência, e diferentes tecnologias de ORBs podem suportar diferentes transparências, fazendo com
que os benefícios da orientação a objetos entre plataformas e canais de comunicação sejam estendidos.
Um ORB pode ser implementado de diversas maneiras. As funções de um ORB podem, por exemplo,
estar compiladas dentro dos programas clientes; podem ser processos separados ou daemons; ou
podem ainda ser partes de um kernel de um sistema operacional.
Um ORB age como um intermediário para as requisições que os clientes enviam para os servidores. É
responsável por todos os mecanismos requeridos para encontrar a implementação de um objeto,
preparar a implementação para receber a requisição, e comunicar os dados na requisição.
Ele também utiliza as informações da requisição para determinar a melhor implementação que satisfaça
o pedido. Estas informações podem incluir: a operação que o cliente está requisitando, o tipo de objeto
que será executado, e qualquer informação adicional armazenada no contexto do objeto sendo
requisitado.
Os principais padrões para computação distribuída de hoje e que utilizam a tecnologia ORB são:
4.2.4 Plataformas
Esta seção tem por objetivo descrever as três principais plataformas distribuídas. Mas é importante
ressaltar que, antes do surgimento delas, outras plataformas distribuídas já eram utilizadas de forma
expressiva e serviram de base para as especificações das plataformas atuais. Entre elas encontram-se:
DCE, e ODP.
DCE, ou Distributed Computing Environment, é um ambiente distribuído integrado que foi desenvolvido e
gerenciado pelo grupo OSF (Open Systems Foundation). O ambiente DCE é um conjunto de serviços de
sistema integrados que fornece um ambiente distribuído interoperável e flexível com o objetivo principal
de resolver problemas de interoperabilidade entre sistemas e em ambientes de rede heterogêneos. A
principal característica do DCE é que seu sistema de comunicação é baseado no modelo RPC.
4.2.4.1 DCOM
DCOM, ou Distributed Component Object Model, é a resposta da Microsoft para a tecnologia CORBA de
middleware. Ela começou como uma tecnologia de estruturação de documentos chamada de Object
2
Linking and Embedding (OLE) , presente na maioria das aplicações Windows, e que mais tarde foi
transformada em uma tecnologia mais genérica e orientada a objetos chamada de Component Object
Model, ou COM. COM está longe de ser um middleware, pois não define um protocolo de
interoperabilidade, embora possua uma linguagem genérica de definição de interfaces. Dessa forma,
COM pode ser usada para definir interfaces comuns entre componentes de software, mas com a
restrição de que ela só pode vincular os componentes que residem na mesma máquina. Com o objetivo
de criar um produto middleware, em 1996, a Microsoft estendeu e aperfeiçoou COM resultando na
tecnologia DCOM. A idéia inicial era fornecer uma tecnologia para plataformas Windows e não-Windows,
mas apenas algumas implementações não-Windows apareceram. Em meados de 1990, a Microsoft criou
alguns produtos para fornecer serviços de middleware para a plataforma DCOM. Entre eles o Microsoft
Message Queue Server (MSMQ) para comunicação assíncrona, e o Microsoft Transaction Server (MTS),
um monitor de transações. Em 1997, a Microsoft novamente anunciou um novo modelo de componentes
conhecido como COM+. O modelo de componentes COM+ estende o modelo COM adicionando diversas
melhorias, entre elas o conceito de programação baseada em atributos, ou attribute-based programming.
Em meados do ano de 2000 foi anunciada uma nova estratégia para o desenvolvimento de sistemas
distribuídos, conhecida como Distributed interNetwork Architecture (DNA) que utiliza o modelo de
componentes COM+ e que está incorporada ao sistema operacional Windows 2000. Atualmente, a
Microsoft está migrando sua arquitetura DNA para incluir o framework .NET, uma nova especificação
para o desenvolvimento de aplicações distribuídas para Internet que possui fortes fundamentos em XML
3
e SOAP .
Numa visão bastante simples, pode-se encarar DCOM como a especificação de um ORB específico para
a plataforma Windows. Tal como CORBA, o padrão DCOM separa a interface de um objeto de sua
implementação e requer que todas as interfaces sejam declaradas utilizando uma IDL, que neste caso
denomina-se MIDL (Microsoft Interface Definition Language), que especifica os requisitos mínimos dos
objetos para que estes possam se comunicar através do barramento DCOM. A MIDL é baseada no
padrão DCE (Distributed Computing Environment) e, portanto, não é compatível com CORBA.
2
Uma maneira de criar documentos contendo objetos de outros programas. Por exemplo, você pode colocar um gráfico excel e um
slide Powerpoint dentro de um documento do Word.
3
SOAP, ou Simple Object Access Protocol, é um protocolo padronizado pelo W3C para comunicação distribuída na Web baseado
em XML.
Middlewares em Sistemas Distribuídos 9
Da mesma forma que CORBA, DCOM também provê invocação de métodos através de interfaces
estáticas e dinâmicas. O Type Library é uma versão do Repositório de Interfaces de CORBA. Os clientes
consultam o Type Library para localizar quais interfaces um objeto suporta e quais parâmetros são
necessários para invocar um método em particular. DCOM também oferece um registro e alguns
serviços de localização que são similares aos de CORBA.
Em DCOM, uma interface é simplesmente um conjunto de funções, métodos ou funções membros, que
serve como um contrato entre a aplicação cliente e o servidor de objetos, através do qual podem trocar
mensagens. Na interface, os métodos são definidos independentemente de sua implementação (e de
linguagem), numa API binária, acessível por qualquer linguagem de programação que suporte a
especificação. Para acessar uma interface, um cliente DCOM utiliza um ponteiro para uma tabela de
ponteiros conhecida como tabela virtual (vtable). As funções membros apontadas pela vtable são as
implementações dos métodos do objeto. Cada objeto DCOM possui uma ou mais vtables que definem o
contrato entre a implementação do objeto e seus clientes. A figura a seguir, mostra a tabela virtual e
seus ponteiros para as funções:
No modelo, cada interface é identificada por um identificador único conhecido como IID (Interface
IDentifier), um número de 128 bits gerado pela API DCOM.
Um objeto DCOM – também conhecido como objeto ActiveX - é definido como um componente que
suporta uma ou mais interfaces definidas por sua classe. Uma interface DCOM refere-se a um grupo pré-
definido de funções relacionadas. Uma classe DCOM implementa sempre pelo menos uma interface e é
identificada por um número único de 128 bits, chamado de Class ID ou CLSID. Um objeto DCOM é uma
instância de uma classe. Um objeto implementará todas as funções definidas na interface que sua classe
suporta.
Os clientes sempre se comunicam com os objetos DCOM através de ponteiros para as interfaces; nunca
através de acesso direto. Os objetos DCOM não suportam identificadores únicos de objetos (ou
referências persistentes de objetos no modelo CORBA). No modelo, todas as classes devem
implementar, obrigatoriamente, a interface pré-definida IUnknown, que é responsável pela criação e
remoção dos objetos, além de permitir acesso aos demais membros da interface específica da classe.
Mas ao contrário do modelo CORBA, o modelo DCOM não suporta o conceito de identificador de objetos
(object ID). Os clientes obtêm um ponteiro para uma interface e não um ponteiro para um objeto com
estado. Um cliente DCOM não pode acessar exatamente o mesmo objeto posteriormente. Os clientes
possuem apenas ponteiros transientes para as interfaces. Em outras palavras, objetos DCOM não
mantêm o estado entre conexões ou acessos. E este pode se tornar um grande problema em ambientes
onde existem falhas de comunicação, como por exemplo a Internet.
Para contornar os problemas com persistência de objetos no ambiente distribuído, DCOM criou os
monikers. Um moniker DCOM é um objeto que age como um nome alternativo (alias) persistente para
outro objeto. Os monikers podem prover nomes alternativos, ou aliases, para sistemas de arquivos
distribuídos, consultas em bancos de dados, células de uma planilha eletrônica, computadores remotos,
entre outros. Um moniker, no entanto, é uma solução paliativa adotada para a falta de suporte de DCOM
para persistência de objetos.
Middlewares em Sistemas Distribuídos 10
Se o componente projetado se destinar a ser utilizado como um servidor (local ou remoto) de objetos,
deverá implementar também a interface IClassFactory, que fornece mecanismos para instanciar objetos.
No modelo, ao contrário de implementações como Java, por exemplo, que executam automática e
periodicamente o ″recolhimento de lixo″ (garbage collection) do sistema, DCOM obriga o servidor de
objetos a cooperar com o sistema, devolvendo a ele a memória não utilizada, tão logo o último cliente
deixe de referenciar um objeto. O padrão especifica servidores de objetos de três tipos diferentes:
Dessa forma, a especificação DCOM garante comunicação transparente entre a aplicação cliente e o
servidor de objetos, local ou remoto. Do ponto de vista do cliente, todo o acesso aos membros da classe
é feito através de ponteiros para os elementos da interface. Por definição, um ponteiro deve ser in-
process. Assim, a comunicação com um servidor in-process local é feita diretamente. Para a
comunicação out-of-process, local ou remota, o barramento DCOM gera um objeto de comunicação,
conhecido como proxy object, que recebe a chamada e converte numa chamada RPC apropriada,
enviando-a ao processo externo, local ou remoto. O elemento DCOM responsável pela localização dos
servidores e pela comunicação RPC entre clientes e servidores é chamado de Service Control Manager
(SCM) – ou simplesmente "Scum".
Na outra ponta da mensagem, o barramento DCOM gera um stub object, que recebe a chamada do
proxy object e a converte numa chamada local à interface solicitada. Assim, tudo se passa
transparentemente no barramento DCOM. Os clientes e os servidores sempre se comunicam utilizando
algum código local ou in-process. (Figura 11). Os objetos proxy e o mecanismo de stubs são muito
similares ao modo como CORBA implementa a transparência local/remota utilizando stubs estáticos no
cliente e interfaces de skeletons no servidor.
O modelo DCOM também provê facilidades de invocações dinâmicas e obtenção de metadados. Essas
facilidades são conhecidas como automatizações (automations). O Type Library de DCOM permite que
clientes descubram dinamicamente métodos e propriedades de um servidor DCOM. Para que um
servidor disponibilize metadados na Type Library, ele precisa ter suas interfaces descritas através da
ODL (Object Definition Language). DCOM ODL é um subconjunto da Microsoft IDL e é utilizada para se
definir metadados de uma classe. Um servidor automatizado é um objeto DCOM que implementa uma
interface específica chamada de IDispatch. Essa interface fornece mecanismos de late-binding através
dos quais um objeto expõe suas funções – incluindo seus métodos e propriedades. Essas funções de
Middlewares em Sistemas Distribuídos 11
late-binding são conhecidas como dispatch interfaces, ou simplesmente dispinterfaces (em CORBA são
equivalentes às dynamic skeleton interfaces). As interfaces, métodos, e propriedades dos servidores são
armazenadas em type libraries que agem como repositórios de execução.
Do mesmo modo que CORBA, DCOM não tem sido encontrado em larga escala. Pelo fato de ser uma
arquitetura dependente da plataforma Windows, poucas aplicações com caráter mais sério, utilizando
DCOM, estão sendo implementadas. Como descrito anteriormente, os objetos DCOM são ponteiros para
interfaces sem estado persistente e os monikers são uma solução alternativa. Além disso, DCOM requer
serviços adicionais como o Microsoft Transaction Server (MTS) para permitir alta escalabilidade no
servidor. Com o lançamento de novas tecnologias, como o framework .NET e tecnologias já existentes
como DNA e COM+, espera-se uma maior portabilidade em relação a DCOM e uma robustez
comparável a da arquitetura CORBA.
Os clientes RMI invocam os métodos remotos utilizando stubs específicos para cada serviço. Esses
stubs são gerados pelo compilador de stubs rmic e estendem as funções da classe RemoteStub. No lado
do servidor, as classes RMI precisam estender a classe UnicastRemoteObject. O modelo RMI envia e
recebe as chamadas dos clientes para os objetos remotos do servidor utilizando skeletons gerados pelo
compilador rmic. O compilador rmic implementa uma classe skeleton para casa interface definida no
servidor. A Figura 12 a seguir ilustra esse mecanismo:
Diferentemente de uma chamada local em Java, uma invocação RMI utiliza a passagem de parâmetros
por cópia (pass-by-value) ao invés da passagem por referência (pass-by-reference), exceto com relação
a objetos remotos que são passados por referência ao invés de se copiar a implementação remota. O
modelo RMI fornece classes e interfaces que possibilitam a localização, o carregamento, e a execução
confiável de objetos remotos. Atualmente, o modelo RMI, provê um serviço bastante primitivo e não-
persistente, de nomeação. Ele também fornece um carregador de classes (class loader) que carrega
4
Componentes de programas escritos na linguagem Java.
Middlewares em Sistemas Distribuídos 12
stubs do servidor automaticamente. Um stub RMI funciona como um proxy no cliente para o objeto
remoto. Além disso, o modelo também provê mecanismos extras de segurança para garantir que estes
proxies tenham o comportamento esperado.
Em um sistema distribuído, um coletor de lixo deve ser apto a automaticamente remover objetos remotos
que não são mais referenciados por nenhum cliente. O modelo RMI utiliza um mecanismo de coleta de
lixo por contagem de referências que mantém um histórico de todas as referências externas ativas
dentro de uma máquina virtual. Neste contexto, uma referência externa ativa é apenas uma conexão
TCP/IP entre um cliente e um servidor. Cada vez que o cliente obtém uma referência, o contador de
referências daquele objeto é incrementado de 1; e é decrementado de 1 quando o cliente pára de
referenciar aquele objeto, ou seja, quando a conexão é finalizada. Quando o contador de referência
alcança zero, o RMI coloca o objeto servidor na lista de referências fracas (weak reference list). O coletor
de lixo pode então remover o objeto.
No modelo RMI, uma referência para um objeto remoto é "emprestada" (leased) por um período de
tempo para o cliente. O período de empréstimo se inicia quando a chamada remota é recebida. É de
responsabilidade do cliente renovar o período de empréstimo através de chamadas adicionais no
servidor antes que o prazo se expire.
Pelo fato do modelo RMI poder resolver dinamicamente invocações de métodos entre Máquinas Virtuais,
ele fornece um ambiente totalmente distribuído e orientado a objetos. Também pelo fato do modelo RMI
ser nativo da linguagem Java, os desenvolvedores trabalham dentro de um único modelo de objetos (o
modelo Java), ao invés de trabalhar com múltiplos modelos de objetos (Java, CORBA IDL, e outros). Isto
remove bastante a complexidade de programação. Diferente de modelos de objetos com linguagens
neutras, o RMI não requer mapeamento para linguagens de definição de interfaces, como a IDL.
Antes da invocação de um método em um objeto remoto, o cliente deve primeiro obter uma referência
para este objeto. Geralmente, o cliente obtém essa referência como retorno da invocação de um método.
O modelo RMI também fornece um serviço simples de nomeação, conhecido como RMI registry, ou
simplesmente registro RMI, que permite a obtenção das referências dos objetos através de nomes. O
RMI define o serviço de nomeação utilizando duas classes e uma interface. Tipicamente, o cliente
interage com a classe Naming para obter os serviços do registro do RMI. O registro RMI é definido pela
interface Registry. É importante notar que este registro é um objeto servidor remoto. Isto significa que se
pode acessar seus métodos através da rede utilizando invocações remotas. A classe LocateRegistry
auxilia na localização do registro RMI. A JavaSoft fornece uma implementação da interface Registry.
Esta implementação não-persistente apenas suporta nomes simples. Nesta implementação, os clientes
utilizam apenas os métodos lookup e invoke. Toda essa comunicação entre objetos é realizada através
do protocolo Java Remote Method Protocol (JRMP).
A Figura 13 ilustra uma chamada típica de um método remoto utilizando a arquitetura RMI. A figura
mostra o servidor registrando seus objetos no registro RMI e o cliente obtendo a referência do objeto
requisitado através do mesmo. Com a referência retornada, o cliente pode então realizar a invocação do
método remoto. Os dois servidores Web da figura funcionam como repositórios de classes e stubs. A
idéia principal é que os clientes, e mesmo os servidores, possam carregar dinamicamente classes e
stubs necessários para a aplicação e que não se encontram localmente. Esse procedimento é conhecido
como dynamic stub-loading. O registro RMI armazena, juntamente com a referência de cada objeto, a
URL que permite a localização das classes e stubs. É importante lembrar que sem os stubs apropriados,
um cliente não pode fazer uma invocação remota em um objeto. A localização das classes e stubs é
definida pela propriedade java.rmi.server.codebase informada para a Máquina Virtual na inicialização do
programa. Além de servidores Web, servidores FTP também podem ser utilizados como repositórios das
classes e dos stubs.
Middlewares em Sistemas Distribuídos 13
Atualmente, há um esforço grande em especificar um modelo padrão entre RMI e CORBA. Duas
especificações estão em desenvolvimento, mas já podem ser encontradas para utilização:
a) RMI-over-IIOP: é uma versão do modelo RMI que funciona no topo do protocolo IIOP. O
protocolo IIOP provê alguns benefícios, entre eles: interoperabilidade com outros objetos escritos
em outras linguagens, e um padrão aberto para objetos distribuídos;
b) RMI/IDL: Através desse padrão é possível especificar interfaces CORBA utilizando a semântica
do RMI ao invés da IDL de CORBA. O compilador gera automaticamente CORBA IDL, stubs e
5
skeletons. Enterprise JavaBeans utiliza este subconjunto RMI/IDL.
Resumidamente, pode-se concluir que o modelo RMI oferece alguns dos elementos críticos de um
sistema de objetos distribuídos em Java pelo fato do RMI ser nativo da linguagem Java. Possui
facilidades de comunicação de objetos análogas ao protocolo IIOP de CORBA, e seu sistema de
serialização de objetos fornece uma maneira prática de se transferir ou requisitar uma instância de um
processo remoto para outro.
Além disso, também possui uma forte influência do modelo CORBA e pode ser definido como um novo
tipo de ORB construído no topo do modelo de objetos de Java. E como um ORB, RMI introduz cinco
inovações-chave:
O modelo RMI pode ser bem vantajoso para programadores Java. Ele torna o ORB transparente e
naturalmente estende o alcance das funcionalidades da linguagem Java. Com a utilização de RMI, não é
necessário utilizar a IDL de CORBA ou qualquer tipo de conversão Java/CORBA. Entretanto, utilizando
apenas RMI, perde-se o poder da infraestrutura do modelo CORBA. Para compensar esta deficiência,
pode-se utilizar RMI-over-IIOP, garantindo a união entre os dois modelos: RMI e CORBA.
5
A especificação EJB define um modelo de componentes-servidores para JavaBeans. Um EJB é um JavaBean especializado e
não-visual que é executado no servidor.
6
O nome "Java 2" é uma definição para as implementações JDK 1.2 e superiores, incluindo J2SE, J2EE e J2ME.
Middlewares em Sistemas Distribuídos 14
CORBA começou a ser desenvolvido em 1989, quando um grupo de empresas reuniu-se em uma
organização, denominada OMG, com a finalidade de especificar uma arquitetura global e normas para
permitir o trabalho conjunto de componentes de diferentes origens. A idéia era aproveitar os benefícios
do paradigma da orientação a objeto, principalmente a noção de encapsulamento dos dados e da
implementação de um objeto através da sua interface.
A arquitetura definida para CORBA permite que objetos troquem mensagens de forma transparente
através de um “barramento de software”. Para isso, os objetos que interagem através desse barramento
têm a suas interfaces descritas em uma linguagem padrão, chamada de Interface Definition Language
(IDL), e implementação escrita em qualquer linguagem que possua o mapeamento para CORBA.
Para a integração entre aplicações, o OMG definiu uma arquitetura denominada OMA. Enquanto CORBA
permite a interoperabilidade entre objetos, a OMA agrupa um conjunto de objetos CORBA em serviços e
facilidades, que oferecem suporte para o desenvolvimento de aplicações que usam objetos CORBA.
Maiores detalhes e o modelo de referência para essa arquitetura são apresentados nas próximas
seções.
Através e um série de RFPs, a OMG está povoando o OMA com especificações detalhadas para cada
componente e categoria de interface no Modelo de Referência. Essas especificações incluem: CORBA,
CORBAservices, e CORBAfacilities.
- Objetos de Serviços (Object Services) são interfaces para serviços gerais que são
provavelmente usados em qualquer programa baseado em objetos distribuídos;
- Recursos Comuns (Common Facilities) são interfaces para facilidades horizontais orientadas
para usuário finais, aplicáveis a maioria dos domínios de aplicação;
- Interfaces de Domínio (Domain Interfaces) são interfaces de aplicações de um domínio
específico, e;
- Interfaces de Aplicação (Application Interfaces) são interfaces não padronizadas para
aplicações específicas.
Objetos de Serviços
Interfaces de serviços
gerais
Figura 14 – Modelo de referência OMA
Nas próximas subseções as partes do modelo de referência serão apresentadas em maiores detalhes.
A OMG IDL provê um caminho padronizado para definir as interfaces dos objetos CORBA. A definição
IDL é o contrato entre o implementador de um objeto e o cliente. A IDL é uma linguagem declarativa
fortemente tipada que é independente de linguagem de programação. Mapeamentos de linguagem
habilitam objetos a serem implementados e enviar requisições na linguagem de programação do
desenvolvedor em uma forma que é natural para tal linguagem.
A figura acima mostra os dois lados de um ORB CORBA: o lado do cliente e o lado do servidor. A função
de cada componente é descrita abaixo:
Middlewares em Sistemas Distribuídos 16
a) Client IDL Stubs: provêem interfaces estáticas para os acessos aos objetos remotos. Estes stubs
pré-compilados definem como o cliente invoca serviços nos servidores. Do ponto de vista do
cliente, os stubs agem como um proxy para o objeto remoto do servidor. Os serviços são
definidos utilizando-se a IDL, e os stubs para os clientes e servidores são gerados pelo
compilador IDL. Um cliente deve possuir um stub para cada interface que ele utiliza no servidor.
Os stubs também incluem código para realizar o marshalling (codificação e decodificação dos
métodos e seus parâmetros em mensagens com formatos padrões). Ele também inclui código
para acesso a outras linguagens de alto nível como C, C++;
b) Dynamic Invocation Interface (DII): permite descobrir métodos de servidores remotos em tempo
de execução. CORBA define APIs para a localização de meta-dados que definem as interfaces
dos servidores, para a geração dos parâmetros, para invocação remota, e para o retorno dos
dados;
c) Interface Repository APIs (IR): permitem obter e modificar a descrição de todas as interfaces
dos componentes registrados, os métodos que eles suportam, e os parâmetros que eles utilizam.
O Repositório de Interfaces é uma base de dados distribuída que contém as definições das
interfaces no formato da IDL;
d) ORB Interface: consiste de algumas APIs para serviços locais que podem ser úteis para a
aplicação. Por exemplo, CORBA fornece serviços para converter uma referência de um objeto
em um string, e vice-versa.
O suporte para invocações estáticas e dinâmicas oferece um alto poder de programação para a
computação distribuída de CORBA. As invocações estáticas são mais fáceis de programar e possuem
uma performance melhor. As invocações dinâmicas fornecem uma alta flexibilidade, embora sejam mais
difíceis na programação; são muito úteis para se descobrir serviços em tempo de execução.
Os servidores não podem distinguir a diferença entre as invocações estáticas ou dinâmicas pois ambas
possuem a mesma semântica. Em ambos os casos, o ORB localiza o adaptador do objeto remoto,
transmite os parâmetros, e transfere o controle para a implementação do objeto através dos stubs do
servidor (skeletons). O lado do servidor:
a) Server IDL Stubs (Static Skeletons): fornecem interfaces estáticas para cada serviço exportado
pelo servidor. Esses stubs também são criados pelo compilador IDL.
b) Dynamic Skeleton Interface (DSI): foi introduzida com a versão CORBA 2.0 e fornece
mecanismos de ligação (binding) em tempo de execução para servidores que necessitam
manipular requisições de objetos que não possuem stubs nem skeletons compilados. O DSI do
servidor é equivalente ao DII do cliente.
c) Object Adapter: localiza-se no topo dos serviços de comunicação do ORB e recebe as
requisições dos serviços antes dos objetos do servidor. Ele provê um ambiente de execução
para a instanciação dos objetos dos servidores, para a passagem das requisições, e para a
atribuição de identificadores únicos para cada objeto (object references);
d) Implementation Repository (IR): fornece um repositório de informações sobre as classes que um
objeto suporta, os objetos que estão instanciados, e os identificadores únicos de cada um. É
utilizado também para armazenar informações adicionais associadas com as implementações de
cada ORB, entre elas: segurança, dados administrativos, entre outras;
e) ORB Interface: consiste de algumas APIs para serviços locais que são idênticas àquelas
fornecidas para o cliente.
Mas o grande trunfo de CORBA é a compatibilidade entre ORBs de fabricantes distintos, o que é
chamado de Arquitetura Inter-ORB. Essa arquitetura é composta por três protocolos básicos:
Uma especificação de uma Facilidade Comum ou de um Objeto de Serviço tipicamente inclui a lista de
definições de interface – expressas em OMG IDL – que objetos devem suportar de maneira a prover,
usar ou participar na facilidade ou serviço. Como em todas as especificações adotadas pela OMG,
facilidades e serviços são definidos em termos de interfaces e suas semânticas, e não em uma particular
implementação.
Os Objetos de Serviços são os blocos básicos para a construção de aplicações com objetos distribuídos.
Esses objetos podem ser combinados de várias maneiras diferentes e postos em diferentes aplicações.
7
Eles podem ser usados para construir facilidades de alto nível e frameworks de objetos que podem
interoperar através de múltiplos ambientes de plataformas.
Os Objetos de Serviços OMG adotados são coletivamente chamados de CORBAservices, abaixo é dada
uma descrição resumida de cada serviço.
• O Serviço de Nomeação (Naming Service) provê capacidade para ligar um nome a um objeto.
Resolver um nome é determinar o objeto associado a um determinado nome. Através do uso de
um modelo bem genérico, as implementações do Serviço de Nomeação podem ser aplicações
específicas ou serem baseadas em uma variedade de sistemas de nomeação atualmente
disponíveis.
• O Serviço de Evento (Event Service) provê capacidades básicas que podem ser configuradas
flexível e poderosamente. Esse serviço suporta eventos assíncronos (desacoplamento do
produtor e consumidor), e através de implementações apropriadas de canais de eventos oferece
uma entrega confiável dos eventos. Os modelos de entrega push e pull são suportados; isto é,
consumidores podem requisitar eventos ou serem notificados de eventos ocorridos.
• O Serviço de Ciclo de Vida (Life Cycle Service) define operações para cópia, movimentação, e
remoção de objetos de grafos de objetos relacionados, enquanto o Serviço de Relacionamento
(Relationship Service) permite que grafos de objetos relacionados sejam percorridos sem a
ativação dos objetos.
• O Serviço de Persistência de Objeto (Persistent Object Service – POS) provê uma lista de
interfaces comuns para retenção e gerenciamento do estado de persistência dos objetos. O
objeto em última instância tem a responsabilidade de gerenciar seu estado, mas pode usar ou
delegar para O Serviço de Persistência de Objeto o verdadeiro trabalho. A maior característica
do Serviço de Persistência de Objeto (e da arquitetura OMG) é seu openness. Isto significa que
pode haver uma variedade de diferentes clientes e implementações do Serviço de Persistência
de Objeto trabalhando juntos.
7
Frameworks de Objetos são coleções de objetos que incorporam um projeto abstrato para a solução de problemas relacionados
(categorizados dentro de um Domínio de Aplicação, Facilidade Comum e Objeto de Serviço).
Middlewares em Sistemas Distribuídos 18
• O Serviço de Consulta (Query Service) permite que usuários e objetos invoquem consultas em
coleções de outros objetos. As consultas são declarações com predicados e incluem habilidade
para especificar valores de atributos; para invocar operações arbitrárias; e para invocar outros
Objetos de Serviços.
• O Serviço de Tempo (Time Service) habilita o usuário a obter o tempo atual junto com uma
estimativa de erro associada a ele. Ele averigua a ordem na qual os eventos ocorrem e computa
o intervalo entre dois eventos. Ele é formado por duas interfaces: TimeService, que gerencia o
Tempo Universal dos Objetos (Univeral Time Objetos – UTOs) e o Intervalo de Tempo dos
Objetos (Time Interval Objects – TIOs), e; TimeEventService, que contém o Serviço de
Temporização de Eventos que gerencia o Manipulador de Objetos de Temporização de Eventos
• O Serviço de Coleção (Collections Service) provê um caminho uniforme para criar e manipular
as coleções mais comuns genericamente. Coleções são grupos de objetos que, como um grupo,
suportam algumas operações e exibem comportamentos específicos que estão relacionados
com a natureza da coleção, em vez de estarem relacionados ao tipo de objeto que eles contém.
Exemplos de coleções são listas, filas, pilhas, e árvores binárias.
4.2.4.4 Conclusões
Com os três modelos de computação distribuída, descritos nas seções anteriores, pode-se discutir
algumas características comuns entre os modelos. A Tabela 1 mostra alguns dos itens comuns e
essenciais para a composição e o desenvolvimento de aplicações em um ambiente distribuído.
Nomes baseados em URLs Sim (não volátil) Sim (via URL Sim (volátil)
monikers)
Entre as características mencionadas na tabela acima, algumas merecem especial destaque e são
explicadas a seguir.
8
a) Localização Dinâmica: apenas CORBA e DCOM possuem suporte para introspecção de
objetos. Ambos os ORBs permitem a descoberta dinâmica de interfaces de objetos. CORBA
também suporta Repositórios de Interfaces inter-ORBs. DCOM suporta apenas repositórios
locais para as Type Libraries.
b) Invocações Dinâmicas: apenas CORBA e DCOM suportam invocações dinâmicas. Esse
processo, conhecido também como late-binding, permite a construção de chamadas de métodos
em tempo de execução.
c) Referências Persistentes de Objetos: somente CORBA e RMI possuem objetos persistentes que
possuem referências persistentes. DCOM possui objetos transientes que se pode associar com
um contexto através dos monikers.
d) Nomes baseados em URLs: esta característica pode ser bastante útil em intranets e na Internet.
RMI e CORBA suportam esquemas de nomes baseados em URL que permitem associar um
objeto com uma URL. DCOM também suporta esta característica via monikers.
8
Introspecção é o processo de uma classe inspecionar outra classe para determinar quais propriedades, eventos e métodos esta
suporta.
Middlewares em Sistemas Distribuídos 21
REFERÊNCIAS BIBLIOGRÁFICAS
MIDDLEWARE
http://www.sei.cmu.edu/str/descriptions/middleware.html
[Bernstein 96] Bernstein, Philip A. "Middleware: A Model for Distributed Services." Communications of
the ACM 39, 2 (February 1996): 86-97.
[Client 95] "Middleware Can Mask the Complexity of your Distributed Environment." Client/Server
Economics Letter 2, 6 (June 1995): 1-5.
[Eckerson 95] Eckerson, Wayne W. "Three Tier Client/Server Architecture: Achieving Scalability,
Performance, and Efficiency in Client Server Applications." Open Information Systems 10,
1 (January 1995): 3(20).
[Schreiber 95] Schreiber, Richard. "Middleware Demystified." Datamation 41, 6 (April 1, 1995): 41-45.
[Dickman 95] Dickman, A. "Two-Tier Versus Three-Tier Apps." Informationweek 553 (November 13,
1995): 74-80.
[Hudson 94] Hudson, D. & Johnson, J. Client-Server Goes Business Critical. Dennis, MA: The Standish
Group International, 1994.
[Schussel 96] Schussel, George. Client/Server Past, Present, and Future [online]. Available WWW
<URL: http://www.dciexpo.com/geos/> (1995).
[TP 96] TP Lite vs. TP Heavy [online]. Available WWW
<URL: http://www.byte.com/art/9504/sec11/art4.htm> (1996).
MESSAGE-ORIENTED MIDDLEWARE
http://www.sei.cmu.edu/str/descriptions/momt.html
[Rao 95] Rao, B.R. "Making the Most of Middleware." Data Communications International 24, 12
(September 1995): 89-96.
[Steinke 95] Steinke, Steve. "Middleware Meets the Network." LAN: The Network Solutions Magazine 10,
13 (December 1995): 56.
[Abowd 96] Abowd, Gregory, et al. "Architectural Analysis of ORBs." Object Magazine 6, 1 (March
1996): 44-51.
[Brown 96] Brown, A. & Wallnau, K. "A Framework for Evaluating Software Technology." IEEE Software
13, 5 (September 1996): 39-49.
[Cobb 95] Cobb, Edward E. "TP Monitors and ORBs: A Superior Client/Server Alternative." Object
Magazine 4, 9 (February 1995): 57-61.
[CORBA 96] The Common Object Request Broker: Architecture and Specification, Version 2.0.
Framingham, MA: Object Management Group, 1996. Also available [online] WWW
<URL: http://www.omg.org> (1996).
[Reddy 95] Reddy, Madhu. "ORBs and ODBMSs: Two Complementary Ways to Distribute Objects."
Object Magazine 5, 3 (June 1995): 24-30.
[RMI 97] Remote Method Invocation [online]. Avaliable WWW
<URL: http://java.sun.com/products/jdk/1.1/docs/guide/rmi> (1997).
[Steinke 95] Steinke, Steve. "Middleware Meets the Network." LAN: The Network Solutions Magazine
10, 13 (December 1995): 56.
Middlewares em Sistemas Distribuídos 22
[Tkach 94] Tkach, Daniel & Puttick, Richard. Object Technology in Application Development. Redwood
City, CA: Benjamin/Cummings Publishing Company, 1994.
[Wade 94] Wade, Andrew E. "Distributed Client-Server Databases." Object Magazine 4, 1 (April 1994):
47-52.
[Wallnau 96] Wallnau, Kurt & Wallace, Evan. "A Situated Evaluation of the Object Management Group's
(OMG) Object Management Architecture (OMA)," 168-178. Proceedings of the OOPSLA'96.
San Jose, CA, October 6-10, 1996. New York, NY: ACM, 1996. Presentation available
[online] FTP.
<URL: ftp://ftp.sei.cmu.edu/pub/corba/OOPSLA/present> (1996).
[Baker 94] Baker, S. "CORBA Implementation Issues." IEEE Colloquium on Distributed Object
Management Digest 1994 7 (January 1994): 24-25.
[Brando 96] Brando, T. "Comparing CORBA & DCE." Object Magazine 6, 1 (March 1996): 52-7.
[Brown 96] Brown, A. & Wallnau, K. "A Framework for Evaluating Software Technology." IEEE
Software 13, 5 (September 1996): 39-49.
[CORBA 96] The Common Object Request Broker: Architecture and Specification, Version 2.0.
Framingham, MA: Object Management Group, 1996. Also available [online] WWW
<URL: http://www.omg.org> (1996).
[CORBANet 96] Distributed Software Technology Center Home Page [online]. Available WWW
Middlewares em Sistemas Distribuídos 23