-
- redis pub sub 기능
- redis를 활용하여 메시지를 발행하고 구독하는 서비스
- 특징
- Redis Pub/Sub 시스템에서 동일한 채널을 여러 구독자가 구독하면, 해당 채널로 발행된 메시지가 모든 구독자에게 발송
- 한번 발송된 메시지는 저장되지 않음
- 실습예시)
- 터미널1 : SUBSCRIBE test_channel
- 터미널2 : PUBLISH test_channel "Hello, this is a test message"
- 활용
- 기본적으로 채팅과 같은 서비스의 경우 특정 서버에 서비스가 의존적이기에 다수의 서버를 운용하면서 채팅서비스(또는 알림서비스)를 운영할때에 pub/sub 구조 활용가능
- redis streams
- pub/sub과 다르게 stream은 메시지가 저장되어 소비자가 나중에라도 읽을 수 있음
- kafka와 자료구조가 유사
- 실습예시)
- XADD test_stream * message "Hello, this is a test message"
- XADD : Redis Stream에 데이터를 추가할 때 사용
- test_stream: 스트림 이름
- *: 메시지의 고유 ID를 Redis가 자동 생성
- XREAD BLOCK 10000 STREAMS test_stream $
- BLOCK 10000: 최대 10초(10000ms) 동안 대기
- $: 현재 마지막 메시지 이후에 오는 새 메시지를 기다림.
- XRANGE test_stream - +
- XRANGE 명령어는 Redis Stream에서 메시지를 조회할 때 사용
- : 시작 범위(처음부터)
- +: 끝 범위(끝까지)
- XRANGE 명령어는 Redis Stream에서 메시지를 조회할 때 사용
- XADD test_stream * message "Hello, this is a test message"
- 활용
- 이벤트 기반 시스템
- 채팅 및 알림 시스템
- redis pub sub 기능
- DB서버 구성
- Replication (복제)
- master/slave
- REDIS DB 기본 구성
- 하나의 마스터 서버가 쓰기 작업을 처리하고, 여러 슬레이브 서버가 마스터의 데이터를 복제하여 읽기 작업을 처리
- 클러스터 구성
- 추가적인 설정과 구성 필요
- Redis 클러스터는 데이터를 여러 노드에 분산하여 저장함으로써 고가용성과 확장성을 제공
- 클러스터는 자동으로 데이터 샤딩을 수행하고, 노드 간의 복제를 통해 장애 복구를 지원
- Replication (복제)


1. pub/sub

publish
subscribe
일반적인 웹서버는 사용자에게 데이터를 요청하고 거기에 맞는 응답으로 이루어짐
redis의 pub/sub은 발행과 구독의 형태로 채팅이나, 알림 시스템에 어울림
ex) 채팅 시스템 예시
초록이 메세지를 여러 곳에 발행하고 싶다. 구독하고 있는 빨강이는 2곳이며, 실시간으로 발행 시 채팅이 전달되는 지 확인
pub/sub 기능은 멀티 서버 환경에서 채팅, 알림 등의 서비스를 구현할 때 흔히 사용
1. 초록 - publish
2. 빨강1 - subscribe
3. 빨강2 - subscribe

발행 시
"publish 채널명 메세지"

구독 시
"subscribe 채널명"
먼저 구독 후 발행해야함
발행 시 적었던 "hello this is a test message" 가 들어온 것을 확인할 수 있다.
채팅과 같은 서비스는 특정 서버에 서비스가 의존적이라 다수의 서버를 운용하면서 상대방에게 알림 또는 채팅을 보낼 때 pub/sub 사용
단점) 서버가 돌아가지 않다면, 저장되지 않아 유실될 가능성이 있음.
이럴 때 streams를 활용!
2. redis streams
pub/sub과는 다르게, streams은 메세지가 저장되어 소비자가 나중에 읽을 수 있음
마찬가지로 초록색에서 메세지를 발행해보고, 빨강색에서 메세지를 받아볼 예정
( 항상 먼저 빨강색에서 메세지 받기부터 해주기 기억)
1. 보낼 때

" xadd 스트림이름 * message "보낼 메세지" "
1) xadd - redis stream에 데이터를 추가할 때
2) test_stream - 스트림 이름
3) * - 메세지 고유의 IDF를 redis에서 자동으로 생성 (id 값 자동생성)
2. 받을 때

"xread block 20000 스트림이름 $"
1. block 20000 - 최대 20초(20000ms) 동안 대기
2. $ - 현재 마지막 메세지 이후에 오는 새 메세지를 기다림. (실시간으로 메세지를 기다림)
저장되었는 지 확인해보자

key로 조회 했을 때, test_stream이 존재하는 걸 볼 수 있고,
(- +는 처음부터 끝까지 조회)
xrange로 조회 시 데이터가 남아 있는 것을 볼 수 있다.
pub/sub과 stream의 차이!
pub/sub은 일회성 메세지를 보내고 받는 형식이라면(일회성),
stream은 메세지를 자료구조에 저장되는 형식
pub/sub은 서버가 죽어있으면 메세지가 유실될 가능성이 있어 안정성이 낮다.
stream은 안정적으로 메세지를 저장할 수 있음
사실 자료구조가 복잡해서 가능하지만 이런 형태로 사용할꺼면 인메모리 데이터베이스보다
더 다양한 기능을 지원하는 kafka를 쓰는 게 맞다!