현재 졸업작품을 진행하는 상황속에서 저희가 아키텍쳐를 구성하고 있었는데요! 간단하게 말하자면 현재 2개의 서버에서 @Scheduling cron을 활용해서 일정 시간마다 업데이트를 진행해주기 위한 작업을 하려고 했었습니다!
그런데 처음 코드를 작성했을때는 어떻게 진행이 됬었냐면! 저희와 비슷한 상황속에 있는 하나의 코드를 적어보겠습니다!
@Transactional
@Scheduling(cron= "* * * * 10 *")
public void task1(){
~~~~
어떤 작업에서 일정 시간마다 업데이트를 진행하면서 값을 1씩 더하는 로직이 들어가게 됨!
~~~~~
}
해당 task1이 2개의 서버에서 요청이 들어갔을 때 2개의 서버 중 1개의 서버에서만 업데이트가 사실 진행되어야 하는데 2개의 서버에서 진행을 하면 2씩 더하는 과정이 생기므로 저희가 의도한바와 달리 동작을 하게 됩니다!
이상적인 상황이 절대 아니지만 간단하게 그려봤을때는 문제가 되는 일부분은 다음과 같았습니다.
물론 문제가 있는 구성이 있다고 생각합니다! RDS 는 SPOF(Single Point Of Failure)를 일으킬 수 있지만… 사실상 비용적으로 고려를 더 해서 이후에는 Multi-AZ RDS 를 활용해볼 생각입니다!
네! 맞습니다! 이게 결국 핵심입니다! 그래서 이 문제를 해결하기 위해 다음과 같은 고민 끝에 다음과 결론에 도달하게 됩니다!
그래서 개념이 부족하였지만 한 가지씩 실험을 해보기로 하였습니다.
Spring Data JPA 를 활용해서 Locking 테이블을 만들고 이에 따라 진행을 해봐야겠다!
어? 2를 결국 더하는데?
그래서 매번 바로 확인을 할 수는 없었습니다. 트랜잭션이 끝나고 commit을 날리기 때문에 결국 바로바로 DB에 반영될 수 있는 방식이 필요했습니다.
오오! 예상한대로 한 쪽에서 진행했다는 로그를 확인할 수 있었는데요!
사실 문제를 해결해가는 과정속에서 현재 참여하고 있는 커뮤니티에 질문을 올렸었고 시도를 다 해본 이후에 알게 된 이 친구 덕분에 너무 쉽게 처리를 할 수 있었는데요!
자세한 동작방식은 해당하는 github Repo를 활용해보시면 좋습니다! 그래서 ShedLock 에서 @SchedulerLock 을 활용하여서 Spring AOP 를 활용하여서 저희가 요구한 바를 쉽게 처리할 수 있었다는 것을 알 수 있었습니다.
오늘의 글은 따로 ShedLock에 대해서 설명하기보단! 고민을 한 끝에 해결을 어떻게 할 수 있었는지를 보여주기 위한 과정이었으므로 자세한 이 로직이 동작하는 방식은 해당 Repo를 참고해주세요!
https://github.com/lukas-krecan/ShedLock
실제로 2개의 서버 중 하나의 서버에서만 진행을 하였습니다! 오히려 요구사항에는 이렇게 ShedLock을 이용하여 처리를 할 수 있는 좋은 경험이었습니다!
이전에 Spring framework에 Contributing을 하면서도 느낀 것이지만 누군가가 이렇게 라이브러리를 만들어서 공유를 해주시고 있다는 것에 계속해서 감사함을 느끼면서 사용해야겠다는 것을 다시금 많이 느끼는 순간이었던 거 같습니다.