SQS로 동시성 제어를 구현하였는데 재고 관리가 제대로 되지 않는 문제가 발생함
문제 발생 당시에는 메세지 큐의 속도와 DB 트랜잭션 속도에 차이가 있어 동시성 제어가 실패했다고 판단했음.
@Version 어노테이션으로 DB에 낙관적 락을 걸고 트랜잭션을 분리하는 등 방법을 시도했지만 실패.
이후 Config 클래스를 보다가 SqsMessageListenerContainerFactory 클래스에서 메세지 큐 수신에 대한 설정을 하고 있었고 클래스를 분석하면서 메세지를 폴링하는 최대 개수, 메세지 처리 모드 등 여러 설정 값들을 확인할 수 있었음.
본 프로젝트에서는 최대 메세지 폴링 개수를 1개로 조절해 큐에 여러 메세지가 있어도 1개씩 수신하여 로직을 처리하도록 했고 동시성 제어가 의도한 대로 동작하는 것을 확인함.
해당 문제를 해결함으로써 다른 라이브러리나 클래스를 분석하여 상황에 맞게 사용하는 능력을 기를 수 있게 됐음.