직행 프로젝트에서는 채용공고를 가져올 때 여러 프로세스를 거친다.

  1. 기업 채용 사이트에서 크롤링
  2. 크롤링 된 이미지를 ocr 작업을 거친 후, 기존 html과 병합
  3. 병합된 html 데이터에서 쓸모 없는 부분을 제거 (html tag 등)
  4. 생성형 ai를 통해 직행의 데이터 구조에 맞게 변경
  5. db 저장

먼저, 초기 단계에서는 생성형 ai를 활용하여 변경하는 과정에서 해당 프로세스의 실행 시간이 실행 주기보다 길다는 문제가 있었다.

@scheduled 를 사용하여 1분마다 해당 메소드를 실행했는데, RestTemplate를 사용하여 생성형 ai api로 요청을 보내는 부분이 존재했다. 문제는 해당 부분 실행 시 응답이 너무 늦게 오는 경우가 종종 존재했다. 평균 10~20초 사이에 응답이 왔으나 어떨 때에는 5분 넘게 오지 않는 경우가 있었다.

RestTemplate 의 경우 별도로 지정하지 않으면 timeout 제한이 없다는 것을 모르고 있었다. 심지어 디버깅 상에서는 정상적으로 응답이 오는 바람에 해당 이슈인지도 몰랐다..

이 때문에

  @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(8);
        scheduler.setQueueCapacity(100);
        scheduler.setThreadNamePrefix("ScheduledThread-");
        scheduler.initialize();
        return scheduler;
    }

를 통해서 쓰레드 풀에 개수를 지정해 놨는데, 주기가 조금씩 밀리다 보니 큐에도 가득 차 어느 순간 실행되어야 할 메소드가 실행되지 않는 문제가 발생했다.

처음에는 정확한 원인을 모르고 주기를 2분으로 변경하였는데, 당연히 겉보기에는 해결 되는 듯 보였으나 실제로는 해결이 되지 않았다.