daadaadaah / review-study-app

0 stars 0 forks source link

멀티 스레드 -> 싱글 스레드로 동시성 문제 해결 #76

Closed daadaadaah closed 2 months ago

daadaadaah commented 2 months ago

문제

해결 과정

1. 재현

https://github.com/user-attachments/assets/76f2e9bf-17cc-4486-93e4-f1985a4a443f

2. 원인 파악

3. 다양한 해결 방법 모색

4. 최종 해결책 선택

(1) 로그 저장 로직의 특징

(2) 싱글 스레드가 적합하다고 생각한 이유

(3) 싱글 스레드 구현

@Configuration
public class AsyncConfig implements AsyncConfigurer {

    @Bean(name = "logSaveHandlerExecutor")
    public TaskExecutor logSaveHandlerExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(1); // 순서 보장하기 위해서 1개
        executor.setMaxPoolSize(1);
        executor.setThreadNamePrefix("LogSaveHandler-"); // 스레드 이름 접두사
        executor.initialize();
        return executor;
    }
}
@Service
public class LogDirectSaveGoogleSheetsService implements LogService {
     //... 생략
    @Async("logSaveHandlerExecutor") 
    public void saveJobLog(SaveJobLogDto saveJobLogDto) {
         //... 생략
    }

    @Async("logSaveHandlerExecutor")
    public void saveStepLog(SaveStepLogDto saveStepLogDto) {
          //... 생략
    }

    @Async("logSaveHandlerExecutor")
    public void saveTaskLog(SaveTaskLogDto saveTaskLogDto) {
              //... 생략    
     }
}

성과

https://github.com/user-attachments/assets/adf17393-bf23-4562-9357-f56b56997817

1. 데이터 일관성 확보

2. 호출 순서 유지

3. 구현의 용이 및 예측 가능성

daadaadaah commented 2 months ago

참고용으로 추후에 삭제 필요!

싱글 스레드, Synchronized 방식, Lock 방식은 각각 서로 다른 동시성 제어 방법을 제공하며, 각 방식은 고유한 장단점을 가지고 있습니다. 아래에서 이 세 가지 방식의 상대적인 장단점을 비교해 보겠습니다.

1. 싱글 스레드 방식

장점:

단점:

2. Synchronized 방식

장점:

단점:

3. Lock 방식

장점:

단점:

결론: 상황에 따른 선택

이러한 장단점을 바탕으로, 시스템의 요구 사항에 맞춰 적절한 동시성 제어 방법을 선택하는 것이 중요합니다.