Prévia do material em texto
CAPÍTULO 2 Estilos Arquiteturais Objetivos • Entender o que é um estilo arquitetural. • Apresenta r um conjunto de estilos arquiteturais que vem sendo usado em projetos de sistemas. • Identificar tl vantagens e desvantagens de cada estilo apresen- tado, discutindo os compromissos assumidos quando um estilo é selecion,1clo em detrimento de outro. 2.1 Introdução No capítulo anterior, verificamos que a arquitetura de software de um sist1· ma possui papel impmt.111te na obtenção de metas de qualidade e manutc:111h1 !idade. A arquitetura dl' -.oftware de um sistema é composta de subsistt111.1-. 011 componentes (respon sáveis pelo comportamento do sistema), de conectores (interligando os componentes) e de padrões de conexão (possibilitando vári - os tipos de interação e compartilhamento de informações entre esses compo - nentes): (~ pertinente aind.1 ,ll lT'>n'nt.1r que um sistema bem organizado exibe uma es- t111tura l<'>gict e mud11l.11 lw111 l<>lll<> provê suporte à ocultação de informações. T,11., p1111l ip10-, l ,11,ll lt 111.1111 11111 prnjcto de software. Note que, ao utilizar uma nt 1111111 .1 111rnl1 il,11, .1-. de 1 1-.1 w-. d1 prnJeto deveriam ser tomadas isoladamente 11111,1-, d,1., 111111 1 , , 1 111d11 111111111111, 11 o impacto de mudanças de uma decisão so- lm· 0111 rn(s), p111 11111 d11 111 d 1111 "" d1 q11.1I idade de sistema que tem suma impor t.11111,1 '>ohre 1\111 l""i' 111 ili 1111\\ 111• t ,1 111od11laridade (Parnas, 1972). Nesse caso, a efetividade da organização de um sistema dependerá do(s) critério(s) usa- do(s) para decompor o sistema em componentes. Observamos que à medida que os sistemas de software começaram a tor- nar-se maiores e mais complexos, mais atenção foi dedicada à organização de tais sistemas. Ao longo de todo esse período no qual temos feito uso de sistemas de software, uma técnica fundamental utilizada pelos engenheiros (projetistas) tem sido a abstração. Ela nos permite entender questões complexas de projeto e re- solver problemas, fazendo com que nos concentremos em um nível mais genéri- co sem nos ater a detalhes irrelevantes à organização de sistemas. A abstração ain- da nos possibilita trabalhar num problema, usando conceitos e termos que sejam familiares no domínio do problema antes de transformá-los em alguma estrutura de mais baixo nível. Desde seu uso inicial em sistemas (há aproximadamente quatro décadas), o software tem cada vez mais se constituído em um elemento pervasivo de nosso cotidiano. Ao longo de todo esse período da história do software, diversas arqui- teturas foram usadas, muitas vezes informalmente, por engenheiros e projetistas de software sem que houvesse qualquer preocupação em cohlpreendê-las me- lhor e tratá-las de forma sistemática a fim de identificar suas principais caracterís- ticas, objetivando catalogá-las. O objetivo de organizar e expressar o conheci- mento do projeto de software de maneira útil é uma necessidade natural do enge- nheiro (projetista) de software. Uma forma de codificar tal conhecimento é dis- por de um vocabulário do conjunto de conceitos (terminologia, propriedades, restrições), estruturas (componentes, conectores) e padrões de uso existentes. Ao caracterizar as arquiteturas de software que são utilizadas nos sistemas, identificando seus componentes, mecanismos de interação e propriedades, po- demos classificá-las. Como resultado, isso nos possibilita o reuso desse conheci- mento. No decorrer da década de 1990, houve uma crescente preocupação em compreender a organização dos sistemas de software, culminando com o surgi- mento da área de arquitetura de software. Assim, começou-se a identificar famí- lias de arquiteturas, isto é, classes de arquiteturas que possuíam aspectos e com- ponentes peculiares a elas bem como formas de combiná-los. Isso caracteriza um l'"I do arquitetural. llm estilo arquitetural permite que um profissional (engenheiro, projetista e 111 .11 q11iteto de software ) determine a classe a qual pertence a organização de um .,,.,1l·111,1. C:.1racterísticas dos componentes (subsistemas) e conectores do sistema, 111polog1,1 d.1 ,1rquitetura, restrições semânticas e mecanismos de interação entre m componentes ,1judam a identificar o estilo que retrata a arquitetura de softwa- 1 l' do sistema. Além disso, o estilo arquitetural pode ser utilizado como ponto de partida em 11111 projeto, desde que tenhamos em mãos o conjunto de características desejadas p.11.1 o sistema a ser desenvolvido. Nesse caso, procura-se identificar qual estilo ,11 quitetural provê suporte às características desejadas do sistema e, portanto, es- L1ríamos reutilizando conhecimento e arquitetura de software (já catalogada) 11..,,,da em algum projeto anterior da mesma ou outra instituição. O reuso de com-111 (1 ponentes (ou -..ubsistemas) integrados numa estrutura, caracterizando uma arqui- tetura, surge rnmo benefício da classificação de arquiteturas de software. Retor- naremos a esse tópico ainda neste capítulo e também no Capítulo 6. Cada estilo arquitetural oferece suporte a um conjunto de requisitos não- funcionais e atributos de projeto que permitem distinguir uma arquitetura de ou- tra. Por exemple>, considere o estilo arquitetural de camadas, o qual permite a de- finição de vários níveis e implica um aumento da flexibilidade do sistema. Entre- tanto, essa característica ocorre em detrimento de outra, isto é, o desempenho do sistema. Este é reduzido numa arquitetura de camadas. Note que o estilo mais apropriado a um sistema dependerá de seus requisitos, envolvendo requisitos funcionais e não-funcionais. Uma discussão mais detalhada é apresentada no Ca- pítulo 3. A partir disso, pergunta-se qual a utilidade de termos estilos arquiteturais? É fácil perceber que possuir estilos arquiteturais bem definidos com suas caracte- rísticas especificadas nos permite fazer um menor esforço para entender o proje- to de sistema de outra pessoa e, portanto, reduz a quantidade de informações a serem assimiladas num novo projeto. Também há um interesse de compor um manual, a exemplo de outros que existem nas engenharias, a fim de que possamos consultá-lo e reutilizar conheci- mentos e arquiteturas de projeto anteriores. Isso é um sinal de amadurecimento de um novo campo. Afinal, por que reinventar a roda? A seguir, um conjunto de estilos arquiteturais é apresentado, procurando identificar seus componentes, mecanismos de interação e propriedades. Obvia- mente, não pretendemos ser completos quanto aos possíveis estilos existentes. Entretanto, esses estilos constituem aqueles mais proeminentes nos sistemas computacionais. Além disso, um conjunto de arquiteturas de software peculiares a alguns domínios específicos são apresentadas no Capítulo 6. 2.2 Pipes e Filtros O estilo arquitetural de pipes e filtros geralmente considera a existência de uma rede pela qual flui dados de uma extremidade (origem) à outra (destino). O fluxo de dados se dá através de pipes e os dados sofrem transformações quando proces- sados nos filtros. Um pipe provê uma forma unidirecional de fluxo de dados, uma vez que atua como um condutor para o fluxo de dados entre a fonte (extremidade de origem dos dados) até um destino (receptor de dados). O exemplo mais comumente co- nheddo do estilo pipes e filtros é utilizado no sistema operacional Unix. A maioria dos usuários do sistema operacional Unix sabe como canalizar asa- ída, resultante de um programa (progl), para a entrada de um outro programa (prog2). Isso poderia, facilmente, ser feito digitando-se a seguinte linha de co- mando: 12\ exemplol# progl I prog2 O exemplo anterior ilustra um encadeamento da saída de um programa (progl) para a entrada de outro programa (prog2). Note que se trata de um meca- nismo de comunicação (fluxo) de dados unidirecional. Um exemplo prático, ilus- trando o uso de pipes e filtros no sistema operacional Unix, é apresentado a seguir: exemplo2# who I sort A linha de comando anterior executao programa who (apenas uma vez) e en- caminha sua saída para o programa sort. O resultado do programa who é uma lis- ta dos usuários que encontram-se conectados naquele instante enquanto o pro- grama sort ordena essa lista de usuários em ordem alfabética (dos nomes de lo- gin). Isso é mostrado na Figura 2.1. Filtros =f mgcama wh,l=I ====,====::-~rograma '°'li=====: 1~~ ~~~ ~ ~ ~~ i pipe Figura 2.1 Exemplo de pipes e filtros. Os dois programas who e sort constituem dois componentes e são denomina- dm, de filtros, uma vez que realizam transformações no fluxo de entrada. Uma ou- 11.1 l°,1racterística interessante de um filtro é que ele começa a colocar a saída resul- 1.111tt· da transformação realizada no pipe antes que todos os dados de entrada se- j,1111 totalmente consumidos. Perceba ainda que a saída do segundo filtro (progra- 111.1 sort ) poderia ser conduzida por um outro pipe conectado a um terceiro filtro (tl11.,trado através de um retângulo com linhas tracejadas na Figura 2.1). Uma seqüência de pipes e filtros geralmente é chamada de tubulação de pro- ' ,·s.-.;i1111ento, onde os filtros incrementam, extraem ou transformam os dados rece- l11dos de alguma fonte de dados (que pode ser outro filtro) e os pipes conectam dn1~ filtros ou alguma fonte de dados e um filtro ou ainda um filtro a algum recep- 1111 dl' dados (isto é, a extremidade final de uma tubulação de processamento). E importante observar que o estilo de pipes e filtros constitui-se numa arqui- 11·1111,1 adequada para ser usada no projeto de um sistema que requer vários está- 1•,111.., de processamento, conforme vimos na Figura 2.1. Cada estágio de processa- 11 H'I ,to seria implementado, fazendo-se uso de um filtro, o qual recebe dados de ilg11111a fonte (podendo ser outro filtro), realiza alguma transformação sobre os d.ui os (extraindo ou acrescentando informações) e prod11z dados na saída, que ,,111 1..111alizados por meio de pipe ao próximo estágio. / 13 U t l·xemplo de uso do estilo arquitetural de pipes e filtros é encontra-m ouro · . . . do no modelo L l.íssico de compiladores (Garlan, 1993). Os primeiros compila- dores realizavam, basicamente, duas funçõer a análise da linguagem fonte e a síntese do código <le máquina (Aho, 1987). A medida que o processo .de d~sen- volvimento de compiladores foi sendo aprimorado, a função de anáhs~ foi de- composta em três funções: análise lé~i~a'. ~nálise sintática e anál~se. se~ântica. Por outro lado a função de síntese foi dividida em duas etapas: otimizaçao e ge- ração de códig~. Uma ilustração dessa arquitetura é mostrada na Figura 2.2. análise léxica análise sintática análise semântica otimização Figura 2.2 Decomposição de um compilador. geração de código A arquitetura de compilador apresentada anteriormente prevaleceu durante a década de 1970. Nesse tipo de arquitetura, cada etapa do processo de compila- ção é realizada separadamente. Os resultados parciais de cada fase são encami- nhados à etapa seguinte. Isso caracteriza o estilo arquitetural de pipes e filtros, no qual o compilado, e funcionalmente decomposto num conjunto de cinco com- ponentes que est .10 associados às cinco fases do processo de compilação. Cada componente é visl o como um filtro em que ele efetua uma transformação sobre os dados de entrad .1 resultando em dados de saída, os quais são canalizados atra- vés de pipes ao pr ox1mo componente. Com a evolw~·"' do hardware que ocorreu durante as décadas de 1970 e 1980, surgiu a neu·ss1dade de os compiladores oferecerem suporte a diferentes plataformas. Com 0111itante a esse fato, devemos ainda levar em conta tanto a complexidade qu.11110 o custo em desenvolver um compilador. Em razão disso, houve a necessidade de tornar o compilador portável a várias plataformas a fim dl' reduzir os custos de desenvolver diferentes produtos (isto é, compiladores pa1.1 plataformas distintas). Como resultado dessa necessidade, houve a inserção dl' um novo componente que resultou numa arquitetura que possuía uma etap;1 111termcdiária de geração de código entre suas principais fun ções de análise e s111tese. Isso é ilustrado na Figura 2.3. ------ 1 ..... Função de análise análise sintática Função de síntese análise semântica otimização geração de código geração intermediária de código Figura 2.l Evolução na arquitetura de um compilador. E~sa arquitetura oferecia suporte à portabilidade, um dos requisitos de um compilador. No entanto, com o avanço tecnológico, o compilador deixou de ser uma ferramenta isolada e então houve a necessidade de integrá-lo a outras ferra- mentas como, por exemplo, editor e depurador. Esse novo requisito acarretou num redesenho da arquitetura para compiladores similar à apresentada na Figu- ra 2.4. Nessa nova arquitetura, existem conexões entre as várias fases do proces- so de compilação, o que pode ser visto como fluxo de controle. análise léxica 1 1 1 Geração intermediária de código I I I ,,' :.&r--.....i.. ___ .z::_ __ --, , Tabela de símbolos de estrutura sintática / geração de código / / / Figura 2.4 Nova evolução na arquitetura de compiladores. Perceba que essa nova arquitetura é centrada num conjunto de recursos compar- 1 i I hados bem como permite que novas ferramentas sejam adicionadas à arquitetura. É importante observar que a arquitetura mostrada na Figura 2.4 lembra a arqui- t l' t ura mais simples de um sistema de quadro-negro (blackboard), o qual possui um ll'positório central de dados compartilhados. Essa arquitetura será discutida em de- t.ilhes na Seção 2.3. A semelhança aqui observada deve-se ao fato de a informação 111.1111pulada ser centralizada, sobre a qual diferentes componentes interagem. Apesar , ll·ss,1 L,tractcrística, o compilador possui uma ordem de execução predeterminada. A evolução da arquitetura de compiladores, utilizada como exemplo em nossa d I scussão, aconteceu como resultado da necessidade de atender o requisito de por- 1.1hi l idade. A integração de outras ferramentas também causou modificação na ar- qirrtetura. Isso, contudo, não significa ver o estilo arquitetural de pipes. e_ ~iltros l orno um estilo que possui deficiências. Cabe salientar que a manutem?i~i?ade 1111111 estilo arquitetural de pipes e filtros é, geralmente, mais flexível, possibilitan- do ,1 reorganização de filtros e pipes. Embora esse estilo arquitetural ofereça ~u- l l< >rt e à manutenibilidade em termos da facilidade de reorganização, podemos am- d.1 nos deparar com a desvantagem de mudanças freqüentes em um componente (liltro) impactar outros componentes. Assim, face à propag~çã~ ~e ~udanças de 11111 filtro a outro(s), o suporte~ manutenibilidade desse estilo e limitado. 115 2.3 Camadas O estilo arquitetural de camadas estrutura um sistema num conjunto de camadas, onde cada uma delas agrupa um conjunto de tarefas num determinado nível de abstração. Geralmente, numa arquitetura de camadas, uma camada no nível N oferece um conjunto de serviços à camada no nível superior (isto é, N + 1). Para tanto, a camada N utiliza suas funções bem como faz uso dos serviços disponíveis na camada inferior (N-1). Indubitavelmente, o melhor exemplo de uma arquitetura de camadas é o mo- delo de referência OSI (Reference Model for Open Systems Interconnection) da ISO (International Organization for Standization) (ISO, 1984; ISO, 1994; Tanen- baum, 1988). Nesse modelo, cada camada pode ser vista como um componente que pode ser implementado por software ou hardware. O modelo OSI da ISO pos- sui sete camadas e serve como arquitetura dos protocolos de redes de computado- res. A Figura 2.5 ilustra a arquitetura de camadas do modelo OSI da ISO. A arquitetura de rede é formada através de uma estrutura hierárquica, com- posta de camadas com interfaces entre elas. Associado a cada camada, há um pro- tocolo, como mostrado na Figura 2.6. Cada camada oferece um conjunto de ser- viços à camada superior. Assim, a camada N de um sistemaX se comunica com a camada N de um sistema Y, fazendo uso do protocolo do nível N associado àque- las camadas. Assim, projetar um protocolo para cada camada constitui-se na ma- neira mais eficiente para organizar uma rede. Note que é necessário definir as in- terfaces entre as diversas camadas. Considere a Figura 2.6 que ilustra como ocorre a comunicação entre dois sistemas. Note que associado a cada camada existe um protocolo. Assim, a ca- mada 7 do sistema X se comunica com a camada 7 do sistema Y. O protocolo consiste de um conjunto de regras e convenções que descrevem como sistemas podem se comunicar via rede. Em outras palavras, o protocolo define o for- mato, conteúdo e significado dos dados trocados entre as camadas associadas a ele. Embora a figura anterior ilustre a comunicação entre camadas, fazendo -se uso de protocolo específico, a transferência de dados não ocorre horizontalmen te. Na realidade, a movimentação dos dados se dá verticalmente com os dados descendo camada a camada até atingir a camada mais baixa (camada 1 ), ou seja, ,1 camada física, quando de fato há a comunicação com o outro sistema. Do outro lado (sistema Y), ocorre um processo inverso. Os dados sobem até atingir ,1 l,1111,1 da mais alta (camada 7), camada de aplicação. Uma pergunta que poderia surgir é: em que situação o estilo arquitetural de camadas seria mais adequado? A arquitetura de camadas não especifica qual deveria ser a granulosidade de componentes. Entretanto, componentes complexos, geralmente, exigirão de- composição adicional. De modo geral, o estilo arquitetural de camadas faz a decomposição do sistema em um conjunto de camadas, onde cada camada acres- 161 centa um nível de abstração sobre a camada inferior. camada 7 aplicação camada 6 camada 5 camada 4 camada 3 camada2 camada 1 física Figura 2.5 Arquitetura de protocolos de rede de computadores. sistema X sistema Y camada 7 aplicação ___ protocolo da camada 7 __ aplicação camada 6 ___ protocolo da camada 6 ___ camada 5 ___ protocolo da camada 5 ___ cnmada 4 __ _pJotocolo da camada 4 ___ ('. 111111(11\ 3 pr9to_ç9lo da camada ~ • rede r_ cnrnada 2 _ _protocolo da camada 2 ~- onl11co / t 1:11rnada 1 física ___ Qr:_otocolo da camada 1 . _ •I li ,Ir 1 1 1 acura 2.6 Comunicação entre dois sistemas numa arquitetura de camadas. O número de camadas dependerá da funcionalidade a ser oferecida pelo sis- tema. A funcion ,1lidade do sistema pode ser pensada como um conjunto de tare- fas que o sistema desempenhará. Assim, faz-se necessário definir critérios de abs- tração a serem observados quando desejarmos agrupar subtarefas para compo- rem uma camada. Exemplo de critérios a serem considerados são tipos de com- ponentes (específicos) da aplicação e interface com o sistema operacional. Além disso, poderíamos ter variações sobre o estilo de camadas simples onde uma camada N utiliza os serviços oferecidos pela camada N-1 a fim de realizar suas funções. Um exemplo de variação desse estilo seria permitir que a camada N tivesse acesso não apenas à camada N-1, mas também às camadas N-2, N-3 ou qualquer outra abaixo dela. Note, contudo, que essa variação na arquitetura de camadas pode compro- meter a manutenihilicfode de um sistema. Haver um maior grau de dependência entre as camadas implica que mais de uma camada necessitará ser modificada para atender à mudança de requisitos. Outra observ.1<,.10 pertinente ao estilo arquitetural de camadas é que, uma vez permitindo ullla definição de vários níveis de abstração (camadas), ele pro- porciona uma m:11or flexibilidade ao sistema. Todavia, isso tem um custo associ- ado. O desempenho da arquitetura de camadas fica comprometido face à neces- sidade de umas< 1111.:1 tação externa ao sistema precisar passar por várias camadas a fim de ser trat:id,1. Também, i111pkmentar um sistema ou protocolo de rede como um bloco mo- nolítico não com,! 11 ui uma solução apropriada. Isso requer buscar uma arquitetu- ra com menor 1111111ero de camadas que atenda ao requisito de desempenho, mas que ao mesmo tl'111po leve em conta a manutenibilidade. Obviamente que outros requisitos, dito, 11,10 funcionais, como confiabilidade, poderiam ser considera- dos também. Na realidade, o que determinará o número de camadas de um sistema não é simplesmente,, funcionalidade a ser provida por ele, mas também os requisitos não-funcionai ., desejados. Entretanto, determinar o número adequado de cama- das é tarefa mwto difícil. Pode-se ainda chegar a conclusão que o estilo arquitetu- ral de camad,1-. 11,10 constitui uma solução adequada e, assim, buscar-se-á um ou- tro estilo qm· s,11 is faça aos requisitos funcionais e não-funcionais. Conside1 l', por exemplo, a arquitetura OSI apresentada anteriormente (Fi- gura 2.5). Tr;1t,1 se de uma arquitetura que possui sete camadas. Contudo, devi- do ao surgimento de diferentes tecnologias tanto a fim de atender a uma gama de usuários que precisa de redes de alta velocidade numa área específica quanto de conectar equ1p.11nentos separados a milhares de quilômetros de distância, houve nova ênfase 11.1 .1rquitetura de redes. Assim, entra em cena a arquitetura Internet TCP/IP. A .11 q11it('l 11r:1 1 nternet baseia-se, principalmente, em um serviço de transpor- ,, 11111 111 11111 ,1 conexão, oferecido pelo Transmission Control Protocol (TCP) (Poste!, l 11H l ,1) L' em um serviço de rede não orientado à conexão oferecido pelo 181 Internet P,otornl (IP) (Postei, 19816). A arquitetura Internet é estruturada em quatro camadas construídas sobre uma quinta camada (intra-rede) que não faz parte do modelo (Comer, 1991). A Fi- gura 2. 7 ilustra a arquitetura Internet juntamente com a arquitetura OSI da ISO. Arquitetura Internet Arquitetura OSI aplicação aplicação apresentação sessão transporte transporte inter-rede rede interface de rede \, enlace intra-rede física Figura 2.7 Arquiteturas Internet e OS/. A arquitetura Internet constitui-se numa solução simples e funcional, per- 11111111do a interconexão de sistemas abertos 1. Com a arquitetura Internet, tor- 111111 se possível a interligação de redes de computadores com tecnologias dis- 1111 t.1s. A solução encontrada foi agrupar os níveis físico, de enlace e de rede da 11 q111tetura OSI na camada intra-rede da arquitetura Internet, havendo uma in- 11 1 l.1Cc entre essa camada e a camada inter-rede, conforme ilustra a Figura 2. 7. \ll'111 disso, as camadas de sessão e de transporte são implementadas, diferente- 1111 11te, para cada aplicação. Note que a arquitetura de camadas permite o reuso d, l ,1111adas. Por exemplo, TCP pode ser utilizado em diferentes aplicações, tais 11111111 telnet e ftp. 1 11111 ,l\tl'ma aberto é aquele preparado para se comunicar com qualquer outro sistema aberto, fa- ;1 11, I,, 11,0 <lc regras que definem o formato, conteúdo e significado dos dados trocados entre os siste- 1111 l .11, regras são comumente denominadas de protocolos. 119 2.4 Objetos O paradigma de projeto orientado a objetos acrescenta uma outra abstração ao projetodesoftware.Aidéiafundan11111dp 11111.1 d 1,1h111il 11•1111111111111 l 1,111 jetosécombinarnumaúnicaentid::uh t.11111111-,d.1d11.,q11111111 1 11111 rw q111•,1111 am sobre esses dados. Essa entidad r e dl'1111111i11.1d.1 0l 11,•to Para fazermos uma analogia, com.idnc 11111.1 c111p1Ts.1 )IH po-,.,111 d1v1 '"º" til · partamentos como, por exemplo, vcnd ,1s, rc<..11rws h11m,111m, l.011t.1hil1d.1dl' l ' marketing. A divisão em departamento s ajuda na organi za ·ao da i11:-.t1t111ç;10, onde cada departamento possui seu pessoal e tarefo as ·ociada s. Tamb ~m, cada departamento dispõe de seus próprios dados, ou seja, números da vendas, regis- tros de pessoal, inventário, folha de pagamento e outros, a depender do departa - mento. As pessoas de cada departamento atuam sobre os dados de seu departa - mento. Assim, ao dividir uma empr e a num conjunto de departam entos pod e- mos compreender melhor suasnecessidades e ter maior controle sobre as ativida- des da mesma. Similarmente, a abordagem orientada a objetos permite a organização de programas ao mesmo tempo em que ajuda a manter a integridade dos dados do sistema. Num projeto orientado a objetos, os projetistas de sistema podem en- capsular dados e comportamento em objetos os quais possuem interfaces com outros objetos. A interação entre objetos se dá através de canais de comunicação, abstraindo-se o mecanismo de passagem de mensagens. O estilo arquitetural de objetos tem como base o uso de um tipo de dados abs- trato - o objeto. Esse estilo possui várias propriedades importantes, dentre as quais destacamos: • Objetos são entidades independentes (um tipo de dado abstrato) que po- dem sofrer modificação uma vez que toda informação pertinente é manti- da no próprio objeto. • É possível fazer o mapeamento entre as entidades reais e os objetos que atuam no controle de um sistema, resultando numa melhor compreensão do sistema. • Os objetos fazem uso de um mecanismo de troca de mensagens para se co- municar em vez de utilizar variáveis compartilhadas. • Objetos podem ser reutilizados devido à sua independência. • Os objetos pod em estar distribuídos e executar seqüencialmente ou em paralelo, a depender das decisões tomadas no início do projeto. l)i ft·1 t·111 rnH·111 · da abordagem funcional, a abordagem orientada a objetos 11·111 11111H1 1 ,1.,1· .1 na ocultação de informações, que é uma estratégia de projeto 11111l1 111111111111 m·s são escondidas em componentes do projeto. O estilo arquitetu- ral de objete,., Vl' 11111 sistema de software como um conjunto de objetos comunican- 201 tes com est,11l0 .1ssociado a eles. Nesse caso, quando um objeto obj 1 necessita seco- municar com um objeto obJ2, ele precisa conhecer a identidade do ,>bjeto ao qu,11 enviará uma mensagem. Isso é ilustrado na Figura 2.8. Perceba q11l' 11m sistema ori entado a objetos pode ser vislumbrado como uma rede de objctm 111111 1 1 1il11 stado 1 obj1 1 ld <' obj2 estado 4 obj4 estado 3 obj3 Figura 2.8 Arquitetura de um projeto orientado a objetos. Dessa forma, numa arquitetura de objetos, teríamos um conjunto de objetos 1.0111 estados próprios (escondidos) e as operações associadas àqueles estados. Em t.tl arquitetura, os objetos (comunicantes) podem requisitar QU oferecer serviços ., outros objetos. Embora os conceitos do paradigma de projeto orientado a objetos possa ser 11 ti I izado para tratar alguns aspectos do projeto arquitetural, existem algumas di- 1 n enças entre as características e benefícios do projeto orientado a objetos e o projeto da arquitetura de software. O projeto da arquitetura de software visa a decompor o sistema em compo- 11e11tes e identificar as interações existentes entre esses componentes. Essa de- wmposição em componentes fornece uma visão global do sistema, permitindo que o engenheiro/arquiteto de software analise e raciocine sobre as propriedades 1· restrições do sistema. Assim, dado que os estilos arquiteturais podem descrever famílias de proje- lm, parece intuitivo vislumbrar o paradigma de projeto orientado a objetos 1 wno um estilo arquitetural no qual todos os componentes são objetos, e todas as 1 rn1cxões são associações ou agregações (segundo a terminologia da Técnica de f\.lodclagem de Objetos(OMT) (Rumbaugh, 1991). Entretanto, existem questões que são relevantes e, portanto, tratadas na abor- il.1gcm orientada a objetos, mas não que fogem ao escopo do projeto arquitetural. < 111110 exemplo, podemos citar as formas de modelar os requisitos bem como o 111, 11eto de estrutura de dados e algoritmos. Tais aspectos não precisariam ser trata- dt)', ou especificados numa descrição arquitetural, embora pudessem ser conside- 1 idos durante o projeto da arquitetura de software do sistema a ser desenvolvido. Assim, a arquitetura de software orientada a objetos constitui-se em mais um 1 t do arquitetural que pode ser utilizado pelo projetista /arquiteto de software.121 1 Sua opção dcpl'nderá dos requisitos funcionais e não-funcionais do sistema a ser desenvolvid1 ,. ~.d11·111m, l l)Jd1111111 d i,1 111 idn anteriormente, que para um objeto (obj 1) se l 01111111iL11 u1111 11111rn1111111hw111 (oh li), a identidade do segundo (obj2) precisa :-.l'I LllllltL·ud.1 pl'lo p1111\L'll'O (ollj 1) ,1 11111 de q11t· o/Jj I po-.-.., 111v1,11 111111-.,1g1111 .1 obj2. lsso se constitui numa desva11t,1gl'm p.1r.1 o rL·uso po1-. ll' tt·1110-. de .1llt·1.11 :1 especificação de classes quando houver mudanças. Esse probll ·111,1 C- t 1,,t.Hlo 1111 estilo arquitetural orientado a eventos (discutido na seção 2.5). Se considerarmos a manutenibilidade como requisito não -funcional prl' ponderante, é fundamental considerar que qualquer modificação de requisitos deveria afetar o menor número possível de objetos. Além disso, se o arquiteto de software tiver de levar em conta o desempenho do sistema, então os cenários de uso mais freqüentes deveriam ocorrer num menor número de objetos a fim de minimizar a comutação de contextos que viria a comprometer o desempe - nho do sistema. 2.5 Invocação Implícita Vimos na seção anterior que o estilo arquitetural com base em objetos requer que os objetos comunicantes conheçam a identidade do objeto com o qual deseja se comunicar, isto é, enviar uma mensagem. Essa dependência maior entre os obje- tos implica uma desvantagem em termos de manutenibilidade. Um estilo arquitetural com base em arquitetura de objetos faz uso de um me- canismo de invocação implícita para organizar o sistema. Em razão disso, ele é denominado de invocação implícita. Uma discussão inicial sobre este estilo foi feita por Garlan e Shaw (Garlan, 1993; Shaw,1996). Diferentemente do estilo arquitetural com base em objetos, no qual um com- ponente (objeto) invoca o outro diretamente (conhecendo a identidade do outro) por meio de passagem de mensagens, o estilo arquitetural de invocação implícita requer que os componentes interessados em um evento registrem-se a fim de rece- bê-lo. Assim, componentes podem tanto registrar interesse em receber eventos quanto de divulgar eventos. Tais eventos podem e, provavelmente, contêm dados. Nesse caso, o sistema dispõe de um mecanismo para tratamento de eventos, o qual encarrega-se de encaminhar os eventos aos componentes destinatários. Um exemplo recente fazendo uso do estilo arquitetural de invocação implíci- ta é JavaBeans (Sun, 1999; Morrison; 1997). Assim como outras tecnologias com base em componentes, JavaBeans possibilita o engenheiro/arquiteto de soft- ware fazer uso de componentes a fim de criar ou desenvolver novas aplicações com a funcionalidade desejada. Em tal situação, o arquiteto de software não tem necessidade de conhecer detalhes de implementação. Ele, simplesmente, precisa saber quais os serviços oferecidos por um componente, de modo a interagir e usar esse componente. Outros exemplos são discutidos por Garlan, Kaiser e Not- 221 kin (Garlan, 1992). Diante do que foi dito anteriormente, uma pergunta pode emanar: Qual a contribuição desse estilo arquitetural? Ou, colocando de outra forma: Em que situações o estilo arquitetural de invocação implícita seria apropriado? Sabemos que à medida que a quantidade de modificações e aperfeiçoamen- tos aumenta, também cresce a complexidade das interações entre os componen- tes do sistema. Isso faz com que projetistas/arquitetos de software busquem uma abordagem para tratar tais mudanças de modo que componentes do sistema pos- sam ser modificados independentemente, bem como aperfeiçoamentos possam ocorrer incrementalmente. Alguns sistemas se aproximam desses objetivos. Considere, por exemplo, o sistema de produção. Esse paradigma de imple- mentação para sistemas especialistas consiste de um conjunto de regras (conjun- to de pares padrão - ação) que são ativadas quando um ou m'àis padrões corres- pondem àqueles existentes na memória de trabalho (istoé, um banco de dados compartilhado). A Figura 2.9 ilustra a organização de tal sistema. . memória de 1,--- base de .... trabalho conhecimento ·~ ~, ,r ~ .. máquina de ~ unidade de inferência ..... controle ~ ~ .. .. Figura 2.9 Organização de um sistema de produção . l 1111 rnnjunto de regras compõem a base de conhecimento, em que cada regra q111'M'1tl.1 um formato: ,. 1,i1drão então ação. < > p.1dri'io define as condições sob as quais a ação aswL iada deveria sl'r apli 1d ,. <)., p.H.lrões têm como base elementos (objetos) q11c \l' 1t·11111.1111c111011.1 de 11 d, 1ll111 (.1 qual poderia ser vista como um banco de d.ido s ln111p.111ill1.1d11) 1111 q11,111do um conjunto de padrões é identificado, P" 111111 d, p111d11 111 1, I• 1111i11,1 a ordenação das regras aplicáveis bem como l:ontrola as ações cor- ' 11111Hkntcs. 123 Num sistema de produção, similar ao exemplificado anteriormente, pode-se em princípio incrementar o sistema através da adição de novas regras. O sistema de produção pode ser vislumbrado como um exemplo de estilo arquitetural de invo- cação implícita. Uma forma mais simplista de ver essa organizaçã, 11 111,1\, , d, , ,li jetos comunicantes os quais interagem com um banco de dados 111111p.111 ilh,1d11. Algumas observações referentes à diferença entre esse , , 1 d11 ,11q11111·1111.il l' outros devem ser feitas. Por exemplo, a diferença entre 11 1i-.1, d1· 1·v1·111 º" no t·s tilo arquitetural de invocação implícita e o uso de 111e11s.1gt·11s 110 ,·-.1 do ,11 q111tetu ral com base em objetos é que eventos são assíncronos, pern11t111do o L<>mponen te que gerou o evento continuar realizando alguma outra ativicbde (computa - ção) após o envio do evento. Além disso, o componente gerador de eventos des- conhece a identidade do componente consumidor de eventos. O mecanismo com base em eventos do estilo arquitetural de invocação implí- cita provê suporte à manutenibilidade desde que este estilo permita fácil inserção e remoção de componentes. A principal razão por trás disso é que os geradores de eventos não precisam saber quais componentes serão afetados por esses eventos. Note, portanto, que os componentes não podem fazer qualquer suposição sobre o tipo de computação a ser realizada ou ordem de processamento. Não sa- ber a ordem de processamento de eventos ou mesmo qual componente respon- derá constitui numa desvantagem pois, nesse caso, os componentes não detêm mais controle sobre a computação realizada pelo sistema. Similarmente ao estilo arquitetural de repositórios, apresentado a seguir, tem-se que o estilo arquitetural de invocação implícita poderia utilizar o meca- nismo de difusão de eventos para indicar a existência de erros ou falhas. Isso per- mite que esse mecanismo seja usado em todo o sistema a fim de lidar com a exis- tência de falhas, oferecendo assim um suporte indireto à confiabilidade. 2.6 Quadro-Negro O estilo quadro-negro ou blackboard originou-se no campo de inteligência artifi- cial, no qual ele era utilizado como um mecanismo para o compartilhamento de conhecimento ou dados por vários componentes inteligentes (Nii, 1986). Esse estilo considera a existência de um repositório central de dados circundado por um conjunto de componentes (células de conhecimento). A idéia do estilo arquitetural quadro-negro tem como base um modelo de so- lução de problema que fornece uma estrutura conceitua! para organizar o conhe- cimento do domínio bem como uma estratégia para aplicar esse conhecimento. Esse estilo arquitetural prescreve a organização do conhecimento do domínio, toda s as entradas e soluç6e s p,1rciais para solucionar o problema. A ,1rq11Íll'1111.1 q11,1d1 o 111·g1 o consiste basicamente de três componentes: • < °l·l11I." d,· 1 0111.n 1111111fu - O conhecimento necessário para solucionar um problema é particionado em células de conhecimento. Tais células são separadas e independentes. • Estrutura de dados do quadro-negro - Os dados de solução de problemas são mantidos num banco de dados compartilhado, denominado de qua- dro-negro. As células de conhecimento causam modificações no quadro- 1J1r.1111(111 d, ',( 111,11111,1111.11!11,11,.111 .. ,111 1 lll l',,11 1111111,1 , 111111,.,111 11111.111111 1,1 , 10 l ' l 11111111111,11,..101·11111· ,1, u •hil.1, 1h· u11tl1t·111111·1110 ou111t·111 111111.1111t·1111• :111.1vt·s do q11;1dro negro . • Controle - As células de conhecimento respondem de forma oportunista l às mudanças no quadro -negro. A figura 2.10 ilustra o estilo arquitetural quadro-negro. célula de conhecimento célula de conhecimento quadro-negro (banco de dados compartilhado) Figura 2.1 O Organização quadro-negro." célula de conhecimento célula de conhecimento O estilo arquitetural quadro-negro possui um banco de dados compartilhado (quadro-negro) que possui uma organização dependente da aplicação. Existe, também, um conjunto de células de conhecimento que são logicamente indepen- dentes e respondem às mudanças que ocorrem no quadro-negro. As células de conhecimento podem ser ativadas através do estado do qua- dro-negro. Dessa forma, as células de conhecimento respondem às alterações que acontecem no quadro-negro. É importante observar que o fluxo de controle do sistema não é explicitamente definido. Em vez disso, o fluxo de controle é de- terminado pelo conjunto de componentes ativos em um determinado instante. Esse tipo de estilo arquitetural é adequado em aplicações, onde diversos ti- pos de conhecimento devem ser considerados a fim de dar suporte à interpreta- ção de um conjunto de dados iniciais. Tipicamente, a arquitetura quadro-negro era utilizada em casos onde não havia soluções gerais para um problema. Nesse caso, um ou mais componentes (células de conhecimento) interagem com o ban- co de dados compartilhado (quadro-negro) buscando encontrar uma solução parcial ou total. No caso de uma solução parcial, outro componente pode vir a ser ativado. 2 A resposta oportunista é baseada num modelo de raciocínio oportunista, onde fragmentos de co- nhecimento são aplicados regressivamente ou progressivamente no momento mais oportuno. Em outras palavras, para solucionar um problema, quais/quando /como os fragmentos de conhecimento deveriam ser utilizados? / 25 Podemos ainda considerar a organização dos dados em um repositório. A ar- quitetura quadro-negro mais simples envolve apenas um único repositório cen- tral de dados (quadro-negro). Entretanto, problemas mais complexos podem exigir múltiplos repositórios organizados num sistema distribuído de acordo com os tipos de dados. A necessidade de um componente (célula de conhecimento) 'passear' pelo repositório de dados (quadro-negro) em busca de uma solução constitui-se numa desvantagem em termos de desempenho para esse estilo arquitetural. Além disto, pode haver redundância na tentativa de múltiplos componentes processarem da- dos de um problema. Um aspecto positivo desse estilo arquitetural é a facilidade na qual conse- gue-se adicionar ou remover quantidade e tipos de dados. Uma vez que o proces- samento de cada componente é independente dos demais, componentes podem ser adicionados ou removidos sem acarretar modificações nos demais. A manute- nibilidade é, portanto, um dos principais requisitos não-funcionais a que este es- tilo dá suporte. Essa característica, contudo, é dependente de como o componen- te de controle é definido. 2. 7 Outros Estilos Arquiteturais Os estilos arquiteturais discutidos anteriormente constituem aqueles mais co- nhecidos face a seu uso nos mais variados sistemas. Outros, entretanto, também são encontrados em diversas aplicações. Um subconjunto deles é apresentado aqui nesta seção. Note que nosso intuito não é catalogar todos os estilos arquite- turais existentes, mas apresentar ao leitor aqueles que oferecem suporte a um conjunto de requisitos de qualidade desejados em diversas aplicações práticas e sistemas. 2. 7 .1 Repositório (Passivo) Um repositóriopossui dois componentes básicos: um conjunto de dados com- partilhado (o qual representa o estado atual) e um conjunto de clientes indepen - dentes que tem acesso e atualiza a base de dados compartilhada. Este tipo de esti - lo arquitetural no qual se tem um conjunto de componentes independentes aces- sando e atualizando uma base de dados compartilhada é comumente chamada de repositório. A seção anterior apresentou o estilo arquitetural quadro-negro ou black- board. Esse estilo pode ser visto como um repositório ativo. Ele é denominado de ativo porque a base de dados (central) compartilhada notifica os clientes a ela co- 11ect.1dos q11,111do ocorrem mudanças que possam interessar a tais clientes. Daí, n"l ' t 1po d1· 11 ·positório ser chamado de ativo. 11111 , 1111, tJ l.1do, se o controle ou o mecanismo de acionamento dos clientes decorre dos tipo s de transações existentes, ele então é visto como um repositório 261 passivo, diferl'lltcmente do que se tem num estilo arquitetural quadro-negro. Geralmente, os conectores no estilo arquitetural de repositório são os me- canismos de consulta. Note que, a exemplo do estilo quadro-negro, a topologia does tilo repositório é estrela. Esse tipo de estilo arquitetural t, 11111111111 11, i 111 1 pal c-.11, tl t1, 1-.111,1 11 -.1q1111 tl q111· nll ·t n l' ., q11.tl1d.1d1 dr 111tq\1,11,.111 A,-.1111, v.11 i o, s1-.1l'111.,.., lOlllpo stos ., p.11111 dt· Lo111po11l'llll's p, l'l'\.t,tl ' lltt·, podr111 pt OVl't s11 prnte .1 esse requisito, fazendo uso do s mecanismos utilizados 110 estilo qua dro negro. 2. 7 .2 Arquiteturas de Aplicações Distribuídas Existe considerável discordância na literatura quanto ao que constitui um siste- ma distribuído. Dentre as diversas definições encontradas, há um ponto de con- cordância: a presença de múltiplos processadores. Parte da discordância existen- te pode se dever à grande quantidade de modelos arquiteturais. Aqui, concentra- mo-nos em dois estilos arquiteturais mais comuns: multiprocessadores e multi- computadores. ' Uma arquitetura multiprocessadores compreende vários processadores au- tônomos compartilhando uma memória primária comum. Esse estilo arquite- tural é apropriado para executar, simultaneamente, diversas subtarefas de um mesmo programa. Por outro lado, uma arquitetura multicomputadores é simi- lar à multiprocessadores, exceto que os processadores não.,compartilham me- mória. Ao invés, eles se comunicam através de passagem de mensagens numa rede de comunicação. Uma ilustração do mecanismo de comunicação é mostra- da na Figura 2.11. memória memória processador processador rede Figura 2.11 Mecanismo de comunicação via passagem de mensagens. Dessa forma, a arquitetura de um sistema distribuído consiste de múltiplos processadores autônomos os quais fazem uso do mecanismo de passagem de mensagem para se comunicarem uns com os outros. Note que eles não comparti- lham memória. Nesse caso, uma aplicação distribuída pode ser vista como um programa concorrente no qual os processos se comunicam por meio da passagem de mensagens. Essa denominação é resultante do fato de tais programas serem executados em arquiteturas distribuídas. Uma aplicação distribuída possui quatro tipos de processos (ou componen- tes) : filtros, clientes, servidores e pares (ou peers). 127 Um filtro é um transformador de dados. Ele recebe um fluxo de dados através de sua entrada, efetua computações sobre esses dados e coloca os dados resultan- tes na sua saída a fim de enviar a algum outro componente. Exemplos dele po- dem ser encontrados nos comandos do sistema operacional Unix 3 . lJlll ditntt· podl' Sl'I v1,to L<>l1H> 11111 p1ou ·,,o N.1 11111 1 1~ 11,, 11111 1111•1111· 1• ,1·1 • v1dor, o dtente é o componentt qut 1111ci.1 ,dg11111,1 .1tivid.1d1, ,\11·111 d1.,,o, lrl' qüentemente, ele pode causar algum atraso enqua1110 .1g11.1nl.1 o t 1.11.11111·1110 de alguma solicitação feita. AgQra, diferentemente de um cliente, o servidor aguarda solt<.:1t.1çoes Je di - entes a fim de tratá-las. Em outras palavras, um servidor é um processo reativo uma vez que reage às solicitações feitas por clientes Ele pode atender a mais de um cliente e, geralmente, opera de forma não determinística. Assim, por exemplo, um servidor de arquivos em um sistema distribuído tipi- camente contro la um conjunto de arquivos e solicitações de serviço (de clientes) que aguardam o acesso àqueles arquivos. Um par (ou peer) é um dentre um conjunto de processos idênticos que intera- ge a fim de oferecer algum serviço ou realizar alguma computação. Por exemplo, dois pares poderiam controlar a cópia de um arquivo de dados, interagindo um com o outro a fim de manter a consistência das duas cópias. Outro exemplo é en- contrado em programação paralela, no qual vários pares interagem a fim de re- solver um problema. Nesse caso, cada par é responsável pela solução de uma par- te do problema. Processos Comunicantes Um estilo arquitetural que se enquadra dentro do conjunto de arquiteturas de aplicações distribuídas é o de processos comunicantes. O estilo arquitetural de processos comunicantes é utilizado quando as metas prioritárias do sistema a ser desenvolvido são escalabilidade e facilidade de modificações. Andrews discute um conjunto de variantes desse estilo que podem atender a metas distintas (Andrews, 1991 ). Um exemplo de variante do estilo arquitetural de processos comunicantes é aquele em que se tem um conjunto de trabalhadores (componentes computacio- nais) replicados que compartilham um repositório de tarefas. Diferente dos ser- vidores descentralizados que mantêm múltiplas cópias de dados, esse estilo for- nece múltiplas cópias dos componentes computacionais. Esse estilo é utilizado em programação paralela quando lidando com o paradigma SIMD (Single Instruction, Multiple Data). Cliente-Servidor Outro estilo arquitetural que se enquadra no conjunto de arquiteturas distribuí- das é cliente-servidor. Este estilo permite que as tarefas sejam divididas entre 2813 Unix é uma marca registrada da AT&T, Bell Labs. produtores e consumidores de dados. Um servidor é um processo que fica num estado de espera, aguardando solicitação de serviço de um ou mais clientes. Um cenário típico envolvendo cliente e servidor seria: 1. Um sistema computacional acomoda um (processo ) servidor, o qual é inici- .tl11.1dn -.0111tl1<1. J\po-. 1t1tl 1,tl1,.1do, 1 ll' 1·1111.111<1111 estado de espera e aguar- d.1 q1tl' ,1 lg11111 d 11·11tl' l'tlt n· l'lll l 0111.11 ou 1111 l'k, n·quisitando algum serviço. 2. Um (procl'sso) diente, qul' podl' l'st,11110 111L·s111n sistema ou em algum ou- tro, é conectado ao servidor via rede. (;er,1ln1l'11te, os clientes podem inte- ragir com o usuário que digita algum rn111.u1do. Assim, o cliente envia uma solicitação via rede ao servidor para que l'Ste último atenda a solicita- ção, possivelmente, efetuando alguma co111p11t.tção. 3. Após o servidor tratar a solicitação, ele retorna o resultado para o cliente, voltando em seguida para o estado de espera, no qual permanecerá até que chegue nova solicitação de algum cliente. Perceba que o servidor pode trabalhar de forma síncro'ha ou assíncrona. Quando operando no modo síncrono, o servidor retorna o controle ao cliente no mesmo instante em que ele envia os dados resultantes. Agora, se o servidor traba- lha de forma assíncrona, ele retornará apenas os dados resultantes ao cliente ao término do tratamento da solicitação recebida. É interessante ainda observar que os clientes no estilo arquitetural clien- te-servidor podem ser vistos como processos que atuam de forma independente, isto é, a execução de um processo não interfere em outro(s). Essa independência entre os processos implica nos seguintes benefícios para esse estilo: (a) Facilidade de remover e/ou adicionar clientes. Essa facilidade de mudança decorre da independência existente entre os processos. (b) Facilidade de modificar a funcionalidade de um cliente (visto queoutros clientes não serão afetados) . Tais benefícios podem não se verificar se houver acoplamento entre os clien- tes, o que acarreta em maior nível de dependência entre os (processos) clientes. 2. 7 .3 Chamada de Procedimento Remoto Chamada de procedimento remoto ou remore procedure cal! (RPC), também de- nominado de chamada de sub-rotina, é um mecanismo de transf erên<.:ia de <.:on trole de um processo (chamador) para outro (chamado), Sl'ndo dl'pois o co111 rok retornado ao processo que emitiu a chamada. Sistemas com base no uso de chamada de procedimentc, 11·111<1101•.1•1 tl1111' 11ti• são decompostos em partes que ficam em computadores u 1111 1 1.1il11,, 1,1 11 d, ,, \ chamada de procedimento remoto permite a comunicação l11d1111 1,111 d l 1111 d,,. objet:ivos é aumentar o desempenho do sistema ao distriblllr a computação a ser realizada entre vários processadores. 129 Em uma chamada de procedimento remoto (RPC), um processo no sistema local invoca um procedimento em algum sistema remoto. A Figura 2.12 ilustra o estilo arquitetural de chamada de procedimento remoto no qual temos a comu- nicação entre o processo cliente e o processo servido via rede. Processo c11ente rotinas do cliente ada de -~ cham proce lo dimento cal ,. instância do cliente ... Jl . .................. ada ao cham sis tema 1 rotinas de rede kernel local -~ .... ········processo serv1aor rotinas do servidor a 1J instância do servidor . ..................... comunicação via rede rotinas de rede kernel remoto Figura 2.12 Chamada de procedimento remoto. Nessa figura, temos dois processos: cliente e servidor. O processo cliente faz uma solicitação, isto é, uma chamada de procedimento remoto, a algum outro processo. O processo que recebe a solicitação, após tratá-la, retorna o(s) resulta- do(s) ao processo cliente. Abaixo, descrevemos a seqüência de passos executados durante uma cha- mada de procedimento remoto, feita por um processo cliente, a algum pro- cesso. 1. O cliente invoca um procedimento local, denominado na Figura 2.12 de instância de cliente (isto é, client stub). Dessa forma, tudo se passa como se o cliente estivesse chamando o procedimento do processo (servidor) o qual deseja chamar. O propósito dessa instância de cliente é empacotar os argumentos a serem passados ao procedimento remoto, possivelmente colocando os em algum formato a fim de enviá-los como mensagens via n·d1· F,,1· 1·1111Mcotamento de argumentos do cliente é normalmente co- 11l1n 1d1111111111 marshaling. 2. As t11l"t1sag,ens de rede são enviadas ao processo (do sistema remoto) atra- vés d., 111stância do cliente. Isso requer uma chamada ao kernel local. 3. Depois disso, as mensagens de rede são transferidas ao processo do siste- ma remoto, utilizando algum protocolo que pode ou não ser orientado à conexão. 4. Uma instância do servidor (server stub) fica esperando por alguma solici- tação do cliente. A instância do servidor desempacota os argumentos da mensagem de rede. Esse processo de desempacotamento é chamado de unmarshaling. 5. A instância do servidor ou server stub faz uma chamada a um procedimen- to local a fim de invocar um procedimento (próprio) do servidor, passan- do a ele os argumentos recebidos na mensagem de rede enviada pela ins- tância do cliente. 6. Quando o procedimento do servidor é encerrado, ele retorna resultados à instância do servidor. 7. A instância do servidor, se necessário, efetua alguma conversão e empaco- ta o(s) resultado(s) em uma ou mais mensagens de rede,'"enviando-as à ins- tância do cliente. 8. As mensagens são transferidas de volta ao cliente via rede. 9. A instância do cliente lê as mensagens do kernel local. 1 O. Após efetuar conversão, os resultados são passados pela instância do cli- ente ao cliente. Note que tudo se passa como se um processo fizesse uma chamada a outro processo e tudo acontecesse localmente. Há uma concepção de ocultar a porção dl' código de rede nos procedimentos das instâncias de processo (stub). Perceba que nesse estilo arquitetural, uma das metas é a decomposição do sis- 1 l"l11a em partes menores de modo a facilitar modificações necessárias. É interes- s,1111 e observar que o processo cliente não avançará em alguma computação a ser l 1·11,1 até que o processo invocado por meio de uma chamada de procedimento re- 111010 retorne a ele o resultado da chamada. Dessa forma, quando da interação 1·111 re dois componentes (processos) fazendo uso de um conector (chamada de 111 ocedimento remoto), o componente que fez a invocação ao componente re- 111010 permanecerá aguardando o(s) resultado(s) de sua solicitação. 2.8 Variações de Estilos 1 11 •ic, já dispomos de uma quantidade razoável de estilos arquiteturais. Também 1 11u>ntramos algumas variações sobre os estilos arquiteturais apresentados ante- 11111 mente. Note que os estilos discutidos ao longo deste capítulo compreendem q w11,1s parte daqueles existentes. <iuando da apresentação dos estilos, sempre destacamos requisitos não-fun- 1 11111,11s ou requisitos de qualidade desejados nos sistemas a serem desenvolvidos. \ 31 1 Exemplo de tais ~eq~isitos são d~sempenho, facilidade de moMicação, manut~- 1 ~ibiHdade e conf,abd1dade do sistema. Os estilos arquiteturais introduzidos neste capítulo são, em alguns casos, ge- néricos. Isto é, eles ainda requerem que decisões de projetos sejam tomadas já que algumas, senão muitas, ficaram indefinidas. Na prática, contudo, a arquitetura de um sistema quase nunca é obtida a par- tir de um único estilo. Assim, o arquiteto de software necessita compreender pos- síveis relacionamentos existentes entre estilos. Isso requer conhecer os atributos de projetos, requisitos não-funcionais bem como exige um processo de análise arquitetural. Tais tópicos serão discutidos nos dois capítulos subseqüentes. Um projetista ou arquiteto de software tem uma visão do sistema decompos- to em seus principais componentes. Assim, ele identifica os componentes exis- tentes bem como as interações entre esses componentes. Vale lembrar que pode- mos ter interações de controle ou de dados entre componentes. Quando investi- gando se um ou mais estilos arquiteturais é/são adequado(s) ao sistema em desen- volvimento, o projetista levanta questões como: • Qual a topologia do estilo arquitetural? • Como ocorre a transferência de dados e/ou controle entre componentes? • Quais tipos de componentes e conectores são utilizados nesse estilo? • Como o controle é compartilhado entre componentes? • Há algum tipo de interação entre dados e controle? • O tipo de análise a ser feita tem qualquer influência sobre o estilo? • Os componentes interagem de forma síncrona ou assíncrona? Essas questões ajudam a compreender o quão apropriado é o uso de um estilo num sistema em desenvolvimento. Como veremos no Capítulo 3, cenários são desenvolvidos objetivando verificar se o estilo oferece suporte aos requisitos de qualidade desejados no sistema. Note que a maioria dos sistemas, na prática, faz uso de mais de um estilo ar- quitetural. Essa heterogeneidade pode se dar de maneira hierárquica. Considere um sistema organizado em camadas a qual pode ser composta de objetos. Uma ilustração desse exemplo é mostrada na Figura 2.13. Em sistemas de grande porte, verificamos que a arquitetura do sistema é na realidade uma combinação de estilos, a exemplo do que foi ilustrado na Figura 2.13. Um exemplo de sistema comercial faz uso da arquitetura CORBA (Com- mon Object Request Broker Architecture) que acomoda tanto o estilo arquitetu- ral de camadas quanto o de objetos. A Figura 2.14 mostra a interação entre um cliente e uma implementação de objeto na arquitetura CORBA. Essa figura mostra uma solicitação de um cliente sendo passada a uma imple- mentação de objeto na arquitetura CORBA. Nesse caso, tanto cliente quanto ob- 321 jeto encontram-se em máquinas distintas e a comunicação ocorre via rede. Existe umaIDL (Interface Definition Language) entre objeto e a ORB (Object Request Broker). Perceba que tanto cliente quanto objeto são isolados da ORB através da IDL. Isso porque a arquitetura CORBA requer que toda interface de objeto seja expressa através de IDL. 1 __________ Estilo de objetos----------, 1 obj2 --1 , ........ 1 ', 1 1 ', 1 Estilo de camadas 1 1 obj1 obj3 ,, r-, " obj4 ' \ \ \ \ \ \ \ \ \ \ \ \ -------- \ , ~...-__,__., \ \ \ L-------------------------------- \ \ ' ' ':, ,------- Figura 2.1 l Combinação de estilos. cliente 1 1 lmplem.Obj 1 1 lmplem.Obj 1 cliente IDL IDL IDL IDL ORB 1 ORB ..... ~ rede ..... Figura 2.14 Interação entre cliente e objeto na arquitetura CORBA. ..... ... 1 Note que os clientes vêem apenas a interface de um objeto. Isso assegura a sL1bstituição ou modificação de qualquer implementação por trás da interface. D essa forma, poderíamos conectar ou desconectar componcnrcs sem implicar mudanças nos demais componentes. A ORB é encarregada de tratar as comunicações via I nk p.11,1 l lit·111t·s t· oh)l' t<•s. Perceba que qualquer solicitação de um cliente não p.,., .1 d11 cl,11111 1111 p 11 1 uma implementação de objeto. As solicitações sãos ·111p1r 11,11,1d I IH l 1 ( llU\ Nesse caso, qualquer invocação a um objeto é passada p1 IIIH 1111 1 < li' li Note que a Figura 2.14 dá ênfase a comunicação de Ol{B para ORB. Entre- ta nto, não há qualquer diferença seja na implementação d<, 111 )jeto local ou remo-133 ta. Se remota, a invocação passa da ORB do cliente para a ORB da implementa- ção do objeto. , . . . _ , . É importante acrescentar que as IDLs provêm suporte a d1stnbmçao de van- ,1., llll 111,1-.: d,10 c11l.1s1 · ,11, t ' lll ,q1s1d,111111110, dl l11H 111 111H 1,1 111 , 1 11p,,.., 11 111 .1111h1 gu,1111t·11te. Akm disso, 11111 rcpos1tor10 dl' 111tt•d,tLl'S 011 1111c1 l.1l l l l'po -.lllll y (IR) compartilhado assegura que todas as ORHs na rede tenh,1111 ,lll 's-.o ,Is dl'/11111,m·-, de interface IDL. A Figura 2.15 ilustra o modelo de gerenciamento de objetos da arquitetura CORBA. Esse modelo inclui as facilidades e serviços oferecidos. objetos da aplicação facilidades verticais CORSA(domínio) ORB (Object Request Broker) serviços CORSA facilidades horizontais CORSA Figura 2.15 Modelo de gerenciamento de objetos. O modelo apresentado nessa figura define os serviços e facilidades ofereci- dos para arquitetura de objetos em CORBA. Perceba que várias facilidades são providas na arquitetura. Além disso, CORBA oferece diversos serviços, tais como serviços de nome e serviços de notificação de eventos. Uma discussão mais detalhada sobre CORBA exigiria, na realidade, outro li- vro. Aqui, nosso interesse se restringe a identificar os aspectos mais importantes e qualidades que essa arquitetura suporta. Cabe destacar que a arquitetura CORBA oferece suporte a manutenibilida- de em que a adição, remoção ou modificação da implementação de objetos ocorre de forma independente não acarretando necessidade de alteração em outros componentes. Ademais, ela provê suporte e confiabilidade e tolerância a falhas. 2.9 Resumo Um dos principais aspectos do projeto arquitetural é o uso de padrões de organiza- ção de um sistema. Muitos desses padrões, também chamados de estilos arquitetu- rais, têm sido desenvolvidos ao longo do tempo à medida que projetistas de siste- 341 mas reconhecem o valor de princípios de organização bem como estruturas para certas categorias de software. Este capítulo fez a introdução de um novo tópico de estudo apresentando um conjunto de estilos arquiteturais. Foram indicados com- promissos e características associados às várias opções de estilo arquitetural. 2.1 O Exercícios 1. Sclnio11r grupos tk du,1s pesso,1<, · sol1l1t1· que cada grupo enumere as v,111t,1ge11s e desvnntagens de <.:.1d,1 u111 dos l''>lilos arquiteturais estudados neste capítulo. 2. Com base no resultado obtido na questao 1, p ·ça que cada grupo propo- nha istemas onde o estilo arquitetural estudado seja adequado. 3. Em que situação a heterogeneidade de estilos pode ser necessária? 135 Mendes Estilos Arquiteturais pag1 1_stitch Mendes Estilos Arquiteturais pag2 1_stitch Mendes Estilos Arquiteturais pag3 1_stitch Mendes Estilos Arquiteturais pag5 1_stitch Mendes Estilos Arquiteturais pag6 1_stitch Mendes Estilos Arquiteturais pag7 1_stitch Mendes Estilos Arquiteturais pag8 1_stitch Mendes Estilos Arquiteturais pag9 1_stitch Mendes Estilos Arquiteturais pag10 1_stitch Mendes Estilos Arquiteturais pag11 1_stitch Mendes Estilos Arquiteturais pag12 1_stitch Mendes Estilos Arquiteturais pag13 1_stitch Mendes Estilos Arquiteturais pag14 1_stitch