Olá pessoal, tudo certo?
Gostaria de, vez ou outra, compartilhar minha visão sobre alguns patterns arquiteturais. Entendo que essa categoria de patterns colabora com o desenvolvimento de arquiteturas sólidas e consistentes.
Patterns arquiteturais ajudam a identificar e descrever elementos (componentes) de software – seus papéis, comportamentos e relacionamentos – que vão ser implementados para atender um determinado contexto.
Hoje, especificamente, pretendo tratar um pattern que considero muito bacana: Microkernel.
Sem mais delongas,
Visão geral para o Microkernel
Microkernel é um pattern arquitetural aplicável a softwares que precisam se adaptar rapidamente a mudanças de requisitos de sistema.
Segundo esse pattern, o sistema deverá possuir um núcleo com funcionalidades essenciais. Esse núcleo deve funcionar como uma espécie de “socket” onde são encaixadas extensões. Estas, por sua vez, devem implementar as funcionalidades adicionais e necessidades específicas dos clientes.
Cabe ao núcleo a responsabilidade de controlar e coordenar a colaboração entre as extensões.
Muitos desenvolvedores costumam associar microkernel ao desenvolvimento apenas de sistemas operacionais. Entretanto, em arquitetura de software, essa é uma restrição de escopo que faz pouco sentido.
Contexto de aplicação para o Microkernel pattern
Desenvolvimento de aplicações, que usam interfaces de programação semelhantes, construídas sobre um mesmo conjunto de funcionlidades “core”.
Cenários para utilização do Microkernel pattern
Não é fácil desenvolver softwares que precisem suportar padrões e tecnologias similares. Considere o desenvolvimento de um cliente de redes sociais como o Seesmic (veja o post anterior): ele precisa suportar diversas redes sociais que, embora tenham características similares, possuem particularidades. Ele foi implementado como plataforma de aplicação. Ou seja, é um software que fornece uma infraestrutura básica para o funcionamento de outros softwares “embutidos”.
Softwares com suporte amplo a scripting também são, geralmente, plataformas de aplicação. Ou seja, no lugar de prover funcionalidades diretamente, relegam essa responsabilidade aos scripts. Um bom exemplo para esse tipo de software é o AutoCAD.
Outro exemplo recorrente para plataformas de aplicação são os sistemas operacionais.
Plataformas de aplicação frequentemente têm um longo tempo de vida, algumas vezes vários anos. Em intervalos longos de tempo, novas tecnologias surgem e algumas antigas se modificam.
Ao desenolver plataformas de aplicação devemos ter clara preocupação com:
- a evolução contínua do hardware e do software;
- portabilidade, extensibilidade e adaptabilidade suficiente para integração com tecnologias emergentes.
Microkernel é um pattern direcionado para a construção de plataformas de aplicação flexíveis, portáveis, extensíveis e adaptáveis.
Resumo da solução descrita no Microkernel pattern
Uma arquitetura desenvolvida com base no Microkernel pattern encapsula os serviços fundamentais da aplicação em um núcleo mínimo. Por serviços fundamentais, entendemos:
- funcionalidades que permitem aos componentes do sistema estabelecer comunicação com os demais;
- gerenciamento de recursos básicos, como arquivos e processos.
Funcionalidades essenciais não poderiam ser implementadas no “microkernel” sem aumentar seu tamanho ou complexidade. Por isso, devem ser implementadas separadamente em internal servers. Observe:
External servers, por outro lado, implementam sua própria “visão” do microkernel. Para construir essa visão, usam os mecanismos disponibilizados através das interfaces providas pelo microkernel. Cada external server funciona como uma espécie de processo independente que, sozinho, representa uma plataforma de aplicação. Assim, um sistema baseado no pattern Microkernel pode ser visto como uma plataforma de aplicação que integra outras plataformas de aplicação.
Clients se comunicam com external servers usando facilidades providas pelo microkernel.
Confuso!? Vamos ver se deixamos a coisa mais clara.
Estrutura de elementos (componentes) do Microkernel pattern
Microkernel pattern descreve cinco tipos de elementos (componentes) participantes. São eles:
- Microkernel;
- Internal Servers;
- External Servers;
- Adapters
- Clients
Um por um:
Microkernel
É o componente principal definido por esse pattern.
Para cada software implementado obedecendo ao Microkernel pattern, há apenas um microkernel disponível e, por isso, ele geralmente é singleton.
Se você está usando MEF, é esse componente que define os contratos que serão utilizados. Também é ele que possui o ImportMany para carga dos diversos External Servers e os Import para cada tipo de Internal Server.
Cabe ao Microkernel a responsabilidade por prover facilidades de comunicação e gestão de recursos do sistema (ambinente) operacional. Todos os outros componentes (elementos) do sistema devem ser construídos usando todos ou alguns desses serviços básicos.
Todas as operações de nível mais baixo (interação com hardware ou protocolos) devem estar “encapsuladas” no microkernel.
Internal Servers
Geralmente, é onde estão as “implementações concretas” das funcionalidades entregues pelo microkernel. Pensando em um “sistema operacional”, drivers de dispositivo seriam ótimos exemplos de Internal Servers.
O microkernel “chama” a funcionalidade dos “internal servers” obedecendo um “contrato” para prestação de serviços. Internal Servers devem ficar “visíveis” apenas para a Microkernel.
Para dar um exemplo mais claro, se o microkernel provê conexão com um servidor remoto, caberá a um Internal Server a responsabilidade de implementar conexão em um determinado protocolo. Dar suporte a outro protocolo implica na escrita de uma nova versão do Internal Server.
Repare que, em tempo de execução, Microkernel e Internal Servers formam um bloco “indivisível” frente ao restante da aplicação:
External Servers
Também conhecidos como “personalidades” – são componentes que, partindo do microkernel, fornecem uma “visão mais refinada” do domínio da aplicação.
Cada external server implementa especializações de políticas definidas na microkernel para domínios de aplicação mais específicos. External Servers deixam públicas suas funcionalidades expondo, geralmente, as mesmas interfaces públicas do microkernel.
External servers são acessados por clientes e acessam apenas o microkernel. Considere a seguinte arquitetura para um cliente de redes sociais:
Twitter e Facebook são external servers que apresentam versões refinadas do Microkernel. Repare que as funcionalidades do núcleo foram “concretizadas” em Internal Servers.
Client
Um client é uma aplicação que está associada com apenas um external server. Em um sistema com suporte a scripting, os scripts seriam boas referências para Client.
Há ainda a possibilidade mais uma camada entre um External Server e o Client. Um Adapter (ou emulador). Basicamente, um adaptador permitiria que um mesmo client (script em nosso exemplo) seja “entendido” em duas ou mais plataformas de aplicativo diferentes.
Utilizando o Microkernel pattern
Uma vez que conhecemos os “tipos” de componentes que formam uma arquitetura baseada no Microkernel pattern, carecemos de uma orientação sobre qual seria a maneira correta de construir uma arquitetura concreta baseada nesse padrão.
Segue um passo-a-passo:
- faça uma análise do domínio de sua aplicação e identifique quais são os External Servers;
- Identifique os serviços que serão providos por cada um dos external servers;
- Separe os serviços identificados em categorias (sempre que possível, tente criar abstrações para esses serviços);
- Identifique quais são os serviços fundamentais (eles são comuns a todos os externals servers);
- Esboce contratos de serviço;
- Estruture o microkernel (serviços e organização interna);
- Defina interface de comunicação com o Microkernel;
- Priorize, no microkernel, serviços e operações de manipulação de recursos;
- Planeje e implemente internal servers;
- Implemente os external servers;
- Implemente adaptadores que forem necessários;
- Desenvolva algumas aplicações cliente.
Implicações da adoção do Microkernel pattern
Adotar o Microkernel pattern implica nos seguintes benefícios:
- Portabilidade
- Na maioria dos casos não ha necessidade de “portar” external servers ou clients. Basta portar o Microkernel.
- Migrar o Microkernel para um novo hardware ou software requer apenas modificações pontuais (geralmente em Internal Servers)
- Flexibilidade e Extensibilidade – Adicionar uma nova view para o sistema implica apenas, geralmente, na implantação de um novo external server. Adicionar novas capacidades a todas as views demanda apenas a escrita de novos internal servers;
Adotar Microkernel pattern implica nas seguintes penalidades
- Performance – comparado a sistemas com núcleos monolíticos, há um custo adicional de “comunicação” entre os elementos
- Complexidade de design e implementação.
Por hoje, era isso!
Ricardo Simões
março 19, 2011
Oi,
Isto aqui poderia ser considerado uma implementação deste pattern??
[]‘s
Ricardo Simões
março 19, 2011
Oi, segue a url direta.
http://msdn.microsoft.com/en-us/library/aa680673.aspx
[]‘s
Ricardo Simões