카테고리 없음

redis ,kafka 를 이용한 게시물 댓글,좋아요

jw-backend 2024. 7. 1. 21:37
반응형

Redis 설정 클래스

 

java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;

@Configuration
public class RedisConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory("localhost", 6379);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory());
        return template;
    }
}

WebSocket 설정 클래스

WebSocket 설정 클래스에서 Redis를 메시지 브로커로 사용하도록 수정합니다.

java

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableStompBrokerRelay("/topic", "/queue")
              .setRelayHost("localhost")
              .setRelayPort(6379);
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS();
    }
}

Kafka 메시지 리스너 및 WebSocket 메시지 전송

Kafka 메시지 리스너는 기존과 동일하게 유지합니다.

java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Service;

@Service
public class KafkaConsumerService {

    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    @KafkaListener(topics = "your_topic", groupId = "group_id")
    public void consume(String message) {
        // 메시지를 WebSocket 클라이언트에게 전송
        messagingTemplate.convertAndSend("/topic/your_topic", message);
    }
}

위의 설정에서 configureMessageBroker 메서드 내의 enableStompBrokerRelay 메서드를 사용하여 Redis를 메시지 브로커로 설정합니다. 이 설정은 Redis 서버가 메세지 브로커 역할을 하도록 구성하며, WebSocket 메시지가 Redis를 통해 전달됩니다.

이렇게 설정하면 클라이언트는 Redis 브로커를 통해 메시지를 수신하게 됩니다. Redis 브로커를 사용하면 확장성이 향상되며, 여러 인스턴스 간의 메시지 전달이 용이해집니다.