레디스로 대기큐 구현 질문
38
23 câu hỏi đã được viết
학습 중 궁금한 점이 있으시면 편하게 질문 주세요. 참고로 질문이 구체적일 수록 더 정확한 답변을 드릴 수 있습니다. 😊
안녕하세요. 강의를 듣고 있는 개발자입니다.
이전에 유튜브에서 선착순 예매 관련 영상을 봤었는데
해당 영상에서 레디스를 이용해서 대기큐를 구현하는 것을 설명해주셨는데 그거에 대해서 질문이 있습니다.
레디스의 소티드 셋에 넣고 폴링을 통해서 상태를 확인한다.
타 스케줄러가 소티드셋에서 꺼내서 액티브로 바꾼다 라는 설명이 있었는데, 정확히 어떤식으로 구현하는 건지가 궁금합니다.
스케줄러가 꺼내고 액티브 유저 set으로 집어 넣는건가요?
그리고 소티드셋에서 꺼내서 엑티브 유저로 만드는 작업은 원자적으로 처리되게 하는건가요?
Câu trả lời 2
0
안녕하세요. 😊
유투브 영상을 보셨군요.
백단의 스케줄러가 대기열(Sorted Set)에서 입장시킬 수 있는 수 만큼 뽑아서 Active User에 넣습니다.
Active User에 있는 유저는 입장 허가를 받은 거죠. 이 시점부터 예매 페이지로 가서 출발시간과 좌석수 등을 선택해서 예매를 진행할 수 있게 됩니다. (이때 Active User는 개별 유저에 대해 TTL을 설정해야 하기 때문에 Redis의 String이 적합합니다. 키 예시: active:user:{uuid})
그리고 나서, 유저가 최종 예매 버튼을 클릭하면 (여러 유저가 동시에 요청을 할 수 있기 때문에) 해당 시간에 남은 좌석수를 Redis의 Lua Script나 Functions를 사용해 원자적으로 계산해서 최종 예매 처리를 합니다.(예매처리는 RDB로 최종 쓰기 작업을 할 수도 있고, MQ로 보낼 수도 있습니다)
화이팅입니다. 👍
0
안녕하세요 답변 감사합니다
약간의 추가질문이 있는데
대기큐에서 빼내고 엑티브유저로 만들때
빼는 것(팝)과 다시 액티브유저로 넣는(set + ttl) 두개를 루아 같은걸로 원자적으로 만들어야 하나요?
아니면 일단 조회만 해와서 액티브 유저로 만들고 ZREM으로 이후에 지우게 만드는게 나을까요?
혹시나 빼내고 엑티브 유저로 넣기직전에 서버 죽으면 문제생길 거 같아서요
0
안녕하세요. 😊
꼼꼼하게 예외상황을 고려하시는 걸 보니, 훌륭한 아키텍트가 되실 거 같네요.
Active User를 대기열과 같은 Redis 서버에 둘 지, 분리된 서버에 둘지. 또는 스케줄러가 자체적인 임시 저장소를 사용할지 말지 등에 따라 아키텍처가 달라 질 수 있겠는데요.
Redis를 같은 서버에 두고 스케줄러는 임시 저장소를 두지 않는다고 가정하고 답변 드리겠습니다.
말씀하신대로 Lua Script나 Functions를 사용해서 모든 단계를 원자적으로 처리하는 것이 가장 안전합니다.
루아 스크립트를 사용하지 않을 경우, 제안하신 두 방법 중에 리스크가 좀 덜한 쪽은
ZRANGE→SET→ZREM입니다. 마지막 삭제 단계에서 실패하면, 다음 스케줄러 실행 시 Active User 다시 등록 되는데(중복입장), 이때는 해당 유저의 TTL만 리셋되는 수준이지만,ZPOPMIN→SET에서는 중간에 실패하면 유저가 증발되어 버리기 때문에 리스크가 더 큽니다.
화이팅입니다. 👍
0
안녕하세요, 인프런 AI 인턴입니다. 김재연님.
레디스를 이용한 대기큐 구현과 관련된 질문을 주셨네요. Redis의 Sorted Set과 다른 구조를 사용하여 대기열을 관리하는 방법은 흔히 사용되는 패턴 중 하나로, 특히 선착순 예매나 순차적 작업 처리에 적합합니다.
Redis Sorted Set을 활용한 대기큐 구현 방법:
Sorted Set에 작업 추가:
- 사용자가 대기열에 들어가면, 해당 사용자나 작업에 대한 정보를 Redis의 Sorted Set에 추가합니다. 여기서 점수(score)는 예를 들어 작업의 우선순위나 추가 순서에 따라 결정됩니다.
- 사용자가 대기열에 들어가면, 해당 사용자나 작업에 대한 정보를 Redis의 Sorted Set에 추가합니다. 여기서 점수(score)는 예를 들어 작업의 우선순위나 추가 순서에 따라 결정됩니다.
폴링을 통한 상태 확인:
- 클라이언트는 정기적으로 Sorted Set을 폴링하여 자신의 작업 순서를 확인할 수 있습니다. 이 방법은 간단하지만, 폴링 주기가 짧을수록 Redis에 부하가 걸릴 수 있습니다.
- 클라이언트는 정기적으로 Sorted Set을 폴링하여 자신의 작업 순서를 확인할 수 있습니다. 이 방법은 간단하지만, 폴링 주기가 짧을수록 Redis에 부하가 걸릴 수 있습니다.
스케줄러의 역할:
- 다른 스케줄러가 주기적으로 Sorted Set에서 특정 수의 작업을 가져와서 ‘활성’ 상태로 변경합니다.
- 이 작업은 보통 스코어를 기준으로 정렬된 순서대로 수행됩니다. Redis의 ZRANGE와 같은 명령어를 활용하여 필요한 작업만 가져올 수 있습니다.
- 다른 스케줄러가 주기적으로 Sorted Set에서 특정 수의 작업을 가져와서 ‘활성’ 상태로 변경합니다.
원자적 처리:
- 작업을 대기 상태에서 활성 상태로 변경할 때, 원자적 처리를 보장하기 위해 Lua 스크립트를 사용할 수 있습니다. Lua 스크립트를 사용하면 ZREM과 추가적인 데이터 조작을 하나의 트랜잭션으로 묶어 실행할 수 있습니다.
- 작업을 대기 상태에서 활성 상태로 변경할 때, 원자적 처리를 보장하기 위해 Lua 스크립트를 사용할 수 있습니다. Lua 스크립트를 사용하면 ZREM과 추가적인 데이터 조작을 하나의 트랜잭션으로 묶어 실행할 수 있습니다.
예시 구현:
ZADD명령어로 사용자/작업을 대기열에 추가.
ZRANGE와ZREMRANGE를 통해 제일 앞의 작업을 가져오고 제거.
- Lua 스크립트를 활용하여 위의 작업을 하나의 원자적 연산으로 처리.
추가 정보:
Redis의 자료구조 및 방법론에 대한 더 많은 정보를 원하시면, Redis Container 해킹과 같은 기존 질문을 참조하시면 도움이 될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
프로젝트가 없어요..
0
18
1
강의 일정 및 수업 자료 공유 관련 문의드립니다!
0
16
1
API LIMIT
0
37
1
캐시 무효화
0
29
2
Redis와 Kafca의 Pub/Sub 차이
0
39
2
27강 슬랙 테스트 부분도 누락된 것 같네요
1
45
2
22강 케글 연동 강의내용 누락된듯해요
1
43
2
한국투자증권 미국 주식 매매 수수료와 환전 수수료가 높은 경우 자동매매 베개투자법을 적용해도 괜찮을까요?
0
58
2
스크립트를 한번에 복사하고 싶습니다.
0
34
2
@Version 어노테이션이 붙은 필드는 낙관적 락이든 비관적 락이든 업데이트가 됩니다.
0
39
1
너무 흥미진진합니다..
1
44
2
SP를 아직도 사용하나요?
0
47
2
캐시전략 - Write-behind
0
44
2
모델 서빙과 관련된 강좌 출시 예정된 바가 있으신지 여쭤봅니다!
0
47
2
순위가 동률일 때의 처리에 대해 질문드립니다.
0
60
2
Singleton 관련 질문입니다.
1
80
2
Service Create/Update Record 운용과 Delete Record 미운용의 차이 질문
0
28
1
Redlock 알고리즘 관해 궁금한게 있습니다!
0
77
2
좋아요/조회수 카운팅 병목현상에 대해서 궁금한점이 있습니다.
0
56
2
백엔드 서버 코드 변경에서 프론트엔드 서버가 값을 파싱하지 못하는 문제
0
104
1
강사님 GETDEL 관련해서 질문 있습니다
0
115
2
비밀번호를 걸고 실행된 레디스 서버에 lua 스크립트를 등록하는 경우
0
97
2
보안 설정을 한 수강생들은 Connection Settings에 비밀번호를 넣어야 추가되네요
0
76
2
Redis Container 해킹
0
129
1

