티스토리 뷰

728x90

🔎상황

동일한 프로그램이 올라가는 세대의 서버가 있고, 이 세대의 서버는 각각 개별적으로 존재하고 L4로 묶여있지 않다. 어떤 서버에 요청을 해도 동일한 응답값이 오기 때문에 원하는 응답값을 얻기 위해서는 단 하나의 서버에만 요청을 해도 된다.

그러나, 이런 경우 서버가 죽었을 경우 로드밸런싱이 되지 않기 때문에 하나의 서버에 요청 후 TIMEOUT이 떨어지면 다른 서버에 요청을 해야한다. 서버 요청 시간제한을 2초로 놓는다고 해도 운이 좋지 않으면 6초나 걸리는 상황이다.

그래서, 비동기통신을 고려해봤다.

 

🔎 코드

ExecutorService는 JDK API로 작업을 비동기 모드로 실행 할 수 있다. ExcutorService는 쓰레드 풀을 자동으로 제공한다.

 public Map<String, Object> requestInformation() throws ExecutionException, InterruptedException {
	//3개의 고정된 스레드풀을 생성한다
        ExecutorService executorService = Executors.newFixedThreadPool(3); 
        Map<String,Object> result = new HashMap<>();
        //실행할 작업을 담을 list를 생성한다.
        List<Callable<Map<String, Object>>> tasks = new ArrayList<>();
    
    	//connectUrl을 반복을 돌면서 작업을 생성하고 tasks에 담는다.
    	//connectUrl = ["http://123.1.12.111","http://123.1.12.2222","http://123.1.12.333"]
        connectUrl.stream()
        	.forEach(url-> tasks.add(() -> {
            		//http post 요청 작업을 생성하고 tasks에 담는다.
                    return HttpUtils.post(url, new HashMap<String, String>(), "{}");
                }));
        try {
        	//invokeAny인 경우 가장 먼저 끝난 작업의 결과가 return 된다. 
            result = executorService.invokeAny(tasks, 2, TimeUnit.SECONDS);
 
            //실행중인 작업을 종료 시킨다.
            executorService.shutdown();
            try {
                if (!executorService.awaitTermination(2,TimeUnit.SECONDS)) {
                    executorService.shutdownNow();
                }
            } catch (InterruptedException e) {
                executorService.shutdownNow();
            }
        } catch (ExecutionException | InterruptedException | TimeoutException e) {
            log.error(e.getMessage());
        }
        return result;
    }

로그를 보면 비동기로 실행 된 걸 확인 할 수 있다.

만약, 비동기로 실생이 되지 않았다면 로그는 아래와 같아야한다. 이 경우 결과를 얻기까지 최악으로 6초를 기다려야하기 때문에 시스템을 사용하는 사람에게 안좋은 경험을 심어주게된다.

post요청
url : -
header : {}
request : {}
Connect to - failed : connect timed out
post요청
url : -
header : {}
request : {}
Connect to - failed : connect timed out
post요청
url : -
header : {}
request : {}
response : {"code":200, "data" : "{}"}

 

 

⭐참고

https://www.baeldung.com/java-executor-service-tutorial

 

'백엔드' 카테고리의 다른 글

[maven] 나만의 maven repository 만들기 (+nginx)  (0) 2023.12.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함