Spring Boot 기반 Redis Pub/Sub 구현: 분산 환경에서 Pod 간 이벤트 처리

2024. 11. 16. 13:04·개발중/Spring Boot & Redis
728x90
반응형

목적

오늘은 Spring Boot 기반 프로젝트에서 Redis Pub/Sub을 설정하는 코드를 구현하려고 한다.

 

환경

분산 처리 환경(API들이 Pod로 분산 처리됨)에서 Redis를 Session Storage로 사용한다.

 

목표

특정 Pod에서 이벤트가 발생하면, Redis Pub/Sub을 통해 모든 Pod에 이벤트를 전달하는 구조를 구현한다.

 

구현

채널 구독

Redis Config 파일에 RedisMessageListenerContainer 를 Bean 등록해서 아래와 같이 PatternTopic 으로 채널을 구독한다.

여기서 채널을 구독하지 않으면 메세지를 수신할 수 없으니 유의하자.

 

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

 

 

참고로 단일 또는 다중 채널을 구독할 수 있다.

new PatternTopic("SOOBIN_CHANNEL*")  > SOOBIN_CHANNEL 으로 시작하는 채널을 모두 구독한다.

new PatternTopic("SOOBIN_CHANNEL") > SOOBIN_CHANNEL 과 일치하는 채널을 모두 구독한다.

 

메세지 발신

"SOOBIN_CHANNEL" 채널에 메세지를 발행한다.

 

private final RedisTemplate<String, Object> redisTemplate;

public void publishToChannel(Object message) {
    redisTemplate.convertAndSend("SOOBIN_CHANNEL", message);
}

 

 

메세지 수신

"SOOBIN_CHANNEL" 채널을 구독하고 메세지를 수신한다.

 

MessageListener 를 상속 받아서 메세지를 수신하는 RedisMessageSubscriber.onMessage 를 구현한다.

CANNEL_PREFIX 와 일치하는 채널에서 메세지가 수신되면 RedisMessageSubscriber.onMessage 에서 메세지를 받을 수 있다.

 

MessageListener의 주된 역활은 아래와 같다.
- 메세지 구독메세지 브로커에서 발행된 메세지를 구독한다.
- 메세지 처리수신된 메세지에 대한 로직을 수행한다.
- 비동기 처리메세지를 비동기적으로 처리하므로 수신자는 메세지가 들어올 때까지 대기 상태에 있지 않는다.

 

@Service
@RequiredArgsConstructor
public class RedisMessageSubscriber implements MessageListener {

    private final static String CHANNEL_PREFIX = "SOOBIN_CHANNEL";

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

        // 채널
        String channel = new String(message.getChannel());

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

    }
}

 

 

MessageListener 를 상속받은 RedisMessageSubscriber 을 Redis Confing Class 에 MessageListenerAdpter 를 Bean 으로 등록해야한다.

 

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

 

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

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

Redis Pub/Sub 기반 SSE 실시간 알림 삽질 통해 구현하기.  (0) 2024.09.24
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' 카테고리의 다른 글
  • Redis Pub/Sub 기반 SSE 실시간 알림 삽질 통해 구현하기.
  • 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)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
Spring Boot 기반 Redis Pub/Sub 구현: 분산 환경에서 Pod 간 이벤트 처리
상단으로

티스토리툴바