데이터 통합을 클라이언트가 아닌 서버단에 해결하는 방법입니다. Composite 역할을 하는 서비스를 생성하여 해당 서비스에서 api 를 통합 하는 방법입니다. 주문 내용 조회 라는 API 를 호출 하였을때, Composite Service 에서는 각 마이크로 서비스들을 조회하여 데이터를 통합하여 응답을 해줍니다. 이는 Request/Response (요청/응답) 패턴에서 가지고 있는 문제점을 그대로 가지고 있습니다. 4개의 서비스를 조회할때 3개의 서비스가 1초만에 데이터를 보내왔어도 1개의 서비스가 4초가 걸린다면 전체적으로는 4초가 걸리게 됩니다. 이는 속도 저하로 이루어 지고, 마찬가지로 응답시간이 느려질수록 장애가 확산될 여지가 있습니다.

서버 리소스만 충분하다면 클라이언트에서 통합을 하는 방법보다는 효율적일 수 있습니다. 하지만 특정 서비스의 장애가 확산 될 여지가 있는 단점이 있습니다.

이미지 참조 : Modified from Microservices Patterns, Chris Richardson, Manning, 2018

Composite Service 구현 샘플

참고 소스코드

composite_service 예제

예제 설명

composite_service 예제는 사용자의 주문이력과 각 주문에 대한 상세 정보 ( 주문, 상품, 배송 ) 를 조합하여 사용자에게 보여줍니다. 비동기 통신을 위하여 Java 의 CompletableFuture 을 사용하였습니다. Java 의 비동기 통신 방법은 최초 요청을 하고 응답을 기다리지 않고, 일단 넘어갑니다. 그리고 요청결과가 나오면 call-back 메서드를 호출하여 주는 방식입니다. 동작방식과 사용법을 좀더 자세히 알고 싶으시면 java-completablefuture 를 참조 하시길 바랍니다.

대략적인 소스코드는 다음과 같습니다. 여러 서비스를 비동기로 호출하여 결과가 완성되면 조합을 하여 return 을 하면 됩니다.


@Service
public class CompositeService {
CompletableFuture<List<OrderInfo>> orderListCF = CompletableFuture.supplyAsync(() -> {
// Call OrderService API
}).thenCompose(orderListObject -> CompletableFuture.supplyAsync(() -> {
// 조회된 주문별로 다른 서비스 호출
CompletableFuture<Product> productInfoCF = CompletableFuture.supplyAsync(() -> {
    // Call product Service API
    });
    CompletableFuture<Delivery> deliveryInfoCF = CompletableFuture.supplyAsync(() -> {
        // Call product Service API ( HATEOAS API 호출 )
        });
        // 모든 작업이 끝나기를 기다린다.
        CompletableFuture.allOf(productInfoCF, deliveryInfoCF).join();
        //  데이터를 조합한다
        OrderInfo orderInfo = new OrderInfo(order, productInfoCF.get(), deliveryInfoCF.get());
        });
        }

예제를 통하여 아래와 같은 단점을 경험해 보실 수 있습니다

  • 주문, 배송, 상품 서비스가 모두 가동중이어야 데이터 조회가 됩니다.
  • 주문이력이 많을시에 모든 데이터를 조회 하기때문에 시간이 많이 걸립니다.
  • 각 호출 API 별로 return 되는 data 를 알고 있어야 합니다. ( 각 서비스에서 변경시 잦은 변경 요청)
*MSA School의 모든 콘텐츠에 대한 권리는 MSA School에 있으며, 무단 복제 및 배포를 금합니다. 영리 목적의 사용은 허용되지 않으며, 개인적 용도로 복제할 경우 반드시 출처를 표기해야 합니다.
© uEngine. All Rights Reserved. | 주소 : 서울특별시 서초구 신반포로45길 18 502호(잠원동, 주일빌딩)
사업자등록번호 : 211-87-95355 | 전화번호 : 02-567-8301 | 대표이사 : 장진영
*MSA School의 모든 콘텐츠에 대한 권리는 MSA School에 있으며, 무단 복제 및 배포를 금합니다.
영리 목적의 사용은 허용되지 않으며, 개인적 용도로 복제할 경우 반드시 출처를 표기해야 합니다.
© uEngine. All Rights Reserved.
주소 : 서울특별시 서초구 신반포로45길 18 502호(잠원동, 주일빌딩)
사업자등록번호 : 211-87-95355
전화번호 : 02-567-8301
대표이사 : 장진영