Open tonykang22 opened 1 year ago
@tonykang22 상웅님, 정리된 내용 잘 확인했습니다.
한 편의 기술 블로그 컨텐츠를 읽는 느낌이었습니다 ㅎㅎ 나중에 이런 업무를 담당하셔도 잘 하실것 같네요.
실무에서 만들고자 하는 프로젝트가 실현 가능한가, 내부적으로는 어떤 기술을 적용할 것인가 등을 PoC 단계에서 논의합니다. 그 때마다 상웅님께서 정리해주신 것 처럼 특정 기술에 대한 분석과 데모 테스트 정도가 간단하게 추가하여 정리하고 이를 바탕으로 구성원 간 논의가 이어지는데요, 나중에 자기소개서를 작성할 때 위 이슈도 포함이 되면 좋을것 같네요. 따라서 최상단쯤에 ForkJoinPool 을 왜 쓰도록 결정하였는지, 그 사용 배경 및 요구사항을 간략 정리해서 몇 줄만 추가해주고 자세한 배경은 #416 이슈를 링크걸어 추가해주시면 좋을것 같습니다.
최하단에 정리된 내용에는 이견이 없습니다. 확인해주신대로 적용해서 Sync 작업 개발 진행해주시면 되겠습니다. 잘 읽었습니다. 저도 많이 배우네요 ㅎㅎ 고생하셨습니다.
ForkJoinPool 적용
사용 이유
122 에도 해당 이유가 설명되어 있기는 하다.
Thread Pool 선택
결론은...?
어떻게 사용?
commonPool
을 사용하면 작업별로 별도의 스레드 풀을 생성하지 않게 되므로 리소스 소비가 줄어든다고 한다.commonPool()
을 사용해 만든 pool에는 몇 개의 스레드를 운용하는거지?ForkJoinPool.commonPool();
commonPool()
을 호출하면common
을 반환하는 것을 확인할 수 있다.common
은 static 초기화 블럭 내에서 초기화된다.new ForkJoinPool((byte)0);
를 반환하는 것을 확인할 수 있다.parallelism
=(Runtime.getRuntime().availableProcessors() - 1)
으로 설정되게 된다.@param parallelism the parallelism level
이라 표현되어 있다.직접 확인해보자
로컬은 ?
commonPool()
을 사용하면 병렬 작업을 할 수 있는 9개의 스레드를 사용하는 것으로 이해된다.서버는 ?
parallelism을 직접 넣어주면 ?
중간 정리
Rainforest API 요청 테스트
API 요청 - 응답
에 소요되는 시간은 약10 - 30 초
이다.RecursiveTask<List<AmazonSourcingProduct>>
를 상속한AmazonSyncTask
를 작성한다.AmazonProductFetcher
를 작성한다.AmazonSyncTask
의 수행할 task 수가 1개(=threshold)가 되면 그 때amazonProductFetcher.getAmazonProductList()
를 호출한다.Rainforest API 요청 테스트 결과
공통
HttpComponentsClientHttpRequestFactory
를 사용한다.setMaxConnTotal / setMaxConnPerRoute
를 변경해 테스트한다.setMaxConnTotal
: 최대 connection 수 설정setMaxConnPerRoute
: 특정 host에 대한 최대 connection 수 설정ForkJoinPool.commonPool();
: 로컬 환경에서는parallelism = 9
new ForkJoinPool(n parallelism)
: 입력하는parallelism = n
예상 소요 시간: 10 - 30 초
)Task = 9 개
: Rainforest API 요청이 9회 일어나야한다.RestTemplate를 기존의 방식으로 사용
설정
ForkJoinPool
:commonPool
고정SimpleClientHttpRequestFactory
의 한계점(5) 이상으로 설정해두어 해당 설정이 bottle neck이 되지 않기 위함AmazonSyncTask
: 5개 / 6개의의
connection / read timeout
만 3분으로 해둔 상태로, default로SimpleClientHttpRequestFactory
를 사용한 방식이 되겠다.결과
AmazonSyncTask: 5개
AmazonSyncTask: 6개
Connection Pool을 사용한 RestTemplate
설정
ForkJoinPool
: commonPoolAmazonSyncTask
: 10개RestTemplate Connection Pool
:setMaxConnTotal / setMaxConnPerRoute
(테스트 특성 상 두 값은 같도록 설정한다.) : 6/6개, 10/10개의의
max connection 갯수 > ForkJoinPool의 parallelism
가 된다면 병렬 작업을 수행할 스레드의 수가 bottle neck이 되어ForkJoinPool의 parallelism
수 만큼만 동시에 수행하는지도 확인결과
setMaxConnTotal: 6개
setMaxConnTotal: 10개
Rainforest API 몇 개까지 ?
설정
ForkJoinPool
: n = 100AmazonSyncTask
: 1 ~ 64 개RestTemplate Connection Pool
: setMaxConnTotal / setMaxConnPerRoute [테스트 특성 상 두 값은 같도록 설정한다.] : 100/100개결과
Opening connection
로그를 확인해도참고
퀴즈
결론
2시간 5분
이면 마칠 수 있을 것2시간 5분
이 소요될 것이다.정상
상태로 판단된다.정리
아쉬운 점