Redis가 정말로 동시성 문제의 해결책인가? #107
RTUnu12
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
개요
이전 글에서 어떤 선배 분이 해당 질문을 하였다.
이 글은 해당 질문에 대한 답변이다.
Redis 외에 동시성을 해결하는 방법은 없는가?
있다. 아주 명확하게. 다만 상황을 판단하고 이 많은 방법들 중에서 Redis를 선택한 것이다.
데이터베이스 수준에서 해결
비관적 락 (Pessimistic Lock)
낙관적 락 (Optimistic Lock)
데이터베이스 원자적 연산
애플리케이션 수준
Redisson 분산 락
메시지 큐 (Kafka, RebbitMQ, SQS)
그러면 이 많은 방법들 중에 왜 Redis를 선택하였는가?
우선, 현재 API의 예상 상황을 나열해보자.
따라서 처리 속도가 매우 중요하며, 수많은 요청을 감당할 수 있어야 함
위 상황에서 다른 방법들을 대입해보자.
즉, 위의 이유로, 인메모리 기반이기에 빠르게 처리할 수 있고, Redis의 원자적 연산을 사용하여 동시 여러 요청이 와도 동시성 문제가 발생하지 않는다.
또한, DB에서 처리하지 않고 Redis에 좋아요 수를 관리하기에 DB 부하가 줄어들고, 좋아요 수를 조회할 때도 Redis에서 직접 가져오기에 데이터 불일치 문제는 발생하지 않는다.
그리고 DB는 수직 확장에 한계가 있으나, Redis는 클러스터 구성을 통해 확장이 가능해, 트래픽이 많아져도 성능 저하가 발생하지 않는다. (Auto Scaling을 생각하면 편하다.)
Redis가 정말 싱글 스레드가 맞는가?
싱글 스레드인 경우
멀티 스레드인 경우
Multiplexing이란?
즉 순서를 정리해보면 다음과 같다.
즉, 기본적인 요청들은 전부 싱글 스레드를 사용하지만, I/O 작업등을 백그라운드에서 처리할 때는 비동기적으로 처리된다.
이는 위의 작업들이 상당히 오래 걸리기에, 이를 싱글 스레드로 처리하면 다른 요청의 지연이 발생하기에 해당 작업에 한해서 멀티 스레드로 처리한다.
즉, Single Thread라는 의미는 클라이언트의 요청인 Redis의 명령어를 처리하는 것에만 유의미하다.
프로덕션 환경에서 KEYS 명령어를 사용하면 안 되는 이유
위와 연결해서 프로덕션 환경에서 KEYS 명령어를 사용하면 안 되는 이유도 설명할 수 있다.
KEYS 명령어는 다음과 같이 동작한다.
즉, KEYS는 Redis의 모든 데이터를 대상으로 스캔하는 방식으로 동작하기에 상당히 오래 걸리는 작업이다.
그런데 이건 일종의 명령어이므로 싱글 스레드 기반으로 동작한다. 즉, 데이터 크기가 커질수록 실행 시간이 길어지고, 해당 시간동안 Redis가 다른 요청을 처리하지 못한다.
이로 인해 실시간으로 동작하는 프로덕션에서 해당 명령을 실행하면 다음 문제가 발생한다.
만약 해당 기능이 진짜로 필요하다면, 점직적으로 키를 검색하며 작은 단위로 데이터를 검색할 수 있는 SCAN 명령어를 쓰자.
Redis를 사용한 동시성 처리에서 발생할 수 있는 문제점은 없을까?
해결 방안
다음 해결 방안이 있고 이는 다음 글에서 구현해보는 것으로 한다.
동시성 처리 하나만을 위해서 Redis를 쓰는 것이 과연 옳은 것일까?
동시성 이슈 해결 -> Redis 공식이 고착화된 이유는 무엇인가?
하지만 만능은 아니다.
즉, 해당 질문을 통해 Redis의 안정성에 대한 이슈가 새로 발견되었고, 다음 할 일을 이걸로 정했다.
Reference
Beta Was this translation helpful? Give feedback.
All reactions