inflearn logo
강의

Course

Instructor

2026! A Practical Guide to Redis for Backend Developers: From Basics to Real-World Patterns

레디스로 재고 관리

27

goyangee

25 asked

0

안녕하세요.

최근 수백만 동시 접속을 처리하는 예매 시스템 아키텍처 관련 강의와 유튜브 영상을 참고하면서, 작은 프로젝트로 선착순 쿠폰 발급 시스템을 직접 구현해보며 학습하고 있습니다.

현재는 Redis를 활용해 선착순 쿠폰 발급을 구현하는 구조를 고민하고 있는데, 몇 가지 아키텍처 설계에 대해 궁금한 점이 있어 질문드립니다.


1. Redis + DB 원자성 관련

Redis에서 쿠폰 발급 가능 수량을 감소시키고, 동시에 DB에도 반드시 반영(쿠폰 발급 및 사용자 할당 기록)해야 하는 상황을 가정하고 있습니다.

이 경우 Redis의 재고 감소와 DB 반영을 하나의 트랜잭션처럼 원자적으로 묶어야 할 것 같은데, 현실적으로는 분산 환경 특성상 이를 직접적으로 묶는 것이 어렵다고 이해하고 있습니다.

그래서 일반적으로는

을 원자적으로 수행하고,

으로 설계하는 것이 맞는지 궁금합니다.


2. 메시지 큐(Kafka 등) 사용 시 구조

또한 쿠폰 발급 결과를 Kafka 같은 메시지 큐로 전달하는 방식도 있을 것 같은데,

이 경우에도 동일하게

과 같은 구조로 가져가는 것이 일반적인지 궁금합니다.

아키텍처 redis FastAPI

Answer 2

0

codingpe

안녕하세요! 두 질문 모두 같은 핵심을 담고 있네요.

Redis의 재고 감소와 DB 반영의 정합성에 대한 문제네요.

 

가장 심플한 구조

  • Lua Script로 Redis 작업을 처리한 뒤 바로 DB에 반영하는 방법이 있어요.

  • 다만 이 구조는 Redis 성공 + DB 실패 시 정합성이 깨지는 문제가 있어요. 그래서 말씀하신 대로 중간에 큐를 두는 접근이 좋습니다.

 

(1번 질문) Redis Stream + Worker + DB

제안하신 구조도 괜찮은 접근입니다.

다만 Worker 실패 시 재처리 전략을 검토해 주세요.

  • 처리 완료 → XACK

  • 미처리 메시지 확인 및 재처리 → XPENDING

  • 중복처리에 대한 멱득성 보장

한 가지 더, Redis Stream은 인메모리 기반이라 Redis 장애 시 데이터 유실 가능성이 있어요. 프로덕션 환경이라면 AOF 설정을 반드시 활성화하세요.

 

(2번 질문) Kafka 추가

1번 구조에서 Worker → DB 사이에 Kafka가 추가된 구조네요.

Kafka를 추가하면 Consumer를 여러 개 띄워 처리량을 늘릴 수 있지만 운영 복잡도가 증가합니다. 트래픽이 충분히 커졌을 때 or 완벽한 내구성이 필요할 때 도입하는 걸 권장드립니다.

0

goyangee

답변 감사합니다.


또 약간 궁금한게 있습니다.

지금 제가 제안드린 방식은 결국 write behind 전략으로 보이는데


write thourgh는 어떻게 보장되는건가요?


트랜잭션 시작

업데이트 or 인서트

redis 캐시에 업데이트

트랜잭션 종료


라고 가정하면 업데이트나 인서트 되고 죽어버리면 불일치 상태가 될거 같아서요.

이때는 cdc를 사용하면 좋을 것 같다고 하셨는데 그럼 이것도 write through 전략이라고 봐야 하는 건가요?

1

codingpe

안녕하세요. 😊
먼저 용어부터 정확하게 다시 정리해 보겠습니다.

Write Through와 Write Behind

Write Through는 DB와 Redis를 함께 업데이트하는 전략입니다. 정합성이 높지만 쓰기 시 두 곳에 동시에 반영해야 해서 쓰기 지연이 생길 수 있는 전략이고요.

Write Behind는 Redis에 먼저 쓰고 나중에 DB에 반영하는 전략입니다. 쓰기가 빠르지만 중간에 장애가 나면 데이터 유실 위험이 있죠.

말씀하신 구조는(Redis 먼저 → 나중에 DB 반영) Write Behind 맞습니다.


CDC는 Write Through가 아닙니다.

