[목적] MSA 기반 이벤트 처리 시스템에서 상품 조회 부분의 비동기 처리

[문제] 잘못된 설정 시, 전체 처리 지연 혹은 메모리 오버헤드 및 GC 부하 발생

[목표]

  1. Executor 최적 설정값 찾기
  2. 초당 처리량 100 건, 버스트 1000건 까지도 처리 가능하도록 안정화

[진행 과정]

  1. 목표 초당 처리량 x 평균 대기 시간으로 예상 Pool size 산출

    지표
    표본 수 653 건
    평균 응답 시간 6 ms
    P(50) 7 ms
    P(90) 8 ms
    P(95) 8 ms
    P(99) 10 ms
    최소 응답 시간 5 ms
    최대 응답 시간 23 ms
    처리량 3.64 req/s

결론: 여유롭게 2~4 스레드 정도만 잡아도 충분하다고 판단.

❗ 버스트 대비

순간적으로 1000 req/s 를 커버해야 할 땐 1000 x 0.006 = 6 → 8~12 스레드를 잡아 처리하도록 함

[최종 결과]

@Bean(name = "feignClientTaskExecutor")
public ThreadPoolTaskExecutor feignClientTaskExecutor() {
    ThreadPoolTaskExecutor exec = new ThreadPoolTaskExecutor();
    exec.setCorePoolSize(4);
    exec.setMaxPoolSize(12);
    exec.setQueueCapacity(50);
    exec.setThreadNamePrefix("feign-task");
    exec.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    exec.initialize();
    return exec;
}