segunda-feira, 20 de abril de 2009

BPM na Prática: Excelente artigo da IBM

Navegando pelo portal da DeveloperWorks (IBM), encontrei um material fantástico que fala sobre modelagem de processos dirigidos ao negócio, composto de 4 partes:
Vale a pena conferir os artigos. Além de muito bem escritos, explicam muito bem os conceitos de modelagem de processos no contexto de BPM e SOA, sendo portanto uma leitura obrigatória para aspirantes e usuários dos assuntos.

Boa Leitura ;-)

A nova era do "Social BPM"

Foi lançado recentemente mais um portal de BAAS (BPM As a Service) conhecido como AlignSpace. Um detalhe interessante sobre o AlignSpace, é que ele é sustentado pela Software AG, uma das empresas líderes de mercado em soluções de BPM e governança SOA.

Vale a pena conferir a solução, criar redes sociais de geração de valor, construir colaborativamente um processo de negócio e evolui-lo constantemente. Miko Matsumura, CTO da Software AG fala um pouco aqui sobre a AlignSpace e a visão de BPM atual da Software AG.

Web Services no JBoss ESB sem Java!

Uma das questões mais importantes a serem avaliadas numa solução de ESB é o quanto ele te possibilita seu uso e administração com a menor curva de especialização possível. Isso se dá porque um ESB é um padrão arquitetural para integração que deve ser agnóstico de tecnologia, e portanto, o uso do mesmo não deve implicar no conhecimento de tecnologias ou plataformas específicas.

Existem ESB's muito bons no mercado que possibilitam este tipo de coisa, e a maioria deles o fazem com o auxilio de ferramentas visuais de administração e desenvolvimento que escondem a complexidade da plataforma, tornando a vida do usuário do ESB mais simples. Bom, o quanto isso é interessante para quem administra e desenvolve em cima de ESB's? Olhando pelo lado da produtividade, este pode ser um ponto muito importante pois vo
cê rapidamente pode "sair fazendo" sem a pré-condição do domínio prévio do produto. Entretanto, isso é ruim em termos de flexibilidade pois você acaba preso a tudo aquilo que a ferramenta visual te deixa fazer.

Isso significa perda de flexibilidade. Se você quiser fazer algo que vá mais além do que os recursos que a ferramenta suporta, você terá que "abrir a caixa" e meter a mão na massa. E muitas das vezes, alguns produtos nem suportam a abertura da caixa. Neste caso, é preciso balancear corretamente o que é mais importante no ESB, se é a certeza de que ele fará (não importa como) o que ele diz que faz e ter fé, ou ter uma ferramenta que possibilite a criação de soluções de forma flexível mas também sem precisar conhecer os detalhes "técnicos" do ESB. Eu particularmente sou a favor da segunda opção.

Tendo trabalhado com alguns dos melhores ESB's do mercado, observ
o que cada um deles têm pontos que são muito interessantes, mas são exatamente os pontos que os deixam "amarradões". Para resolver este problema, é preciso que a solução de ESB lhe facilite sim certas coisas, mas sem deixar com que você fique com as mãos presas nas costas. É preciso poder mostrar o caminho, mas um caminho que seja simples de atravessar, e que não crie dependências em sua solução. Três dos melhores ESB's que pude ver que possibilitam este tipo de coisa é o JBoss ESB, AquaLogic e Sonic ESB. Todos eles, possuem ferramentas interessantes para criação de soluções de EAI e serviços, mas em um dado momento, todas elas possibilitam que o trabalho seja feito usando apenas o mínimo que um arquiteto de integração deve conhecer: XML!

Neste post, irei mostrar um pouco deste poder criando passo a passo, um web service do tipo Hello World no JBoss ESB. A grande sacada é que não iremos escrever nenhuma linha de código Java para isso. O JBoss ESB é normalmente criticado por ser um ESB "muit
o atrelado a coisas de JEE", e com este post, iremos provar que isso não é verdade, como é o caso também do Sonic e AquaLogic ESB. Ao final do exemplo, você verá que com um módulo de apenas 3K de tamanho, teremos um endpoint SOAP hospedado no JBoss ESB funcional e operante.

1) Crie um módulo ESB para acomodar os arquivos do projeto

