안녕하세요! 지난 포스팅에서 E-Market 프로젝트를 단일 서버에서 api-server와 batch-server로 분리하는 멀티모듈 전환의 첫 번째 이야기를 나눴었죠. (혹시 못 보셨다면 1편을 먼저 읽어보시는 걸 추천드립니다!) 프로젝트 규모는 아직 크지 않지만, 관심사 분리와 유연한 스케일아웃을 위해 과감하게 모듈화를 진행했었는데요. 이번 포스팅에서는 멀티모듈 전환 이후 발생하는 이벤트 처리와 스케일아웃 환경에서의 중복 스케줄링 문제 해결에 대해 자세히 다뤄보겠습니다.
본론: 이벤트 수신과 중복 스케줄링 방지
서버를 분리하면서 가장 큰 고민거리 중 하나는 바로 외부 시스템으로부터 들어오는 이벤트를 어떻게 효율적으로 처리하고, 여러 batch-server 인스턴스가 동시에 같은 작업을 수행하는 중복 스케줄링을 어떻게 방지할 것인가였습니다. 단일 서버일 때는 간단했지만, 분리된 환경에서는 이벤트 전달 및 중복 실행 방지 메커니즘이 필수적이죠.
이 문제를 해결하기 위해 선택한 기술은 바로 Redis Pub/Sub입니다. Redis의 publish/subscribe 기능을 이용하여 외부 시스템에서 이벤트를 publish하면, 모든 batch-server 인스턴스가 subscribe하여 이벤트를 수신하는 구조를 구축했습니다. 단순히 이벤트를 전달하는 것만으로는 중복 스케줄링 문제가 해결되지 않으므로, 추가적인 메커니즘이 필요했습니다.
핵심은 Distributed Lock입니다. 각 batch-server는 이벤트를 수신했을 때, Redis를 이용하여 해당 이벤트에 대한 lock을 획득하려고 시도합니다. lock을 획득한 서버만 이벤트 처리 작업을 수행하고, 나머지 서버들은 lock 획득에 실패하여 중복 실행을 막을 수 있습니다. 이를 통해 스케일아웃 환경에서도 안정적으로 이벤트를 처리하고 중복 스케줄링 문제를 효과적으로 해결할 수 있었습니다. Redis의 높은 성능과 안정성을 바탕으로 이벤트 처리 시스템의 확장성도 확보할 수 있었습니다.
결론: 멀티모듈 전환의 효율성 증대
Redis Pub/Sub과 Distributed Lock을 활용하여 멀티모듈 환경에서 발생하는 이벤트 처리 및 중복 스케줄링 문제를 성공적으로 해결했습니다. 이를 통해 E-Market 시스템은 더욱 안정적이고 확장성 있는 구조를 갖추게 되었으며, 향후 서비스 확장 및 유지보수에 있어서도 큰 이점을 제공할 것으로 기대하고 있습니다. 다음 포스팅에서는 다른 기술적 도전과 그 해결 과정에 대한 이야기를 들려드리겠습니다. 많은 기대 부탁드립니다!