티스토리 뷰
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
링크
TAG
- 자바코테
- 쿠버네티스
- java
- centos
- 코테
- 자바
- 아파치카프카
- 도커
- 자바스크립트
- 리액트
- 스프링
- 현대오토에버
- softeer
- react
- 톰캣
- Spring
- tomcat
- 오토에버코테
- Docker
- 코딩테스트
- 전자정부프레임워크
- springboot
- 현대
- java 코테
- Kubernetes
- Linux
- softeer java
- mysql
- javascript
- 현대코테
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함