A primeira coisa a se fazer é criar um projeto novo no JBoss ESB. Para isso, basta criar um projeto novo usando qualquer ferramenta que possa criar arquivos e diretórios. O post Integração de Aplicações usando o JBoss ESB pode ajuda-lo a entender um pouco da estrutura de projetos no JBoss ESB. Feito isso, podemos partir para a parte da configuração dos canais de mensagem usados pelo serviço. A figura abaixo mostra a estrutura do projeto final depois de todas as configurações.



2) Crie os canais de mensageria usados pelo serviço

Segue abaixo a configuração do arquivo queue-service.xml que define todas as filas usadas para o processamento das mensagens enviadas ao serviço, e as mensagens geradas pelo serviço para o consumidor (cliente) do mesmo.

3) Crie arquivos XML Schema para definição do contrato do seu serviço

Todo serviço precisa de um contrato. O contrato é todo mecanismo usado para especificar como será dado a troca de informações entre o provedor do serviço e o seu respectivo consumidor (ou grupo de consumidores). No contrato, é definido que informações devem ser passadas para o serviço para que ele faça o que ele se propôe a fazer, bem como que informações esperar do serviço depois de passar as informações necessárias.

Ums serviço é uma unidade lógica e coesa sobre um determinado assunto. Neste caso, a melhor forma de pensar num serviço é num conjunto pequeno e coeso e operações correlatas sobre um determinado domínio. A coesão, granularidade e politicas são fatores importantes a serem considerados no desenho de serviços, mas iremos abordar este assunto em outros posts mais focados no assunto. A propósito, estarei abordando este assunto bem como governança em SOA nas próximas edições da revista Mundo Java, portanto, fique atento as novidades da revista.

No caso do nosso serviço Alô Mundo, iremos definir o contrato das operações de entrada e saída do serviço. Ele terá apenas uma operação chamada 'hello' que irá receber o primeiro e ultimo nome de uma pessoa, e irá responder com uma mensagem simpática contendo o primeiro e ultimo nome passado como argumentos. A listagem abaixo mostram os arquivos XML Schema de definição dos tipos de entrada e saída do serviço, respectivamente.

4) Configure seu módulo ESB com as definições do serviço e contratos

Agora que temos definido os contratos do serviço, é hora de realizar a especificação do serviço em si. Para isso, edite o arquivo META-INF/jboss-esb.xml conforme mostrado na listagem abaixo.

Repare na listagem que existem algumas coisas interessantes e novas pra quem já usa o JBoss ESB. A primeira coisa é que não precisamos definir que o listener do serviço é gateway. Para usuários novos do JBoss ESB, um gateway é a definição de que nosso serviço irá responder para o "mundo externo" através daquele canal de mensageria. Usando o recurso de contracts do JBoss ESB 4.5, podemos facilmente criar web services a partir de qualquer serviço previamente criado no módulo ESB.

A segunda coisa que nota-sa na listagem é que na TAG actions, informamos qual é os arquivos de XML Schema que definem o contrato do serviço. Essa é uma prática interessante para todos os serviços, pois por padrão, todo serviço interno do JBoss ESB possue uma propriedade chamada 'webservice' cujo valor padrão é true. Neste caso, todo serviço do JBoss ESB é em ultima análise um web service. Se você não quiser que um serviço seja exposto como um endpoint SOAP, basta definir 'explicitamente' na TAG actions o atributo webservice como false.

Nosso serviço está pronto pra uso. Vamos passar agora a parte mais interessante: Definir a lógica do serviço sem precisar escrever nenhuma linha de código Java. Digo que isso é interessante pois é um recurso poderoso de um ESB possibilitar este tipo de coisa, mas não ache que escrever código Java para a lógica de um serviço seja algo errado; de fato, em alguns casos, pode ser uma opção bem sensata se por exemplo seu serviço tiver premissas de desempenho críticas. XML é um recurso poderoso para configuração e definição de lógicas, mas é pesado em termos de processamento. Dito isso, considere a escrita de lógicas em XML uma prática interessante mas não imperativa.

5) Crie a lógica do serviço usando apenas transformação de mensagens XML

Para a lógica deste serviço, iremos usar o recurso de Smooks do JBoss ESB. A listagem abaixo mostra como deve ser configurado o arquivo META-INF/smooks-logic.xml.