CDC는 DB의 변경 로그를 감지해서 Redis에 자동으로 반영하는 도구입니다.

DB 변경 → 변경 감지 (CDC) → Redis 업데이트

DB를 항상 원본으로 보고 Redis를 따라가게 만드는 동기화 수단이에요. Write Through와는 다른 개념입니다.


화이팅입니다. 👍

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 김재연님.

선착순 쿠폰 발급 시스템을 구현하시면서 Redis를 거쳐 데이터베이스에 반영하는 단계적인 구조를 고민 중이시군요. Redis와 데이터베이스 사이에서의 원자성 문제와 시스템 아키텍처에 대한 두 가지 주요 질문을 해주셨습니다. 다음은 각각의 질문에 대한 설명입니다.

1. Redis와 DB 간의 원자성 문제

Redis와 데이터베이스는 각각 다른 시스템으로, 직접적인 트랜잭션으로 묶을 수는 없습니다. 다만, 트랜잭션과 비슷한 성격을 구현할 수 있도록 여러 가지 방법이 존재합니다. 제안하신 내용처럼, Redis 내의 Lua 스크립트를 활용하여 재고 감소와 중복 처리를 원자적으로 수행하고, 그 결과를 Redis Stream에 기록하는 패턴은 좋은 방법입니다. 이후, Worker 프로세스가 Stream이나 Queue을 읽어 DB에 해당 정보를 기록하도록 설계하는 것은 실제 실무에서도 많이 활용되는 패턴입니다. 이는 일관성과 성능 두 가지 측면에서 매우 효과적입니다.

2. 메시지 큐 활용 방안

Kafka 같은 메시지 큐를 사용하는 경우, Redis Stream에서 이벤트를 처리하고 Kafka로 전송하는 방식은 분산 데이터 처리에서 유용합니다. Kafka를 사용하여 각 이벤트를 확실히 전달하고, 이후 Consumer가 이를 처리하여 DB에 반영하는 것은 일관성을 유지할 수 있는 좋은 방법입니다. 특히, 이벤트의 영속성과 복구 가능성을 제공하기 때문에 대규모 시스템에 적합합니다.

요약

  • Lua Script 및 Redis Stream: Redis 내부에서 가능한 작업은 Lua Script를 통해 원자적으로 관리하고, 결과 이벤트를 Stream에 저장합니다.

  • Worker 또는 스케줄러 사용: Redis Stream의 이벤트를 읽어 데이터베이스에 반영하도록 합니다.

  • Kafka 활용: 필요 시 Kafka를 사용하여 확장성과 안정성을 높이고, 메시지 전달의 신뢰성을 보장하게 됩니다.

이 접근 방식들은 다양한 아키텍처 설계에서 일반적으로 사용되며, 실시간 성능과 데이터 안정성 두 가지를 적절히 보장할 수 있게 합니다. 이와 관련한 추가적인 예시와 설명은 아래의 관련 질문 링크에서도 참고하실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

jar 파일 빌드

-1

8

1

env

1

16

1

맥에서 파이썬

1

13

2

GCP SQL 진짜 어이가 없네

-1

11

1

이제 인프런에서 강의 더 안산다. 후져....

0

31

1

소스코드 어디서 다운받아요?

0

43

5

Lock 해제 문의 드립니다.

0

31

2

답을언제쯤받아볼수있나요

0

41

2

프로젝트가 없어요..

0

53

2

강의 일정 및 수업 자료 공유 관련 문의드립니다!

0

32

1

레디스로 대기큐 구현 질문

0

70

2

API LIMIT

0

49

1

캐시 무효화

0

40

2

Redis와 Kafca의 Pub/Sub 차이

0

57

2

27강 슬랙 테스트 부분도 누락된 것 같네요

1

61

2

너무 흥미진진합니다..

1

57

2

순위가 동률일 때의 처리에 대해 질문드립니다.

0

69

2

Redlock 알고리즘 관해 궁금한게 있습니다!

0

90

2

좋아요/조회수 카운팅 병목현상에 대해서 궁금한점이 있습니다.

0

64

2

백엔드 서버 코드 변경에서 프론트엔드 서버가 값을 파싱하지 못하는 문제

0

111

1

강사님 GETDEL 관련해서 질문 있습니다

0

121

2

비밀번호를 걸고 실행된 레디스 서버에 lua 스크립트를 등록하는 경우

0

102

2

보안 설정을 한 수강생들은 Connection Settings에 비밀번호를 넣어야 추가되네요

0

81

2

Redis Container 해킹

0

133

1