netty는 모든 것을 비동기로 처리한다. 이때 어떤 요청에 대한 응답을 받아 처리하는게 생각만큼 쉽지가 않다.
이러한 때를 비동기처리를 동기로 처리하는 경우라고 표현한다.
기본적으로 이 문제를 해결하기 위해서는 어떤 요청에 대해 오는 응답을 서로 연결할 수 있는(매핑할 수 있는 ) id가 필요하다. 이걸 correlationId라고 보통 명명한다. 그래서 correlationId를 생성하여 요청에 담아 던지면 이에 대한 응답은 반드시 correlationId를 담아서 던져야 한다. (이게 되지 않으면 요청과 응답을 매핑할 수 없어 비동기로 처리가 불가능하게 된다.)
map.put("corretionId",new CompletableFuture<Object>);
요청시에 위처럼 correlationId와 결과를 담을 CompletableFuture객체를 map객체에 담아둔다.
아래는 요청하는 곳의 pseudo 코드
CompletableFuture<Object> requestReturn = makeRequestAndSend();
Object result = requestReturn.get(1000,TimeUnit.MILLISECONDS);
응답를 받는 메소드에서 correationId를 찾고 그에 매핑되는 CompletableFuture 객체를 찾아 결과를 담아준다.
아래는 응답받는 곳의 pseudo 코드
Object response = receiveResponse();
String correlationId = findCorrelationId(response);
CompletableFuture<Object> completableFuture = map.get( correlationId );
completableFuture.complete( response );
이런 식으로 비동기처리를 동기처리로 변경하여 처리할 수 있다.
requestReturn.get() 메소드는 결과를 올 때까지 무작정 기다려서 위험한 코드이다.
requestReturn.get(1000, TimeUnit.MILLISECONDS)); // 이런식으로 적당한 timeout을 지정하여 결과를 받는게 안정적이다.
과연 이런 코드를 검색하여 찾는 개발자가 있을까 싶기는 하다.