Na listagem, fizemos a leitura do XML que é enviado pelo consumidor (notamente, um post contendo um XML no padrão SOAP) e gravamos as informações lidas no contexto do Smooks. Feito isso, usando o recurso de FreeMarker (recurso integrado do Smooks), definimos o template do XML que deverá ser enviado de volta para o consumidor em resposta ao pedido de execução. A resposta, é baseada no XML Schema de saída da operação hello, e deve respeitar as regras de definição impostas no arquivo META-INF/helloOutput.xsd.

Uma forma de garantir que o XML definido no template criado está de acordo com o contrato que foi definido via XML Schemas, é usar o atributo validate na TAG actions do seu serviço. O valor padrão deste atributo é false, indicando que uma validação do conteúdo da resposta não será validado junto ao XML Schema. Mas é interessante habilitar este atributo em tempo de desenvolvimento do serviço, para garantir o reforço do contrato, um dos fatores mais importantes na orientação a serviços.

6) Faça o deploy do seu módulo no JBoss ESB e realize um teste!

Simples assim! Nosso serviço está pronto. Crie um módulo ESB deste projeto (um arquivo cuja estensão seja .esb) e faça a instalação do módulo no JBoss ESB. Depois disso, inicie seu servidor e você poderá realizar testes de acesso ao seu serviço. Você com certeza irá perguntar algo óbvio: Mas e o WSDL deste serviço, como tenho acesso para passar aos meus clientes? Bom, você pode fazer isso de duas formas: Acessando a geração dinâmica do WSDL. Para isso, acesse o seguinte endereço:


E você terá acesso ao WSDL do serviço Alô Mundo que acabamos de criar. Repare que a URL foi montada baseado nas informações do nome do módulo ESB criado, bem como as informações da categoria e nome de serviço definido no arquivo META-INF/jboss-esb.xml.

A segunda forma de recuperar o WSDL do serviço, é acessar o WSDL que é gerado automaticamente pelo JBoss ESB. Todo serviço possui um WSDL gerado na seguinte pasta:

$JBOSSESB_HOME$/server/default/data/wsdl

Procure pelo seu projeto ESB criado, ele deverá estar nesta pasta depois que você iniciar seu JBoss ESB. Recuperado o WSDL do seu serviço, você pode facilmente construir clientes para testes do seu serviço. Uma boa ferramenta para testes é o soapUI. Na edição 34 da revista Mundo Java, escrevi um artigo que mostra passo a passo como construir um web service no JBoss ESB (usando uma abordagem baseada em Java + XML) e testar na ferramenta soapUI. Vale a pena conferir!

Boas Integrações ;-)

quinta-feira, 16 de abril de 2009

Integrando Plataformas usando AMQP

Temos hoje várias soluções interessantes no mercado para tratar assuntos sobre mensageria assíncrona e integração corporativa. Alguns bons exemplos de soluções disponiveis são o Websphere MQ da IBM (antigo MQSeries) e o TIBCO Rendezvous. Soluções como estas possibilitam canais de mensageria através de filas distribuidas que conectam aplicações de diferentes plataformas e linguagens. A grande vantagem disso é poder contar com um leque grande de plataformas suportadas sem perder o poder que as soluções dão sobre entrega de mensagens, tolerância a falhas, alta disponibilidade e performance.

Entretanto, como toda solução paga de um fabricante, existe o problema do custo do produto e a "amarração" de parte do negócio de uma organização com o produto do fornecedor, cenário este que pra muitas empresas de hoje, não agrada em nada, pois a cada dia vemos empresas sendo adquiridas por outras e ouvindo desses fornecedores frases do tipo "Ah, mas agora que esse produto foi comprado, não daremos mais suporte a ele nem continuidade, apenas garantir por mais X anos". Não vamos entrar em detalhes de exemplos de empresas que já fizeram isso para não gerar polêmica, mas todos conhecemos bons exemplos ;-)

Como lidar com integração de plataformas distintas usando mensageria assíncrona?

Se formos pensar apenas no mundo Java, temos o JMS (Java Messaging Service) que resolve com maestria todos os problemas de integração através de mensageria sínrcrona e assíncrona existentes, provendo uma infra-estrutura robusta e ao mesmo tempo amigável para desenvolvedores Java. Entretanto, nem sempre lidamos com entrypoints e endpoints Java, porventura temos que lidar com integrações que envolvem plataformas e linguagens diferentes. E neste caso, como lidamos com isso?

