Redis Pub/Sub 기반 SSE 실시간 알림 삽질 통해 구현하기.

2024. 9. 24. 18:00·개발중/Spring Boot & Redis
728x90
반응형

 

 

첫 번째와 두 번째 클라이언트는 첫 번째 서버와 SSE 연결을 맺었기 때문에, 두 번째 서버는 이 두 클라이언트와의 SSE 연결 정보를 가지고 있지 않습니다.

만약에 A 파드에서 알림이 발생했을 경우에는 첫번째 클라이언트와 두번째 클라이언트에게 SEE 를 사용해서 알림을 보낼 수 있습니다.

 

하지만 B 파드에서 알림이 발생했을 경우에는 ?

첫번째 클라이언트와 두번째 클라이언트의 SSE 정보가 없기 때문에 전송할 수 없습니다.

 

 

그래서 레디스의 Sub/Pub 기능을 이용해서 알림 상태를 모든 Pod 에게 전달하기로 했습니다.

Redis Sub / Pub 참고 ...

 

Redis Config 에 RedisMessageListenerContainer, MessageListenerAdapter 빈등록을 해줍시다.

 

일단 "알림"이라는 채널을 생성을 했습니다.

    @Bean
    public RedisMessageListenerContainer redisContainer(RedisConnectionFactory connectionFactory,
                                                        MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter, new PatternTopic("알람"));
        return container;
    }


    @Bean
    public MessageListenerAdapter messageListener(RedisMessageSubscriber subscriber) {
        return new MessageListenerAdapter(subscriber);
    }

 

( MessageListener 는 하단에 구현 하겠습니다. )

 

 

그리고 모든 파드들은 "알림" 채널을 구독합니다.

 

RedisMessageListenerContainer 에 addMessageListener 를 해주고 PatternTopic 생성자에 채널명을 전달해주면 구독이 완료됩니다.


"알람" 이라고 명시하면 "알람" 에 대한 채널을 구독하겠다는 의미이고,
"알람*" 이라고 명시하면 "알람" 으로 시작하는 패턴을 가진 채널을 구독하겠다는 의미입니다.

 

MessageListener 를 상속받아서 메세지가 왔을 경우에 이벤트를 받아낼 수 있도록 합니다.

 

@Service
@RequiredArgsConstructor
public class RedisMessageSubscriber implements MessageListener {

    private final SseService sseService;

