클론코딩 - slack

websocket-stomp , redis(pub,sub)

현딴딴 2022. 2. 24. 01:48

 pub sub 구조

 

 보내는 사람이 받는사람을 직접적으로 설정하지 않고 메세지를 발행한다.

  '발행(publish)' 은 불특정 다수에게 메세지를 뿌린다고 보면 된다.

 구독 하는 수신인은 (Subscriber)  생성된 (publish) 메세지를 모두 가져오는게 아니라,

 자신이 원하는 메세지만을 취하게 되는데 독자가 불특정 다수에게 뿌린 메세지들이

 특정 수신인에게만 전달되도록 중간 처리가 되고 있다는 것이다.

 이것을 Filtering 이라고한다.

 

 이 Filtering을 하는 방법에는 크게 두가지가 있다.

     # Topicbase

         발행자가 메세지를 발행할 때, 특정 토픽class 를 지정해놓아서 

         특정 토픽 클래스를 구독해놓은 수신자가 읽을 수 있도록 한다.

     # Contentbase

         발행자가 별다른 셋팅을 하지 않는다.

         수신자가 자신이 관심잇는 내용이 있다면 가져다 읽도록 한다.

 

pubsub구조

  publisher < = 메세지브로커 = > subscriber 형태 로 되어있다.

 

  수신인은 자신이 관심잇는 Topic 이나 Content 를 메세지 브로커에 등록해놓는다. 

  publisher가 메세지를 발행하면 메세지 브로커에게 메세지가 전송되고,

  알맞은 수신인에게 가게 되는 형태이다. 

 

 

REDIS

Redis의 PUB/SUB 모델

Redis에는 그룹이라는 개념이 존재하지 않고, 각 subscriber가 channel을 구독하고 있다. 이때 중요한 점은, Channel은 이벤트를 저장하지 않는다는 것이다. 만일 Channel에 이벤트가 도착했을 때, 해당 채널의 Subscriber가 존재하지 않는다면, 이벤트는 사라진다.

Redis의 Channel은 말 그대로, TV의 Channel을 생각하면 된다. 하루 종일 TV에서는 수백 개의 채널에서 방송이 방영된다. 각 방송사(Publisher)에서 방영하는 라이브 방송은, 해당 채널을 시청 중일 때만 볼 수 있다. 또한 같은 시간대에 같은 채널의 시청자(Subscriber)들은 모두 같은 방송을 볼 수 있다.

물론 위의 예시에서 다 담지 못하는 부분도 있다. subscriber는 동시에 여러 Channel을 구독할 수 있으며, 특정한 채널을 지정하지 않고 ‘패턴’을 설정하여 해당 패턴에 맞는 채널을 구독할 수도 있다.

 

https://medium.com/frientrip/pub-sub-%EC%9E%98-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-de9dc1b9f739

 

PUB/SUB, 잘 알고 쓰자!

Kafka와 Redis 사이에서 고민하는 당신을 위한 글

medium.com

 

 

 

 

 

STOMP기반 메세지 송출 예시 

 

1. WebSocketConfig 파일

 

registerStompEndpoints에서 기존의 WebSocket 설정과 마찬가지로 handshake와 통신을 담당할 endpoint를 지정한다. 

configureMessageBroker에서 Application 내부에서 사용할 path를 지정할 수 있다.

enableSimbleBroker는 클라이언트에서 sub로 전달받아 메모리에 저장하고, 구독하고있는 client에게 메세지를 보낸다. 

setApplicationDestinationPrefixes는 서버에서 클라이언트로부터 메세지를 받을 api의 prefix를 설정한다.

websockconfig pub부분이 chatmessagemapping("url")으로 들어감

 

configureClientInboundChannel - StompHander가 token과 메시지type등을 체크할 수있도록 인터셉터를 설정함.

 

2.StompHander - token을 검증하고 입장 및 퇴장처리

 

3.채팅방 dto

4.채팅방 controller

 

5. 채팅방 service

 

6.redissubscriber

프론트에서 메세지를 send하면 redis의 subscriber에서 메세지를 받아서 처리한다.

objectMapper.readValue 에서  String을 ChatMessage의 클래스로 변환한다. 

그리고 mseaagingTemplate.converAndSend에서 destination주소로 chatmessage를 프론트에 보내준다. 

 

7.redisconfig