2017-12-12 1 views
0

, 나는 API 게이트웨이에서 엔드 포인트를 호출 microservices의 모범 사례에 따르면비동기 마이크로 서비스 통신은 UI의 관점에서 어떻게 더 나은 성능을 낼 수 있습니까? 같은 내 코너 UI에서

this.http.post(`/order`).subscribe(order => addNewOrderToList(order)); 

/order 핸들러는 하나 또는 그 이상의 microservices에 의해 소비되는 이벤트를 게시, 대신한다 동기 REST를 사용하여 서로를 호출합니다. 그래서, 나는 다음과 같은 핸들러 쓰기 : 사용자 인터페이스의 관점에서

@RequestMapping 
public Future<Order> addOrder() { 
    CompletableFuture<Order> future = new CompletableFuture<>(); 
    // publish event 
    // ... 
    // wait for final event raised by a service. 
    future.complete(createdOrder); 
    return future; 
} 

을 내 엔드 포인트가 새로운 질서를 반환 할 때까지 해당 사용자가 새로운 질서를 볼 수 없습니다 아닌가요? 백엔드가 비동기 일지라도 UI가 여전히 동기화되어 있다고 느낍니다. 이 경우 UI를 향상시키는 가장 좋은 방법은 무엇입니까?

답변

0

아마도이 경우 비동기 성 및 최종 일관성을 포용하는 것이 좋습니다.

HTTP 엔드 포인트는 호출 될 때 실제로 아무것도 수행하지 않고 UI 명령 만 받아 들여 다른 백엔드 마이크로 서비스가이를 처리하도록 큐에 넣습니다. 그렇습니까?

그러면 명령을 수락하고 유효성 검사를하고 큐에 넣은 다음 HTTP 상태 코드 202 Accepted을 클라이언트에 반환하면됩니다. 응답에 ETA 헤더를 포함시켜 클라이언트가 다른 엔드 포인트를 폴링하여 결과 준비가되었는지 확인할 수있는 정도를 나타낼 수 있습니다. truly RESTful approach을 따르는 경우 클라이언트가 준비가되었을 때 결과를 폴링하는 데 사용할 수있는 리소스에 대한 링크를 포함 할 수 있습니다.

다음과 같은 기사를 읽고 할 수 있습니다

:

+0

"UI에서 최종 일관성을 처리하는 4 가지 방법"문서는 내 문제점을 설명합니다. 마침내 기사에서 해결책 3을 선택했습니다. "거짓". 그래서 저는 백엔드를 호출하자마자 Angular라는 새로운 Order를 만들었습니다. 백엔드는 id와 같은 위조 된 객체를 만드는 데 필요한 정보를 반환합니다. 하지만 어쨌든, 사용자가이 가짜'주문 '과 즉시 상호 작용하면 안전하지 않습니다. (실제'주문 '이 저장되기까지는 몇 초가 걸립니다.)이 UI 문제에 대해 더 많은 링크 또는 패턴을 제공 할 수 있다면 크게 감사하겠습니다. –

+0

분명히 백엔드가 202 Accepted로 응답하면 백엔드에서 400 또는 500 개의 오류가 발생할 수 있기 때문에 가짜로 만들 것입니다.이 경우 사용자는 위조를해서는 안됩니다. 사용자가 백엔드에서 완료되기 전에 주문과 상호 작용하면 제한된 기능을 제공 할 수 있습니다. 프런트 엔드에 이미 알려진 사소한 세부 사항 만 볼 수 있으며, 일단 백엔드에서 주문이 구체화되면 나머지 기능을 사용할 수 있음을 사용자에게 알릴 수 있습니다. 해당 기능이 추가되면 사용자에게 알릴 수 있습니다. –

0

는이 작업을 수행하는 두 가지 방법이 있지만 사건의 UI/클라이언트 모두 비동기

  1. 동 기적에 액세스하지만 비동기 자연 브라우저에서 추가 할 수 있습니다 RestController를 구현하는 서비스를 호출합니다. 이것은보다 전통적인 방식입니다.
  2. 컨트롤러 메서드를 반응 적으로 만듭니다. UI가 서비스를 호출하고 데이터가 사용 가능할 때이를 알립니다. 이것은 새로운 것이며 SPring 5.0에서 지원됩니다.

두 가지 모두 좋지만 1 번 접근법은 오래되었지만 2 번은 UI와 서버에서 더 많은 처리가 필요합니다. 비동기 동작을 추가하면 고객 만족도가 향상됩니다. 즉, 데이터를 기다리지 않고도 UI에서 다른 작업을 수행 할 수 있습니다.

+0

당신은 방법 # 1에 대한 더 많은 예제를 추가 할 수 있을까요? 비동기 적으로 주석을 달기 위해 새로운 "Reply"를 추가한다고 상상해보십시오. 나는 백엔드로부터의 응답을 기다리고 싶지 않기 때문에 즉시 새로운 더미 "Reply"객체를 생성하고 Angular2 목록에 추가하여 사용자가 가능한 빨리 응답을 볼 수있게했습니다. 이 개체에는 ID가 없습니다. 백엔드가 준비되기 전에 사용자가 "좋아요"를 클릭하면 어떻게 될까요? –

관련 문제