    /**
     * 메세지가 발행되면 이벤트를 받는 역활
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {

        String channel = new String(message.getChannel());        

        // 메세지 내용
        String messageContent = new String(message.getBody());

        // SSE 로 메세지를 전송
        sseService.sendSseEmitter(messageContent);
    }
}

 

 

그럼 이제 아래와 같은 순조로운 시나리오대로 알림이 전송됩니다.

 

클라이언트와 API 는 각각 SSE 관계를 맺는다.

그렇기 때문에 모든 API 에 모든 SSE 정보는 있을 수 없다.

( 기왕이면 SSE 를 REDIS 에 저장하면 나이스라고 생각했으나, SEE 객체 특성상 직렬화/역직렬화가 자유롭지 못하다. )

 

모든 API 파드들은 REDIS 와 Pub/Sub 관계를 맺어 실시간으로 채널을 구독하는 관계를 만들고

모든 API 파드들은 메세지가 발행되면 Client 에게 SEE 를 통해  메세지를 전달한다.

 

여기서 한가지 모순이 있는데,

REDIS > API > Client 이 단방향으로 메세지가 전달되는 구조기 때문에

혹시라도 Client 1 의 정보를 가지고 있는 API 파드가 KILL 되고 재생성된 경우에는 Client 1 의 정보가 사라질 수 밖에 없다.

 

너무 슬픈일이다.

이런 경우에는 어떡할까

728x90
반응형
저작자표시 (새창열림)

'개발중 > Spring Boot & Redis' 카테고리의 다른 글

Spring Boot 기반 Redis Pub/Sub 구현: 분산 환경에서 Pod 간 이벤트 처리  (2) 2024.11.16
Spring Boot 3와 Redis: 로컬 도커 환경에서 시작하기  (0) 2024.05.08
Spring Boot 3.x 및 Security 6.x를 이용한 중복 로그인 관리 방법  (0) 2024.05.03
Spring Boot와 Redis를 사용한 데이터 저장 및 관리  (0) 2024.05.03
Spring Boot 2.x.x에서 3.x.x로 업그레이드 후 Redis에 Java 객체 저장 문제 발생  (0) 2024.04.16
'개발중/Spring Boot & Redis' 카테고리의 다른 글
  • Spring Boot 기반 Redis Pub/Sub 구현: 분산 환경에서 Pod 간 이벤트 처리
  • Spring Boot 3와 Redis: 로컬 도커 환경에서 시작하기
  • Spring Boot 3.x 및 Security 6.x를 이용한 중복 로그인 관리 방법
  • Spring Boot와 Redis를 사용한 데이터 저장 및 관리
Binsoo
Binsoo
내 트러블 슈팅
  • Binsoo
    정수빈 기술블로그임.
    Binsoo
  • 전체
    오늘
    어제
    • 빈수 개발자 개발 일기 (949)
      • 개발중 (635)
        • Spring Boot (95)
        • Spring Security (2)
        • Spring Batch (6)
        • Spring Boot & Redis (13)
        • Java Persistence API (JPA) (28)
        • Web (42)
        • Rest Api (7)
        • Spring Concurrency Control (3)
        • Redis (8)
        • Kubernetes (k8s) (4)
        • MYSQL (35)
        • AirFlow (15)
        • Docker (2)
        • Git (22)
        • Linux (9)
        • JSON Web Tokens (JWT) (4)
        • Troubleshooting (88)
        • Swagger (0)
        • Vue.js (52)
        • Java (74)
        • html (12)
        • C (5)
        • jQuery (15)
        • JavaServer Pages (JSP) (17)
        • Arduino (1)
        • JavaScript (35)
        • Amazon Web Services (AWS) (11)
        • Algorithm (9)
        • 참고 기능 (18)
        • mongo (2)
      • PROJECT (27)
        • 스프링부트+JPA+몽고 API 개발 (3)
        • MINI (2)
        • 게시판 (3)
        • vue 프로젝트 (1)
        • JPA 사이드 프로젝트 기록 (17)
      • TEAM STUDY (156)
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (8)
        • 한 권으로 읽는 컴퓨터 구조와 프로그래밍 (12)
        • NAVER DEVELOPER (4)
        • LINUX (23)
        • PYTHON (19)
        • SERVER (8)
        • 알고리즘 코딩 테스트 스터디 (31)
        • 쿠버네티스 (40)
        • 대세는 쿠버네티스 [초급~중급] (11)
      • BOOK (0)
      • 자격증 (61)
        • 리눅스 1급 - 필기 기록 (19)
        • 네트워크 관리사 (2)
        • 네트워크 관리사 2급 - 실기 기록 (21)
        • 네트워크 관리사 2급 - 필기 기록 (16)
        • 정보처리 (2)
      • 직장인 대학원 (28)
        • 기록 (3)
        • 캐글 스터디 (3)
        • R (12)
        • MLOps (10)
      • 논문 (5)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    리눅스 마스터 1급 요약
    네트워크 관리사
    VUE
    네트워크 관리사 2급
    스프링
    파이썬 알고리즘
    docker
    네트워크 관리사 2급 실기
    REST API
    리눅스 마스터 1급 정리
    java
    springboot
    네트워크 관리사 학점
    리눅스 마스터 요약
    Git 저장소
    네트워크 관리사 실기
    쿠버네티스 스터디
    리눅스 마스터 1급
    쿠버네티스
    리눅스 마스터
    알고리즘
    BackendDevelopment
    네트워크 관리사 자격증
    jpa
    네트워크 관리사 요약
    리눅스 1급 요약
    Spring
    파이썬
    redis
    git
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
Redis Pub/Sub 기반 SSE 실시간 알림 삽질 통해 구현하기.
상단으로

티스토리툴바