Uno de los principales principios de diseño del servicio SOA es el principio de Composabilidad del Servicio ( https://en.wikipedia.org/wiki/Service_composability_principle ).
La idea es que al componer nuevos servicios utilizando los existentes como bloques de construcción, uno puede desarrollar rápidamente nuevos servicios. De forma análoga a cómo llama a los métodos existentes de objetos cuando implementa nuevos métodos. Aquí es donde se supone que proviene gran parte del aumento de la productividad de SOA.
¿Alguien realmente hace esto en la práctica? He visto esto repetido infinitamente en texto escrito, pero no he experimentado implementaciones de trabajo en el mundo real. La mayor parte del texto también omite cualquier mención del manejo de transacciones , lo que me parece ser el mayor obstáculo para realizar servicios componibles.
Primero, realmente necesita abordar el problema de las transacciones antes de poder componer cualquier servicio no trivial. Claro, si el ejemplo tiene los servicios "findCurrentTime ()" y "writeLogMessage ()", es fácil no preocuparse por las transacciones, pero no cuando se tienen ejemplos del mundo real como "depositMoney ()" y "retirewMoney ()".
Sé de dos opciones:
- Implemente transacciones reales con WS-Atomic Transaction o tal
- Implemente una solución basada en compensación que compense la llamada a A con "cancelA ()" o somesuch si falla la llamada a B
Ambos me parecen muy problemáticos / casi inutilizables:
- Transacción WS-Atomic
- una gran cantidad de complejidad, más consejos que he encontrado simplemente advierte "dolor en el culo, no lo hagas"
- el soporte es limitado, por ejemplo, si toma ESB de código abierto, las principales alternativas ServiceMix, Mule o WSO2 no lo admiten
- compensaciones
- implementar el manejo de compensaciones me parece muy complejo. ¿Qué hacemos si el servicio A tiene éxito y nunca recibimos una respuesta del servicio B y no sabemos si falló o tuvo éxito? Manejar dicha lógica manualmente (como implementador de servicios de composición) me hace querer cortarme las muñecas: ¡este es el tipo de trabajo que algunas herramientas deberían hacer por mí!
- Tampoco veo cómo puede tener métodos de compensación en servicios no triviales. Digamos que su servicio A es "depositMoney ()" y que tiene éxito, alguna otra acción transfiere rápidamente el dinero a otro lugar y luego recibimos "compensteDepositMoney ()", ¿qué hacemos ahora? Parece una gran lata de gusanos.
Para mí, parece que la composición del servicio es un principio SOA tan fundamental que realmente no obtienes los beneficios de SOA si no puedes (convenientemente) componer los servicios . Cual es la realidad ¿El 90% de los usuarios de SOA usan "SOA criplled" sin una composición de servicio real? ¿O la mayoría de los usuarios de hecho usan la composición del servicio y estoy exagerando la dificultad?