Uma forma interessante, é utilizar um barramento de serviços que tenha conectores para as plataformas em questão, e utilizar os recursos de mensageria e roteamento do mesmo para realizar a integração. Mas será que sempre teremos que usar um ESB para resolver este tipo de cenário? É razoável pensar que um ESB merece um cenário muito mais exigente para que ele se pague como solução de EAI, ou seja, um ESB deve ser usado para quando realmente você tenha integração cujo foco final é sustentação de serviços, afinal de contas, ESB é a sigla de Enterprise Service Bus, correto?

Sendo assim, como resolver esta questão? A um tempo atrás, tinhamos o mesmo problema para cenários de integrações baseadas em Remote Procedure Invocation. Quando identificou-se que várias plataformas deveriam poder trocar informações através de chamadas de objetos remotos, criou-se o então conhecido como protocolo IIOP e então a tecnologia CORBA, que possiilita que várias plataformas e linguagens falassem uma lingua franca sobre objetos remotos. Mas para que o CORBA pudesse render bons frutos, foi necessário criar um padrão de linguagem de objetos (IDL) e um protocolo neutro de plataformas para comunicação. O grupo OMG cuidou muito bem destes assuntos por anos, e a prova disso é que temos hoje várias implementações bacanas deste padrão como o JBoss IIOP e o Borland Visibroker.

Seguindo a mesma linha, temos hoje esforços grandes sendo feitos para criar uma notação/protocolo/linguagem franca para integração assíncrona de plataformas distintas que irá possibilitar que vários fornecedores criem soluções para este padrão e oferecer produtos pagos e abertos para questões como essas aos usuários de integração. A grande vantagem disso é a capacidade de usar a tecnologia sem ficar preso a nenhuma solução de um fornecedor específico. Estes esforços estão sendo feitos para sustentar o padrão AMQP, sigla de Advanced Message Queuing Protocol, iniciativa que visa padronizar a forma como aplicações são integradas via mensageria usando uma abordagem padrão de mercado.

Quem trabalha para que o AMQP seja um padrão de mercado de verdade?

O AMQP é um padrão que vem sendo desenvolvido desde 2004 por empresas de grande porte como JPMorgan, CISCO, IONA Technologies, iMatix Corporation, Microsoft, Novel, Rabbit Technologies, Red Hat entre outras gigantes da indústria. Atualmente, o padrão AMQP está na versão 0.10

Como posso desfrutar desta maravilha da área de EAI?

Mesmo que a especificação não esteja terminada, já temos hoje várias implementações deste padrão no mercado. Uma delas, e foco deste post é o projeto Red Hat Messaging. Este projeto, liderado e maturado pela Red Hat, é uma implementação de alta performance e escalabilidade baseada no AMQP.

A grande vantagem desta implementação é o alinhamento total com a especificação do AMQP uma vez que a Red Hat é uma das empresas por trás do padrão bem como a vantagem de ser mantida pela maior empresa open-source do mundo. Existem planos bem interessantes para o Red Hat Messaging, como por exemplo a integração total com o projeto JBoss Messaging. A idéia desta integração é fazer com que a plataforma de JMS tenha como fundação um motor robusto e escalável baseado no Red Hat Messaging, mas sem perder a compatibilidade com o padrão AMQP. Esta integração por hora ainda está imatura, pois a especificação de AMQP ainda está sendo construída, sendo perigoso portanto, criar uma integração que futuramente possa sofrer problemas com as mudanças da especificação.

Neste meio tempo, você já pode contar com uma implementação do Red Hat Messaging que já está sendo usada em produção por um banco de tókio com um cenário de 100 milhões de mensagens executadas por dia sem perda de pacotes ou desempenho (ver maiores detalhes na documentação do RHM). Outra grande vantagem é o suporte que ele dá pras linguagens Ruby, Java, C++, Python e .NET. Em breve suporte a Perl também será dado.

Para saber mais sobre o Red Hat Messaging e até mesmo experimentar algumas coisas, os links abaixo fornecem um suporte e acesso bem legal:

JBoss Messaging and Red Hat Messaging Integration Roadmap

Boas Integrações ;-)