레디스 웹소켓 알람 동기화

웹소켓 알람 갱신 동기화

대부분의 예제는 채팅으로 공유되고 있지만 일반적인 웹 애플리케이션에서의 웹소켓 기능은 서버에서 클라이언트로의 알람과 이벤트를 즉시 전달하기 위해서 사용하고 있을 것이다. 단일 애플리케이션에서는 고려하지 않아도 될 부분이지만 스케일 아웃되어 분산 처리되는 애플리케이션에 각각 연결된 웹소켓으로 특정 서버에서 발생하여 만들어지는 알람 정보를 즉시 전달하기 위해서는 전파하고 동기화하는 방안이 필요하다. Redis(Pub/Sub)로 로컬 캐시 동기화하기와 비슷하다.

@Slf4j
@SpringBootApplication
public class Application implements MessageListener {
    private static final ChannelTopic topic = ChannelTopic.of("NOTIFICATIONS");

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Autowired
    public StringRedisTemplate redisTemplate;

    @Bean
    public CommandLineRunner commandLineRunner() {
        return args -> redisTemplate.convertAndSend(topic.getTopic(), "REQUIRE.SYNC");
    }

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(this, topic);
        return container;
    }

    @Bean
    public MessageListenerAdapter listenerAdapter() {
        return new MessageListenerAdapter(this);
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
        log.info("receive: {}", message);
    }
}

활용 클래스 목록

레디스에 의한 Pub/Sub을 구현하기 위해서 사용되는 스프링 프레임워크 클래스들은 아래와 같다.

  • RedisMessageListenerContainer
  • RedisConnectionFactory
  • MessageListenerAdapter
  • MessageListener
  • StringRedisTemplate
  • ChannelTopic

참고 링크