채팅방의 메인 저장소 부재로 서버의 메모리에 적재된 채팅방은 서버를 재시작할 때마다 초기화 되는 이슈 발생
채팅서버가 여러개일 경우 서버간 채팅 공유 불가
⇒ 공통으로 사용가능한 pub/sub 시스템을 구축하고 모든 서버들이 해당 시스템을 통해 pub/sub 메시지를 주고받도록 변경해야 한다. (Redis 활용)
출처: https://medium.com/frientrip/pub-sub-잘-알고-쓰자-de9dc1b9f739
@RequiredArgsConstructor
@Service
public class RedisPublisher {
private final RedisTemplate<String, Object> redisTemplate;
public void publish(ChannelTopic topic, ChatMessage message) {
redisTemplate.convertAndSend(topic.getTopic(), message);
}
}
@Slf4j
@RequiredArgsConstructor
@Service
public class RedisSubscriber implements MessageListener {
private final ObjectMapper objectMapper;
private final RedisTemplate redisTemplate;
private final SimpMessageSendingOperations messagingTemplate;
/**
* Redis에서 메시지가 발행(publish)되면 대기하고 있던 onMessage가 해당 메시지를 받아 처리한다.
*/
@Override
public void onMessage(Message message, byte[] pattern) {
try {
// redis에서 발행된 데이터를 받아 deserialize
String publishMessage = (String) redisTemplate.getStringSerializer().deserialize(message.getBody());
// ChatMessage 객채로 맵핑
ChatMessage roomMessage = objectMapper.readValue(publishMessage, ChatMessage.class);
// Websocket 구독자에게 채팅 메시지 Send
messagingTemplate.convertAndSend("/sub/chat/room/" + roomMessage.getRoomId(), roomMessage);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}