soa_ SOA Mitos e verdades sob uma ótica técnica Veja alguns mitos e verdades que cercam a arquitetura de software mais famosa S OA é uma realidade. É um estilo arquitetural muito utilizado em empresas dos mais variados segmentos, como telecomunicações, financeiro, governamental, bancário, e mesmo em empresas de internet como Google, Twitter e Facebook. No entanto, ainda há muita confusão em relação a essas implementações, e até mesmo se o que a empresa está utilizando é SOA ou não. Não custa lembrar: o que é SOA? SOA significa Arquitetura Orientada a Serviços, e como todo termo que utiliza “Orientação” coloca algo como centro, SOA coloca serviços como o centro da sua arquitetura de Software. No entanto, a diferença entre SOA e outras arquiteturas é que, na realidade, SOA mira em grandes desafios, ao olhar para a empresa como um todo, e não apenas para um único sistema. Esse olhar faz com que muitas vezes desenvolvedores e até mesmo arquitetos tornem-se “míopes”, ao enxergar apenas uma pequena porção da empresa, e ignorar o todo. Muitos acabam por considerar que criar um web service e realizar a comunicação desse web service com outros setores da empresa faz com que o sistema seja orientado a serviços − SOA. Oras, se um sistema é orientado a serviços, e “orientação” significa focar a aplicação no ponto para a qual é orientada, então, um único serviço exposto / 54 não pode tornar uma aplicação orientada a serviços, certo? Então, quantos serviços a aplicação deve expor? E como? Neste artigo, desmistificarei alguns dos mitos mais comuns encontrados em arquiteturas de mercado, assim como apresentarei alguns termos comumente utilizados em SOA e quais abordagens e ferramentas utilizar em casos específicos. Mito: REST não faz parte de SOA Comecemos pelo princípio: o que faz um serviço ser um serviço? Thomas Erl, em seu livro SOA Principles of Service Design [1], descreve um serviço como algo na qual a orientação a serviços foi aplicada de maneira significativa. A orientação a serviços, por sua vez, é um conjunto de princípios, dentre os quais um dos mais significativos é a presença de um contrato de serviços padronizado. Nos modelos mais tradicionais de SOA, o WSDL é, sem sombra de dúvidas, este contrato de serviços. O WSDL é um documento cujo formato é regido pelo World Wide Web Consortium (W3C), e descreve claramente como utilizar o serviço. Em REST também há um contrato, porém presente de uma maneira mais sutil: o contrato REST Alexandre Saudate | [email protected] | @alesaudate Formado em Sistemas de Informação pela USP. Trabalha com SOA e correlatos desde 2008, e é autor do livro “SOA Aplicado: Integrando com web services e além”, publicado pela Casa do Código. Muito se fala sobre SOA e muitos a usam. No entanto, é comum encontrar equívocos, tanto em termos de implementação quanto conceituais. Este artigo tem como proposta oferecer esclarecimentos a respeito dessas situações. Quando utilizar um ESB? Quando utilizar BPEL? Quando utilizar SOAP e quando utilizar REST? Como desenvolver serviços eficientes, reutilizáveis, escaláveis? Você obterá essas e outras respostas aqui. não é regido por organização nenhuma. o modelo REST surgiu a partir da tese de doutorado do doutor Roy Fielding [2], sendo este um dos autores do protocolo HTTP. Como um dos autores do protocolo mais utilizado no mundo, sua ideia claramente era a de promover a utilização correta do protocolo também entre aplicações, e não apenas para tráfego de páginas web. Esta tese deu “corpo” a quatro elementos fundamentais para os serviços REST: a definição correta de URLs para os recursos (como são chamadas as entidades trafegadas pelo protocolo HTTP, num modelo REST); a definição de quando, e porquê, utilizar os diferentes verbos HTTP existentes para tratar estes recursos; como utilizar os headers HTTP para controlar esta comunicação (por exemplo, os headers Content-Type e Accept para lidar com a tipagem do que está sendo enviado no corpo da requisição); e, finalmente, a utilização de hipermídia (ou seja, formatos como JSON e XML) para fornecer os caminhos a serem seguidos pelo cliente a fim de executar operações similares à que ele se encontra (técnica abreviada como HATEOAS − Hypermedia As The Engine of Application State). Vamos analisar o formato de resposta de um serviço REST (utilizando xML): <people xmlns:ns2=”http://www.w3.org/1999/xlink”> <ns2:link href=”person?page=0” rel=”lastPage”/> <person> <active>true</active> <creationDate>2012-12-02T20:20:05.66302:00</creationDate> <id>1</id> <updateDate>2012-12-02T20:20:06.66902:00</updateDate> <ns2:link href=”1” rel=”portrait” type=”image/*”/> <ns2:link href=”1” rel=”self”/> <name>Smurf Daddy</name> </person> </people> Note que, apesar de não haver definição “formal” quanto ao que deve ser feito, ainda existe uma noção de como utilizar REST nas aplicações. Isto acaba oferecendo a chance de descrever clientes dinâmicos, que podem navegar pelos serviços, a partir de uma URL inicial. ora, este conjunto de informações nada mais é do que um contrato! Muito se especula, ainda, a respeito destas URLs e do formato aceito por elas − 55 \ e, neste sentido, a resposta que parece convergir é a noção de um WADL [4], ou seja, um contrato gerado dinamicamente para fornecer informações (inclusive XML Schemas) a respeito do que deve ser utilizado como entrada e o que deve ser utilizado como saída dos serviços REST. No entanto, vale notar que o uso do WADL não é consensual entre a comunidade, havendo tanto aqueles que concordam que deve ser utilizado quanto aqueles que discordam. À parte, a discussão sobre usar ou não o WADL, REST ainda possui um contrato, e segue as regras da orientação a serviços − sendo, portanto, um modelo de serviços. Sendo assim, serviços REST também podem fazer parte de SOA. Mito: ESB é a sigla para Enterprise Spaghetti Box Muito se discute, também, a respeito da utilização de ESBs, originando inclusive a piada descrita no título deste tópico (tradução: “Caixa de Espaguete Empresarial”). Um fato é que a utilização incorreta, de qualquer ferramenta, leva a verdadeiros pesadelos para qualquer pessoa. ESB, o Enterprise Service Bus, não foge à regra. No entanto, sua utilização ideal é para realizar mapeamentos entre protocolos distintos e para monitorar o tráfego entre aplicações, com todas as suas implicações. Idealmente, o ESB compreende, por si só, um padrão de projeto SOA. Este, por sua vez, compreende diversos padrões de integração (fato que, aliás, discutirei no mito “Eu preciso de muitas ferramentas para ter SOA”). Estes padrões podem ser vistos no livro de Gregor Hohpe e Bobby Woolf, Enterprise Integration Patterns [3], ou no site http://eaipatterns.com/. É fato, muitos usam ESBs para funcionalidades que não lhe compreendem. Situação: o Oracle Service Bus, por exemplo, possui uma funcionalidade chamada split-join, que é utilizada para realizar tratamentos complexos de mensagens e para atender, como diz o nome, os padrões Splitter [3] e Aggregator [3]. No entanto, sua utilização remete ao uso de BPEL (visto no mito “BPEL serve para modelar processos de negócio”), o que leva alguns a colocarem as mesmas funções que colocariam em BPEL no próprio ESB, formando... bem, um espaguete. OK, neste caso, para quê serve um ESB? A função do ESB é receber chamadas e realizar tratamentos em cima das requisições. Estes tratamentos incluem ler o conteúdo desta mensagem e realizar diversas operações, como reescrevê-la (a fim de criar compatibilidade para alguns serviços), realizar roteamentos (uma única invocação a um serviço no ESB pode gerar várias requisições para vários serviços diferentes), realizar tradução entre protocolos (o ESB pode receber uma chamada SOAP e invocar um ser- / 56 viço REST, ou escrever o conteúdo num arquivo CSV) etc. Além disso, o ESB pode (e deve!) monitorar a saúde da arquitetura a partir dessas requisições. Se o ESB estiver fazendo o meio de campo na comunicação entre dois serviços, ele oferece a capacidade de monitorar qual tem sido o tempo de resposta das aplicações, qual porcentagem teve falha etc. Dessa maneira, ele elimina (ou reduz) a necessidade de se ter softwares de monitoramento específicos como o Nagios [5]. O ESB também pode atuar preventivamente para impedir que um serviço fique “afogado” em requisições e acabe parando de responder. Essa técnica é conhecida como throttling, e é implementada de maneira que o ESB salva as requisições que chegarem em excesso no disco. Conforme o serviço subsequente for respondendo, essas requisições são entregues. Mito: implementar SOA custa muito caro! Neste caso, existe uma parcela de mito e uma parcela de realidade, variando de acordo com diversos fatores: »» Adoção de ferramentas open-source ou proprietárias. »» Facilidade de uso dessas ferramentas, assim como a qualidade destas. »» Conhecimento da equipe sobre técnicas e padrões SOA. »» Implementação da arquitetura in-house ou terceirizada. »» Conhecimento do negócio. »» Burocracias internas da empresa. Quanto à adoção de ferramentas, há muito espaço para discussão, já que há muitas ferramentas open-source excelentes e há muitas ferramentas proprietárias também excelentes. No entanto, também existem as ferramentas medíocres − sendo que, no mundo Java, somos familiarizados com isso (quantos Application Servers você conhece que são bons, e quantos são medíocres?). O diferencial está tanto no custo dessas ferramentas quanto no retorno proporcionado (o famoso ROI − Return on Investment). Além disso, geralmente existe necessidade de treinamento no uso destas e, quanto a isso, existem prós e contras na adoção tanto de ferramentas proprietárias quanto open-source. No caso de ferramentas proprietárias, geralmente a própria fabricante oferece treinamentos − que são caros, porém, fáceis de serem agendados e, eventualmente, podem ser oferecidos na própria empresa contratante. Já no caso de open-source, geralmente existem maiores dificuldades em relação a isso. Obviamente, existem fabricantes que oferecem cursos (como é o caso da Red Hat, por exemplo) − no entanto, a regra geral para ferramentas open-source é que, caso você queira obter treina- mento, deve confiar em escolas que não pertencem à própria fabricante. Quanto à facilidade de uso e qualidade, ferramentas com poucos bugs (não existe software sem bugs, apenas software com bugs que não percebemos!) nutrem um bom andamento do projeto − consequentemente, menos dinheiro gasto com horas extras. Além disso, ferramentas assim também costumam ser mais fáceis de serem utilizadas − o que se reflete em menores custos com treinamento, resolução de problemas etc. Mito: eu preciso de muitas ferramentas para ter SOA Esta é, talvez, a maior falácia pregada mundo afora quando falamos de SOA. Muitas pessoas (algumas dessas, inclusive, muito esclarecidas a respeito de tecnologia como um todo) acreditam que, sem ESB, BPEL, BRMS etc., não é possível implementar SOA com sucesso − argumento que, aliás, muitos têm usado a favor de REST. Vamos aos fatos: SOA não é composto de ferramentas ou tecnologia (tem um lado voltado à análise e modelagem, mas não à metodologia). SOA é composto de técnicas de desenvolvimento que têm o objetivo comum de flexibilizar uma arquitetura corporativa (veja bem: estou falando, aqui, de um conjunto de vários sistemas, e não de apenas um). Segundo Carl August Simon, estudioso do assunto: “A service-oriented architecture (SOA) is the organizational and technical framework that enables an enterprise to deliver self-describing, platform-independent business functionality and make it available as building blocks of current and future applications.” Tradução: uma arquitetura orientada a serviços é um framework organizacional e técnico que habilita a empresa a entregar funcionalidades de negócio autodescritas e independentes de plataforma, e torná-las disponíveis como blocos de fundação para aplicações correntes e futuras. Moral da história: SOA apresenta técnicas e melhores práticas, mas não te diz como fazer. Há um fundo de verdade quando dizem que as implementações atuais, em muitos lugares, tendem a encarar SOA como o simples uso de ESB, BPEL e outras ferramentas correlatas. Esta definição não poderia estar mais errada. SOA, por definição, compartilha alguns dos conceitos de integração pura. No entanto, não cabe dizer que SOA é um modelo de integração, ou que integração contém SOA etc. A única coisa que podemos afirmar é que existe um subconjunto de características de SOA que também estão presentes em um subconjunto de características de integração. Algumas dessas características são, por exemplo, a comunicação entre aplicações distintas, e alguns Enterprise Integration Patterns bem conhecidos (ver [3]). Estes são, especificamente, adotados pelo ESB, que por si só, representa um design pattern SOA. No entanto, um ponto em que as duas coisas diferem radicalmente é a abordagem. SOA procura desacoplar ao máximo uma aplicação de outra, para promover APIs que sejam reutilizáveis. Perceba o contraponto em relação à integração pura de sistemas: não existe a preocupação na reutilização, apenas a comunicação pura e simples. Onde integração trata de questões com simples comunicação ponto-a-ponto, em SOA existe mais uma preocupação em deixar a API suficientemente flexível. Neste ponto entram, muitas vezes, as ferramentas: nem sempre é possível deixar um sistema compatível com outro sem intervenção externa. Ou então, pode ser necessário consultar uma sequência de serviços para obter os dados necessários para consumir um determinado serviço. Por ter essa característica de flexibilização, SOA aborda essas ferramentas externas. Note, no entanto, que essas ferramentas não tiveram origem em motivações excusas, como a criação de um modelo para, depois, vender ferramentas que atendam a esse modelo. Um exemplo disso é o próprio Thomas Erl, que escreveu um dos catálogos de design patterns SOA, que compreende composição de serviços (BPEL) e disponibilização de serviços (ESB). A empresa que Thomas possui, a SOA Systems, não desenvolve qualquer ferramenta − ao contrário, promove a agnosticidade de fornecedor. As ferramentas tiveram, portanto, fundamentação legítima. Vale lembrar que o uso destas depende, também, de bom senso. Não se usa frameworks em Java (ou qualquer outra linguagem) sem uma motivação legítima − então, por que alguém haveria de usar ferramentas sem sequer ter necessidade de utilizá-las? Mito: BPEL serve para modelar processos de negócio Esse é outro erro comumente cometido. Obviamente, BPEL (Business Process Execution Language) é muito semelhante, na aparência, a ferramentas de BPM (Business Process Modeling). No entanto, o formato (e necessidade) difere radicalmente, no sentido de que BPEL é mais adaptado para trabalhar com a pura integração entre serviços (e com todas as necessidades que advêm disso); sendo que BPM e correlatos são claramente utilizados para modelar serviços estratégicos. Façamos uma revisão de BPEL: BPEL apresenta uma linguagem (definida em XML) para que seja possível descrever interações entre serviços através de formatos agnósticos (ou seja, não se comunica apenas com web services Java, ou .NET, ou qualquer 57 \ outra linguagem). Esta linguagem executa processamentos muito semelhantes ao desenvolvimento de sistemas em linguagens de programação, com escopos, variáveis, captura e tratamento de falhas etc. Ou seja, é uma ferramenta tipicamente adaptada para ser utilizada por desenvolvedores e arquitetos, devendo ser ignorada por áreas de negócios. Você pode conferir detalhes de como a modelagem é feita com essa ferramenta na figura 1. Figura 1. Exemplo de modelagem no Oracle BPEL. Foto: docs.oracle.com Já o BPM é definido em termos de uma notação específica, a BPMN (Business Process Modeling Notation). Essa notação é, claramente, utilizada para trabalhar com interações entre humanos (inclusive, descrevendo papéis específicos) e a interação entre eles. Aliás, existem definições específicas para processos descritos utilizando a notação que são automatizadas e os que não são, sendo chamados de modelos concretos e abstratos, respectivamente. Na figura 2, você confere um exemplo de modelagem feita com o Oracle BPM – uma entre várias ferramentas desse segmento. Figura 2. Modelagem realizada com o Oracle BPM. Foto: docs. oracle.com Note que o papel do BPM é mais estratégico. Em relação a funcionalidades, efetivamente estas se confundem (principalmente depois que a interação com / 58 humanos foi absorvida por WS-*, na especificação WS-HumanTask). No entanto, mesmo que eles possuam as mesmas funcionalidades, nota-se (de longe!) que ainda não têm o mesmo propósito. Como quase tudo em TI é uma questão de bom senso: utilize a ferramenta certa para a coisa certa. Mito: Web Services tradicionais são muito difíceis de utilizar. REST é muito melhor. Neste ponto, existe um fundo de verdade. No entanto, quero apresentar um ponto de vista que, segundo minha experiência, muitos desenvolvedores não notam. É fato, WSDLs não são feitos para serem lidos por seres humanos. Sim, são contratos complexos e não há maneiras de facilitar isso no mundo dos web services tradicionais. No entanto, certos desafios são presentes em muitas empresas: »» Utilização de Single-Sign On entre aplicações. »» Cenários complexos de busca de informações, com passagens de vários parâmetros. »» Exposição de algoritmos complexos entre aplicações. »» Busca de dados binários, como fotos, documentos em formatos proprietários etc. »» Criação de comunicações assíncronas. Estes desafios certamente não são facilmente “transponíveis” em qualquer modelo. No entanto, alguns destes problemas são mais facilmente resolvidos em cenários SOAP+WSDL, e outros são mais facilmente resolvidos em cenários REST. Vamos estabelecer comparações: O Single-Sign On Este problema é razoavelmente fácil de compreender: existe uma autoridade, em algum ponto, que é considerada confiável tanto pelo provedor do serviço quanto pelo cliente. Quando o cliente quer fazer uma requisição para o serviço, ele entra em contato primeiro com essa autoridade considerada confiável, para que a mesma emita um token, ou seja, uma informação que identifique aquele cliente perante o serviço, sem revelar, no entanto, usuário/senha, e com tempo de expiração predeterminado. Uma vez obtido esse token, o cliente faz a requisição para o serviço fornecendo o token. O serviço faz, então, a verificação junto à entidade confiável a respeito dos dados que esse token representa − o login do usuário, seu nome, preferências de uso etc. Um ponto importante: o mesmo ticket pode ser utilizado em diversos serviços distintos, caracterizando o Single-Sign On (conforme visto na figura 3). Figura 3. Requisição Single-Sign On. A WS-Security (e especificações correlatas) resolve este problema de maneira nativa, através de tokens SAML − Security Assertion Markup Language e tickets Kerberos. As duas especificações resolvem o problema de maneiras diferentes − fornecendo, portanto, abordagens distintas. Além disso, é possível trabalhar com tickets customizados e continuar utilizando a especificação. Um problema com essa abordagem é recorrente em praticamente todas as especificações WS-*: é difícil resolver este problema. Existem poucas ou nenhuma ferramenta que resolva o problema de forma satisfatória, sendo que a descrição da comunicação deve ser incluída tanto no WSDL quanto nos clientes, serviços e servidor de confiança. Em REST, existem duas abordagens distintas para a resolução do problema: uma, através de headers customizados no HTTP, contendo o ticket ou token a ser utilizado; ou utilizando a especificação oAuth. Problemas existem, no entanto, com ambas as abordagens. o problema com os headers customizados é que, por eles possuírem essa abordagem customizada, eles não são padronizados. ou seja, deve-se estabelecer um acordo entre todas as aplicações participantes para que elas possam detectar o header customizado − o que pode ser impraticável, dependendo do número de aplicações envolvidas e da burocracia envolvida. OAuth Authentication Flow Figura 4. Fluxo de autenticação OAuth. Foto: cloudspace.com 59 \ Além disso, é de senso comum que algoritmos desenvolvidos “em casa” quase sempre não demonstram o mesmo nível de proteção do que algoritmos testados e provados pelo próprio mercado, em diferentes cenários. Ou seja, headers customizados têm grandes chances de não apresentarem boa segurança. Outra abordagem é o uso de OAuth. No entanto, esta especificação não é própria para resolução do problema de Single Sign-On, pois tem como objetivo um problema diferente. O OAuth foi desenvolvido para atender o contexto de aplicações distintas na web − que, portanto, não têm conhecimento umas das outras. A sistematização é distinta: o cliente (ou seja, a pessoa que está operando um browser) deseja autorizar uma aplicação (A) que ele já está utilizando para acessar dados de outra aplicação (B) na web. Neste caso, A redireciona este cliente para uma página de login/senha de B, junto com os escopos que deseja acessar. Se o cliente fizer esta autorização, utilizando seu login e senha, B envia para A um token de liberação de dados nestes escopos. Você pode visualizar este fluxo na figura 4. Note que não é um problema de Single Sign-On, já que, para cada aplicação externa que A desejar acessar, deverá ser fornecida uma autenticação diferente (ou seja, não é um “único” Sign-On, mas vários). Conclusão: WS-* fornece mecanismos melhores para trabalhar com cenário de login único em várias aplicações, ainda que seja complexo de ser realizado. desta maneira, mas visualize uma simples busca por exemplos em REST. Agora visualize uma busca por exemplos em que o “exemplo” tenha vários campos: GET /pessoa?nome=Alexandre&sobrenome=Sau date&anoNascimentoInicial=1990&... Note que este é um problema não somente estético, mas também de limitações no próprio método GET. Apesar de não ser um limite oficial, a alguns browsers trabalham com query strings limitadas. Nos tempos de hoje este limite é extremamente alto, tornando (talvez) esta preocupação desnecessária. No entanto, vale notar que a mesma limitação também existe em alguns mecanismos de consumo de URLs, de maneira programática. Ou seja, este problema pode tanto adicionar um problema estético quanto algo que realmente é motivo de preocupação. Obviamente, outros métodos HTTP podem ser utilizados para consumo de informações − o que, no entanto, descaracterizaria o uso destes métodos HTTP. Já com SOAP, este problema simplesmente não faz sentido: o método padrão para transporte de informações é POST, que não apresenta estas limitações. Ponto para SOAP/WSDL. Exposição de algoritmos complexos entre aplicações Costumo comentar com algumas pessoas que REST, apesar de ser simples tecnicamente falando, transfere a complexidade para questões relacionadas Cenários complexos de busca de à modelagem. Explico: tome como exemplo um algoritmo complexo, multiparâmetros, que também deinformações Outro problema comum em cenários REST é o tra- volva muitas informações. Para exemplificar, usarei tamento de queries. Pode parecer estranho, tratando um serviço (hipotético) de consulta de informações em órgãos de proteção ao crédito. Esta consulta de informações deve gerar um log de completude, após a solicitação. Além disso, o serviço também deve agrupar informações de dois ou mais serviços de crédito. BPEL versus REST (ou orquestração versus O log, informando que a consulta foi completada, será coreografia) utilizado para cobrar o requisitante das informações. Em REST, isto poderia ser modelado de várias BPEL, por definição, implementa o conceito de maneiras distintas. A primeira destas maneiras seria orquestração de serviços, ou seja, de realizar coagrupar essas requisições em um serviço unificado, municação com serviços heterogêneos (seja Java, que faria essas requisições por si só. Mas, por ser um .NET etc.). Além disso, o próprio conceito de BPEL serviço de consulta e seguindo os preceitos de REST, representa uma máquina de estados persistente, ele deveria usar GET. No entanto, este serviço gera o capaz de desfazer e refazer sequências de procedilog, que será utilizado para gerar uma cobrança. Pelo mentos. Existe ao menos uma contrapartida para fato de GET ser “idempotente” (ou seja, nenhuma esse conceito em REST; no entanto, ainda não são requisição pode alterar o estado do servidor), não é ferramentas amplamente adotadas e testadas − ao recomendado que se utilize este método. Se ele utimenos, não no Brasil. Ou seja, na prática, REST lizar POST, fere os conceitos de REST, por não estar ainda não tem nenhuma ferramenta de orquescriando nenhum recurso (e isso vale para outros métração, apenas de coreografia − que não persiste todos HTTP). estados e tende a realizar comunicação em nível Estas requisições também poderiam ser feitas sede código, resultado em serviços mais simples. paradamente pelo cliente. Mas ele poderia burlar a cobrança, fazendo as requisições de consulta aos ser/ 60 viços de proteção e deixando de fazer a criação do log de consultas. Além disso, note que existe um componente transacional: os dados não podem ser retornados sem a criação do log e, se o log for gerado, o cliente deve obrigatoriamente ter acesso aos dados criados. Para resolver este problema, então, poderia ser possível modelar a consulta em si como um recurso e fazer este serviço ser assíncrono (entrarei em detalhes sobre esse aspecto mais à frente). Neste caso, o cliente criaria uma requisição de consulta em um serviço e receberia o resultado apenas quando tudo estiver concluído. No entanto, ainda corre o risco do gerenciamento do workflow − tudo deve ser persistido de alguma forma, caso contrário, corre-se o risco de criar o ticket com a requisição do cliente e perder dados. Desta forma, note que foi gerada uma complexidade substancialmente maior para contornar o problema. No mundo dos web services tradicionais, existem duas formas de resolver o problema: pode-se encapsular as chamadas ao serviços de log e realizar as chamadas a essa cápsula, ao invés de ao serviço em si. A questão da geração dos dados poderia ser resolvida, então, utilizando WS-AtomicTransaction (ou WS-BusinessActivity). Assim que a requisição fosse concluída, a transação seria dada como concluída também. Se o cliente não receber os dados, a transação sofre rollback, os logs não são escritos e fim da história. Neste caso, ainda existe o risco da máquina que estiver executando a operação sofrer algum desastre (falha de hardware, falha da rede elétrica etc.). Neste caso, é possível coordenar as atividades utilizando BPEL, que irá salvar todas as operações efetuadas em banco de dados. Neste caso, se qualquer coisa inesperada acontecer, é possível retomar as atividades do ponto onde elas pararam em um segundo momento, ou mesmo enviar uma requisição para a engine BPEL para refazer a operação. Tráfego de dados binários Considere um cenário de inclusão de fotos em um banco de dados. Serviços SOAP endereçam essa questão através da definição de tipos especiais num XML Schema, base64Binary ou hexBinary. Como os nomes indicam, os dados têm que ser codificados em Base64 ou hexadecimal e passados, portanto, como texto. Isso acrescenta um overhead, segundo estudos, de cerca de 33% no tamanho da mensagem. Outras técnicas foram desenvolvidas para endereçar essa questão, como Soap with Attachments. No entanto, esta técnica foi preterida em favor de MTOM/XOP (Message Transmission Optimization Mechanism/XML-binary Optmized Packaging). O mecanismo geral dessa técnica consiste em passar os dados binários “separados” da mensagem SOAP (sendo que esta carrega uma referência para os dados binários). Todos os dados são enviados em uma única requisição HTTP, utilizando uma técnica conhecida como Multipart HTTP. Esta técnica consiste em passar os dados numa única requisição contendo MIME Types diferentes para cada parte envolvida. Através dessa técnica, o MTOM pode referenciar outra parte contida no HTTP sem prejuízos: os dados binários podem ser trafegados em sua forma binária. Já em REST, os dados sempre podem ser trafegados em sua forma “nativa”, ou seja, basta ajustar os MIME Types corretamente e enviar os dados binários, sem envelope. A escolha entre uma ou outra técnica acaba recaindo sobre os metadados que podem acompanhar estes dados binários. Utilizar um envelope SOAP pura e simplesmente para trafegar dados binários não compensa, mesmo utilizando MTOM. No entanto, ao utilizar esta técnica, o envelope também pode carregar metadados complexos, que é algo que REST não conseguiria fazer, já que os metadados teriam que ser trafegados em headers HTTP. Obviamente, existe sempre a condição de adotar práticas semelhantes ao SOAP, como trafegar os dados binários codificados em XML em um serviço REST − o que não compensa, pelas razões explicitadas acima. Conclusão: esta é uma decisão que deve ser tomada com muito cuidado, já que um envelope SOAP pode tornar o tráfego destes dados muito pesado. No entanto, a mensagem SOAP pode carregar tanto os dados binários quanto metadados complexos − em contrapartida ao REST, que pode carregar apenas metadados simples. Comunicações assíncronas Quando uma comunicação assíncrona é estabelecida (em qualquer mecanismo, seja ele qual for), um remetente deve ser enviado em conjunto com a mensagem, para que o destinatário da mensagem saiba para quem responder, quando completar a requisição. Isso é verdade tanto para web services quanto para JMS e outros mecanismos assíncronos. Os web services tradicionais resolvem esta questão através de uma especificação chamada WS-Addressing, que resolve esta questão através da padronização de endereços de web services. Esta padronização envolve a passagem de endereços (em headers SOAP, por exemplo) e um trecho de XML chamado Endpoint Reference, que especifica qual portType e service (especificados em um WSDL) devem ser invocados no retorno da mensagem. Obviamente, um web service deve ser criado para receber o retorno das mensagens. Em REST, esta questão é mais simples; no entanto, não há padronização alguma. Por exemplo, é possível enviar, em um header HTTP, o endereço para o qual o retorno de uma mensagem deve ser envia61 \ Não apenas as grandes empresas não estão fugindo de SOA, como a adoção tem sido incentivada por empresas como a Amazon. Em um post do site highscalability.com (especificamente http://highscalability.com/amazon-architecture), é explicitado o uso de SOA por parte da Amazon em diversos formatos. O site dodgycoder.net (http://www.dodgycoder. net/2012/04/scalability-lessons-from-google-youtube.html) resumiu o texto da seguinte forma (tradução livre): “A arquitetura da Amazon é fracamente acoplada e construída em torno de serviços. SOA deu a eles o isolamento que permitiria construir muitos componentes de software rapidamente e independentes uns dos outros, permitindo lançamento rápido. A aplicação que renderiza as páginas web da Amazon.com é um application server. Assim como as aplicações que servem as interfaces de web services, a aplicação de serviço ao consumidor, e a interface de vendas. Abra seu sistema com APIs e você criará um ecossistema em torno da sua aplicação. Organização em torno de serviços te dá agilidade − você pode fazer coisas agora em paralelo porque a saída de tudo é um serviço. Proíba acesso direto ao banco de dados pelos clientes. Isto significa que você pode tornar seu serviço escalável e mais confiável sem envolver seus clientes. Isto é muito parecido com a habilidade do Google de distribuir melhorias independentemente da tecnologia para benefício de todas as aplicações.” Figura 5. Tendências de empregos com SOA. Figura 7. Tendências de emprego com BPEL. Figura 6. Tendências de empregos com ESB. Figura 8. Tendências de emprego com REST. do. No entanto, este header não é padronizado, o que pode gerar conflitos em empresas dependendo do cenário de utilização de cada um. Além disso, também não há especificação em relação ao formato de retorno − algo que, obviamente, pode ser mais ou menos trivial de lidar. Conclusão: os serviços REST possuem um formato mais simplificado de tratar esta questão; no entanto, sem padronização − o que pode ou não ser um problema. Resultado geral Em geral, a simplicidade de serviços REST pode servir para muitos cenários. No entanto, deve-se ter em mente que REST ainda não possui contrapartidas para o que existe em WS-*, devendo ser considerado caso a caso. Há cenários, obviamente, em que REST é melhor do que SOAP, e vice-versa. Há de se ter bom senso em relação à escolha de um em detrimento ao outro. Mito: grandes empresas estão fugindo de SOA (ou: SOA está morto/morrendo) / 62 No Brasil, a impressão que alguns profissionais têm (este autor incluído) é de que a adoção de SoA ainda é pequena em comparação com países como EUA, Canadá e alguns europeus. No entanto, este cenário ainda tende a evoluir. Gráficos do site indeed. com, vistos nas figuras 5, 6, 7 e 8 mostram ligeira queda, apenas neste ano. Nota-se que esta queda pode ser atribuída à crise europeia, posto que SoA é um conjunto de técnicas elaborado para “alavancar” negócios − algo que tende a ser mais conservador em tempos de crise. Porém, no geral, nota-se que tem havido uma retomada, ainda que tímida. Mito: SOA não é escalável SoA, por si só, não tem por objetivo promover a escalabilidade. No entanto, algumas técnicas envolvidas acabam promovendo a escalabilidade. Por exemplo, dentre as técnicas que definem um serviço, está a não-manutenção de estado do mesmo (em outras palavras: serviços não devem ter estado − invocações sequenciais devem ser independentes de invocações prévias). Esta técnica acaba promovendo a arquitetura shared- nothing, que, por definição, é uma arquitetura em que nenhum dos nós envolvidos em processamento conversam uns com os outros. Isso faz com que a escalabilidade horizontal (ou seja, através da adição de mais máquinas) seja trivial. Uma contrapartida a sistemas de arquitetura shared-nothing são alguns Application Servers que, por exemplo, habilitam opções de “sticky sessions”. Isso faz com que uma mesma sessão de usuário fique sempre associada a um mesmo servidor, por exemplo. ou seja, caso um servidor apresente problemas, todos os clientes associados ao mesmo também terão problemas − mesmo que outros clientes acessem corretamente o sistema. Igualmente problemático é ter sistemas com compartilhamento de sessão habilitado entre os nós. Tome uma arquitetura JEE que contenha Stateful Session Beans, por exemplo. Nota-se que, a cada cliente novo para um EJB assim, uma nova instância do EJB deve ser criada. Caso ocorra de a requisição do cliente cair em outro nó do sistema, a instância deve ser transferida para o novo nó − onerando a rede. A intenção de uma arquitetura shared-nothing, portanto, vai evitar estas técnicas a fim de que uma requisição possa ser atendida por qualquer dos nós do cluster. Note que não é fácil, no entanto, atingir este nível, posto que as instâncias de banco de dados também deve ser shared-nothing para que o todo possa ser (sendo que, quando o banco de dados é compartilhado entre os nós, a arquitetura recebe o nome de shared-disk). É mais fácil atingir esse estado com determinados bancos NoSQL, pois alguns (como Cassandra, por exemplo) são independentes de prati- camente todos os outros nós, fazendo com que a escalabilidade seja promovida. Note também que uma arquitetura shared-disk ou shared-nothing também é ideal para uso em cloud computing, razão pela qual temos visto cada vez com mais frequência os dois termos associados. Cloud computing promove a elasticidade no uso de máquinas (mais ou menos máquinas de acordo com a demanda), o que faz com que os sistemas nela colocados sejam adequados apenas se tiverem um desses dois tipos de arquitetura, que são ideais para SoA. Mito: SOA é um termo inventado para “vender” Um fato: SoA catalisou a venda de diversos tipos de ferramentas associadas a esta arquitetura. No entanto, SoA não foi inventada para promover estas ferramentas, é apenas uma evolução natural da computação como a conhecemos. Analise a linha temporal da figura 9: Figura 9. Unidades de reúso em software ao longo da história. Note que o mecanismo de reutilização vai se adaptando conforme o nível dos desafios enfrentados. Reúso através de serviços não fazia o menor sentido nos anos 60. Hoje, não faz o menor sentido ter reúso através de funções (apenas). o tamanho dos problemas que enfrentamos vai se adaptando conforme o tempo. Provavelmente, daqui a 40 ou 50 anos teremos algum mecanismo ainda melhor do que serviços para termos reúso de sistemas em nossas empresas. No entanto, hoje, o que temos de mais adequado para isso é o uso de web services (sejam eles WS-* ou REST). As ferramentas que seguiram a criação dos serviços foram, sim, muito oportunas. Algumas dessas ferramentas têm seu uso justificado; outras não. Se o uso de uma ferramenta é ou não justificado dentro de uma empresa, cabe à mesma decidir − não ao vendedor. Verdade: nem todo mundo precisa de SOA Isso é um fato. SoA é um conjunto de técnicas elaborado para promover reúso de sistemas − e talvez uma empresa seja tão pequena que não tenha sistemas que precisem ser reutilizados. ou talvez seus sistemas já sejam bem integrados com outras técnicas. ou os sistemas da empresa sejam um único monolito, 63 \ que funciona bem e não precisa ser reposto. Obviamente, um discurso de vendas não dirá isso. Mais uma vez, cabe à empresa decidir se precisa de SOA ou não − e, se precisar, também cabe à mesma decidir quais tecnologias utilizar para isso. Verdade: SOA não dá resultados imediatos Evidentemente, resultados de reúso não aparecem imediatamente. Pense num sistema que utilize objetos: se vários módulos de um mesmo sistema orientado a objetos utilizam um mesmo algoritmo, mas este algoritmo está espalhado em diversos pontos do código, a refatoração do sistema para concentrar este algoritmo em um único ponto não dará resultados imediatos, mas o contrário − um ou mais programadores terão necessariamente que perder tempo refatorando os pontos onde este algoritmo é invocado para redirecionar estas chamadas para o ponto em comum. Esta tarefa, mesmo que concentrada em um único sistema, pode ser extremamente demorada, em termos de dias e até mesmo semanas. Com SOA não é diferente, sendo que SOA trata de escopos maiores, de integração entre vários sistemas. Obviamente, o resultado visto não será imediato; ao contrário, custará tempo e dinheiro. No entanto, assim como refatorações dentro de um mesmo sistema demonstram seus benefícios através da manutenção do mesmo, que se torna mais simples e agradável, assim é com empresas que adotam SOA. Muitos programadores já devem ter visto (assim como você, leitor) empresas que são intolerantes em relação a refatorações em seus sistemas. Para essas empresas, o que importa é apenas a “completude” da tarefa, não importa como (vide “metodologia” Go Horse [6]). Se sua empresa adota esta “metodologia”, não adianta considerar que a adoção de SOA terá sucesso, já que neste tipo de metodologia, não há espaço para testes de nenhuma natureza. Assim como desenvolvimento de sistemas, o desenvolvimento de serviços para estes sistemas também passam por testes. é considerada em grandes empresas. Obviamente, muitas vezes realmente não há a necessidade de se adotar essa técnica; no entanto, também muitas vezes existe a necessidade de adotá-la e isso não é feito por fatores culturais ou mesmo preconceito − não por embasamento técnico. Este artigo não se propôs a elucidar questões técnicas, principalmente por motivos de espaço. No entanto, serve para que você, leitor, saiba que muito do que é pregado em conversas com outras pessoas de TI não é verdade. Espero, assim, que possamos diminuir os preconceitos que, infelizmente, ainda circundam SOA no mundo. /para saber mais > Como descrito na minha biografia, eu sou o autor de um livro chamado “SOA Aplicado: Integrando com web services e além”, publicado pela Casa do Código. O livro aborda desde a criação de web services (clássicos e REST) até temas como BPEL, ESB e Cloud Computing. Tudo de uma forma prática, onde o leitor tem a exata noção de como e por que utilizar estas ferramentas. > O livro pode ser encontrado no site da Casa do Código: http://www.casadocodigo.com.br/products/livro-soa-web services. /referências > [1] SOA Principles of Service Design. Thomas Erl. Prentice Hall, 2007. > [2] Tese de Roy Fielding sobre REST − http://www.ics.uci. edu/~fielding/pubs/dissertation/top.htm > [3] Catálogo de EAI Patterns − http://www.eaipatterns. Considerações finais Neste artigo, pudemos contemplar alguns dos mitos e verdades que rondam a Arquitetura Orientada a Serviços (SOA). Foi possível contemplar qual é o papel de REST em SOA, quando utilizar WS-* em detrimento a REST, quando e como utilizar ferramentas como BPEL, BPM e ESB, e assim por diante. Vimos neste artigo que nem tudo o que parece, em SOA, é. Ainda existem muitos mitos a respeito dessa questão (ver [7]) muitas vezes por pura falta de conhecimento de tomadores de decisões nas empresas, sendo que a adoção de SOA muitas vezes só / 64 com/ > [4] REST em Java: chegou a hora do WADL no JAX-RS? − http://www.infoq.com/br/news/2012/11/rest-wadl-jaxrs > [5] Nagios – http://www.nagios.org/ > [6] Go Horse Process − http://www.gohorseprocess.com. br/ > [7] Os mitos do SOA − http://www.aqueleblogdesoa.com. br/2009/05/os-mitos-do-soa/