31 de July de 2008

Equilíbrio e Granularidade de Serviços (III)

Aqui jaz o último post da série “Equilíbrio e Granularidade de Serviços”. No post anterior da série os conceitos de granularidade fina e grossa foram expostos, bem como seus benefícios e desafios. Agora o objetivo é entender e saber quais forças atingem a granularidade de um serviços.

Assim como muitas decisões de design de software, as decisões tomadas acerca da definição da granularidade de serviços, na prática, freqüentemente são baseadas em heurísticas. Para facilitar este caminho, existem aspectos dos quais arquitetos e projetistas podem considerar para chegar à granularidade quase correta dos serviços em uma arquitetura SOA. É uma tentativa de deixar o problema menos empírico. Digo “quase correta” pois não existe granularidade correta ou errada, o que existe, é a granularidade boa para atender alguns aspectos em uma estratégia SOA em determinado contexto.

Um serviço pode ser projetado visando um ou mais dos seguintes aspectos:

  • Funcionalidade
  • Flexibilidade
  • Reúso
  • Complexidade
  • Independência de Contexto
  • Desempenho
  • Generalidade
  • Fornecimento

Para exemplificarmos: imagine-se na visão de um projetista de serviços, quando ele pensa em um desejo sobre um serviço que ele está projetando, algo como: “gostaria que o meu serviço fosse altamente reutilizado.” O que isso implica? Quais são os efeitos colaterais?

O aspecto de reúso quase sempre resulta em serviços pequenos com capacidades funcionais reduzidas, ou seja, serviços de alta granularidade (fine-grained), em contrapartida, os serviços acabam possuindo uma baixa complexidade cognitiva. Pensando no serviço a ser projetado pelo projetista, se ele carregá-lo com muita capacidade funcional específica o serviço só poderá ser reutilizado em um ou poucos contextos de negócio, nisto perde-se em reusabilidade. Também, como são gerados vários pequenos serviços tende-se a impactar no desempenho, aumentando a latência de rede com composições desses pequenos incrementos para resolver a necessidades funcionais.

Veja apenas pela descrição acima que, projetar serviços para o reúso produz efeito direto em outros aspectos como: funcionalidade, complexidade, desempenho. Além disso existe um relação direta entre a granularidade do serviço e sua capacidade de reúso, onde quanto mais fina a granularidade maior a capacidade de reúso.

Então, qual a medida de reúso que o projetista deve usar para ter a granularidade correta? Como vimos nos outros posts da série, não existe uma medida absoluta para a granularidade, o que existe é uma análise de equilíbrio (trade-off) que o projetista ou arquiteto deve fazer ao projetar os serviços, considerando os aspectos citados acima e sabendo que eles influenciam uns aos outros e com alguma relação com a granularidade.

Outros links de referência:

http://www.ibm.com/developerworks/library/ws-soa-design1/
http://www-128.ibm.com/developerworks/webservices/library/ws-soa-granularity/
http://www.zapthink.com/report.html?id=ZAPFLASH-200783
http://msdn2.microsoft.com/en-us/library/bb245664.aspx

- Fábio Rosato

Responses

Legal o post. Mas eu senti falta de ter um jeito de definir mesmo a ganularidade. Fiquei pensanso em como definir, e parece que essa granularidade não é definida, mas sim aparece naturalmente enquanto o arquiteto faz o design.

Um step-by-step para isso acontecer poderia ser algo do tipo:

- Baseado em um processo de negócio, definir as operações de cada passo do processo.

- Para cada operação, analisar se ela vai ser utilizada em mais de um passo do processo.
Se sim, pode pensar em criar um serviço com menor granularidade com essa operação.
Se não, pode criar um serviço com granularidade mais grossa que contenha esta operação.

- Feita esta análise, juntar as operações, considerando seus significados.
Ex.: Se houver as operações, enviarCorreio, receberCorreio, enviarFatura, listarEstoque,
com certeza vocês não juntaria enviarCorreio com enviarFatura. Não faria sentido.
Faria mais sentido juntar as operaçõs enviarCorreio e receberCorreio, dentro de um serviço chamado CorreioService

- Desta maneira, a granularidade iria aparecer naturalmente. Ao invés de precisar definir a granularidade antes,
ou tentar achar uma fórmula mágica para defini-la.

O que vc acha ?

Abraço.

Leave a response

Your response: