저희 프로젝트에서 현재 인메모리 방식으로 데이터를 저장하고 있습니다.
그런데 Redis로 마이그레이션하자는 의견이 나왔습니다.
이 과정에서, **모놀리식 아키텍처에서 Redis를 사용하는 것이 오히려 성능 저하를 일으킬 수 있다
**는 의견도 있었습니다.
이에 모놀리식 아키텍처에서 Redis 사용이 성능 저하를 일으키는 문제와 Redis 사용이 적합한 상황을 알아보고자 합니다.
인메모리 방식보다 Redis를 사용 시 성능 저하하는 이유
네트워크 지연
- redis는 보통 별도의 서버로 동작하기 때문에, 데이터를 저장하거나 가져올 때 애플리케이션과 Redis 사이에 네트워크 요청이 발생합니다.
- 같은 서버에서 컨테이너로 Redis를 실행하더라도 오버헤드가 발생합니다.
- Redis 자체가 **
외부 서버와 통신하는 구조
**로 설계되어 있기 때문에, 심지어 같은 서버에서 컨테이너로 실행하더라도 **네트워크 요청
**이 발생합니다.
- 애플리케이션과 Redis 간 통신은 TCP를 통해 이루어지므로, 소켓 통신에 따른 오버헤드가 발생합니다.
- 반면, 인메모리 방식은 애플리케이션 프로세스 내부에서 데이터를 직접 메모리에 저장하고 가져오기 때문에 네트워크 지연이 발생하지 않습니다.
I/O 오버헤드
- Redis는 **
영속성 옵션
**을 사용하는 경우, 데이터를 디스크에 주기적으로 기록하거나 동기화합니다.
- 반면, 인메모리 방식은 디스크를 거치지 않으므로 이와 같은 오버헤드가 없습니다.
복잡성 증가
- Redis를 도입하면 애플리케이션 아키텍처가 복잡해질 수 있습니다. 예를 들어, Redis 클러스터 구성, 네트워크 보안, 데이터 백업, 장애 복구 등의 관리 작업이 추가됩니다.
- 모놀리식 아키텍처에서는 단순한 인메모리 방식이 애플리케이션의 단순성을 유지하면서 성능 면에서도 충분히 유리할 수 있습니다.
불필요한 리소스 사용
- Redis를 별도의 서버나 컨테이너로 운영하면, 추가적인 CPU와 메모리를 사용하게 됩니다. 작은 규모의 모놀리식 애플리케이션에서는 이러한 리소스가 낭비일 수 있습니다.
- 인메모리 방식에서는 애플리케이션 프로세스 내에서 직접 메모리에 접근하기 때문에 CPU 리소스를 거의 사용하지 않습니다.
- 하지만 Redis는 클라이언트-서버 모델로 동작하므로, 데이터를 요청하고 응답하는 데 네트워크 통신이 추가됩니다.
- 이는 네트워크 소켓의 연결/해제, 데이터 직렬화/역직렬화 과정에서 CPU를 더 많이 사용하게 만듭니다.
- Redis는 데이터를 자체 메모리에 저장하므로, 애플리케이션과 별도로 Redis 프로세스의 메모리 사용량이 추가됩니다.