주요 SOA 서비스 디자인 원칙 중 하나는 서비스 구성 원칙 ( https://en.wikipedia.org/wiki/Service_composability_principle )입니다.
아이디어는 기존 서비스를 빌딩 블록으로 사용하여 새로운 서비스를 구성함으로써 새로운 서비스를 신속하게 개발할 수 있다는 것입니다. 새로운 메소드를 구현할 때 객체의 exising 메소드를 호출하는 방식과 유사합니다. 여기에서 SOA의 생산성 향상이 많이 발생합니다.
실제로 실제로 이것을하는 사람이 있습니까? 나는 이것이 글로 끝없이 반복되는 것을 보았지만 실제 구현을 직접 경험하지는 못했습니다. 대부분의 텍스트는 트랜잭션 처리에 대한 언급을 생략했으며 , 이는 컴포저 블 서비스를 실현하는 데 가장 큰 장애물 인 것 같습니다.
먼저, 사소한 서비스를 작성하기 전에 트랜잭션 문제를 해결해야합니다. 예를 들어 서비스에 "findCurrentTime ()"및 "writeLogMessage ()"서비스가있는 경우 트랜잭션에 대해 걱정하기 쉽지만 "depositMoney ()"및 "withdrawMoney ()"와 같은 실제 예제는 없을 수 있습니다.
두 가지 옵션을 알고 있습니다.
- WS-Atomic Transaction 등으로 실제 트랜잭션 구현
- "cancelA ()"를 사용하여 A에 대한 호출을 보상하거나 B에 대한 호출이 실패하는 경우를 보상하는 보상 기반 솔루션 구현
이 두 가지 모두 나에게 매우 문제가 있거나 거의 사용할 수없는 것 같습니다.
- WS- 원자 거래
- 많은 복잡성, 내가 발견 한 대부분의 조언은 단지 경고 "엉덩이에 통증을, 그나마 그것을 할"
- 지원이 제한되어 있습니다 (예 : 오픈 소스 ESB를 사용하는 경우 주요 대안 ServiceMix, Mule 또는 WSO2는이를 지원하지 않습니다)
- 보상
- 보상 처리를 구현하는 것은 매우 복잡해 보입니다. 서비스 A가 성공하고 서비스 B로부터 응답을 얻지 못하고 실패했는지 또는 성공했는지 모른다면 어떻게해야합니까? 이러한 합성을 수동으로 처리하면 (컴 포지 팅 서비스의 구현 자로서) 손목이 찢어 지길 원합니다. 이것은 어떤 도구가 나를 위해해야 할 일입니다!.
- 나는 또한 당신이 사소한 서비스에서 보상 방법을 가질 수있는 방법을 보지 못했습니다. 서비스 A가 "depositMoney ()"이고 성공하면 다른 조치로 다른 곳으로 돈을 빨리 이체 한 다음 "compensateDepositMoney ()"를 받으면 어떻게해야합니까? 큰 벌레 캔처럼 보입니다.
나에게 서비스 구성은 서비스를 (편리하게) 작성할 수 없다면 SOA의 이점을 얻지 못하는 근본적인 SOA 원칙 인 것 같습니다 . 현실은 무엇입니까? SOA 사용자의 90 %가 실제 서비스 구성없이 "편리한 SOA"를 사용하고 있습니까? 아니면 대부분의 사용자가 실제로 서비스 구성을 사용하는데 어려움을 과장하고 있습니까?