Um dos princípios principais de design de serviço SOA é o princípio de composição de serviço ( https://en.wikipedia.org/wiki/Service_composability_principle ).
A idéia é que, compondo novos serviços usando os existentes como blocos de construção, é possível desenvolver rapidamente novos serviços. Analogamente, como você chama métodos existentes de objetos quando implementa novos métodos. É aqui que parte do aumento da produtividade da SOA deve ocorrer.
Alguém realmente faz isso na prática? Eu tenho visto isso repetido infinitamente em texto escrito, mas não experimentei as implementações do mundo real. A maior parte do texto também omite qualquer menção à manipulação de transações , o que me parece ser o maior obstáculo na realização de serviços de composição.
Primeiro, você realmente precisa resolver o problema das transações antes de poder compor qualquer serviço não trivial. Claro, se o exemplo tiver os serviços "findCurrentTime ()" e "writeLogMessage ()", é fácil não se preocupar com transações, mas não com exemplos do mundo real, como "depositMoney ()" e "retiradaMoney ()".
Conheço duas opções:
- Implementar transações reais com o WS-Atomic Transaction ou
- Implemente uma solução baseada em remuneração que compensa a chamada para A com "cancelA ()" ou algo assim, se a chamada para B falhar
Ambos parecem muito problemáticos / quase inutilizáveis para mim:
- Transação WS-Atomic
- um monte de complexidade, a maioria dos conselhos que eu encontrei apenas adverte "pé no saco, não fazê-lo"
- O suporte é limitado, por exemplo, se você usar ESBs de código aberto, as principais alternativas ServiceMix, Mule ou WSO2 não o suportam
- compensações
- implementar o tratamento de compensações me parece muito complexo. O que fazemos se o serviço A for bem-sucedido e nunca recebermos uma resposta do serviço B e não soubermos se ele falhou ou teve êxito? Manipular essa lógica manualmente (como implementador de serviços de composição) me faz querer cortar meus pulsos - esse é o tipo de trabalho que uma ferramenta deve fazer por mim !.
- Também não vejo como você pode ter métodos de compensação em serviços não triviais. Digamos que seu serviço A seja "depositMoney ()" e que tenha êxito, alguma outra ação transfira o dinheiro rapidamente para outro lugar e, em seguida, recebamos "compensateDepositMoney ()", o que fazemos agora? Parece uma grande lata de vermes.
Para mim, parece que a composição do serviço é um princípio SOA tão fundamental que você realmente não obtém os benefícios do SOA se não puder (convenientemente) compor serviços . Qual é a realidade? 90% dos usuários de SOA usam "SOA criptografado" sem concorrência real de serviço? Ou a maioria dos usuários de fato usa a composição do serviço e estou exagerando a dificuldade?