Architectural Patterns: Microkernel

Posted on março 17, 2011 by elemarjr

3


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.

image

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:

  1. funcionalidades que permitem aos componentes do sistema estabelecer comunicação com os demais;
  2. 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:

image

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.

image

 

Clients se comunicam com external servers usando facilidades providas pelo microkernel.

image

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:

image

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:

image

 

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:

  1. faça uma análise do domínio de sua aplicação e identifique quais são os External Servers;
  2. Identifique os serviços que serão providos por cada um dos external servers;
  3. Separe os serviços identificados em categorias (sempre que possível, tente criar abstrações para esses serviços);
  4. Identifique quais são os serviços fundamentais (eles são comuns a todos os externals servers);
  5. Esboce contratos de serviço;
  6. Estruture o microkernel (serviços e organização interna);
  7. Defina interface de comunicação com o Microkernel;
  8. Priorize, no microkernel, serviços e operações de manipulação de recursos;
  9. Planeje e implemente internal servers;
  10. Implemente os external servers;
  11. Implemente adaptadores que forem necessários;
  12. 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!

Smiley piscando

Posted in: Arquitetura, Patterns