tonykang22 / hello-world-auto-store

3 stars 1 forks source link

[product-manager] ForkJoinPool 적용 #123

Open tonykang22 opened 1 year ago

tonykang22 commented 1 year ago

ForkJoinPool 적용

사용 이유


Thread Pool 선택



결론은...?

image



어떻게 사용?

ForkJoinPool commonPool = ForkJoinPool.commonPool();


ForkJoinPool.commonPool();

public class ForkJoinPool extends AbstractExecutorService {
...

    static final ForkJoinPool common;

...

    static {
        ...

        common = AccessController.doPrivileged(new PrivilegedAction<>() {
            public ForkJoinPool run() {
                return new ForkJoinPool((byte)0); }});
        ...
    }

...

    public static ForkJoinPool commonPool() {
        // assert common != null : "static init error";
        return common;
    }

...

    private ForkJoinPool(byte forCommonPoolOnly) {
        int parallelism = -1;
        ...
        if (parallelism < 0 && // default 1 less than #cores
            (parallelism = Runtime.getRuntime().availableProcessors() - 1) <= 0)
            parallelism = 1;
        if (parallelism > MAX_CAP)
            parallelism = MAX_CAP;
        ...
    }

...
}



직접 확인해보자

로컬은 ?

image

image



서버는 ?

12:00:00.011 [ForkJoinPool.commonPool-worker-45] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.012 [ForkJoinPool.commonPool-worker-59] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.014 [ForkJoinPool.commonPool-worker-9] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.014 [ForkJoinPool.commonPool-worker-33] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.014 [ForkJoinPool.commonPool-worker-39] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.014 [ForkJoinPool.commonPool-worker-53] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.014 [ForkJoinPool.commonPool-worker-11] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.015 [ForkJoinPool.commonPool-worker-25] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.015 [ForkJoinPool.commonPool-worker-31] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.015 [ForkJoinPool.commonPool-worker-55] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.015 [ForkJoinPool.commonPool-worker-5] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.016 [ForkJoinPool.commonPool-worker-3] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.016 [ForkJoinPool.commonPool-worker-17] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.017 [ForkJoinPool.commonPool-worker-37] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86
12:00:00.015 [ForkJoinPool.commonPool-worker-19] INFO  c.g.k.p.s.s.j.ItemScoutWebScrapingWorker - =================== 처리 시작, size : 86



parallelism을 직접 넣어주면 ?

ForkJoinPool forkJoinPool = new ForkJoinPool(n);



중간 정리

image

Rainforest Response Header



Rainforest API 요청 테스트



Rainforest API 요청 테스트 결과

공통

RestTemplate를 기존의 방식으로 사용

설정


의의


결과

AmazonSyncTask: 5개

image image



AmazonSyncTask: 6개

image image image

와우... 수행 시간이 이렇게 똑같다니..!?



Connection Pool을 사용한 RestTemplate

설정


의의


결과

setMaxConnTotal: 6개

image image



setMaxConnTotal: 10개

image image image

한 녀석만 동떨어져서,, 두 번째 사이클을 열심히 수행



Rainforest API 몇 개까지 ?


설정


결과

n (parallelism) 소요 시간 (초)
1 18
2 7.3
3 19
4 17
5 14
6 13
16 20
32 24
40 27
50 44
64 44



참고

퀴즈



결론



정리



아쉬운 점

image

곧 떠나는구나 RestTemplate야...

tonykang22 commented 1 year ago

코멘트 작성자: kingwaggs



@tonykang22 상웅님, 정리된 내용 잘 확인했습니다.

416 에 이어 Technical writing skill 이 엄청 좋으시네요.. 테스트도 꼼꼼하구요.

한 편의 기술 블로그 컨텐츠를 읽는 느낌이었습니다 ㅎㅎ 나중에 이런 업무를 담당하셔도 잘 하실것 같네요.

실무에서 만들고자 하는 프로젝트가 실현 가능한가, 내부적으로는 어떤 기술을 적용할 것인가 등을 PoC 단계에서 논의합니다. 그 때마다 상웅님께서 정리해주신 것 처럼 특정 기술에 대한 분석과 데모 테스트 정도가 간단하게 추가하여 정리하고 이를 바탕으로 구성원 간 논의가 이어지는데요, 나중에 자기소개서를 작성할 때 위 이슈도 포함이 되면 좋을것 같네요. 따라서 최상단쯤에 ForkJoinPool 을 왜 쓰도록 결정하였는지, 그 사용 배경 및 요구사항을 간략 정리해서 몇 줄만 추가해주고 자세한 배경은 #416 이슈를 링크걸어 추가해주시면 좋을것 같습니다.

최하단에 정리된 내용에는 이견이 없습니다. 확인해주신대로 적용해서 Sync 작업 개발 진행해주시면 되겠습니다. 잘 읽었습니다. 저도 많이 배우네요 ㅎㅎ 고생하셨습니다.