본문 바로가기
ETC/System Design

[채팅 시스템] 특정 키워드에 대해 시스템 메세지 보내기

by devson 2022. 9. 13.

채팅 서비스가 처음에는 단순히 유저 간에 메세지를 주고받기 위함이었어도,

서비스가 고도화 되다보면 꼭 채팅 도메인과는 관련되지 않아도 서비스와 관련하여 유저의 주의를 끌기 위해 몇가지 기능이 추가될 수 있다.

 

그 중 하나로는 채팅방에 특정 키워드가 발생했을 때 해당 채팅방에 시스템 메세지를 보내는 기능이 있다.

실제 사례를 예로 들자면 당근마켓의 채팅 시스템 메세지 기능이 있을 것이다.

출처: https://platum.kr/archives/154421

 

이처럼 채팅 도메인과는 약간 동떨어졌지만 채팅 시스템과 통합되어야하는 기능에 대해 어떤 식으로 시스템을 설계할지에 대해 정리해본다.

 


 

먼저 채팅을 위한 웹소켓 서버의 경우 Scaling을 위해 Message Queue나 Redis Pub/Sub 등을 사용하여

다른 웹소켓 서버와 연결된 유저에게 메세지를 보낼 것이다.

 

메세지 전송
메세지 수신

 

위와 같은 시스템에서 특정 키워드가 발생했을 때 해당 채팅방에 시스템 메세지를 보내는 방법으로 가장 쉬운 방식은

채팅 웹소켓 서버에서 직접 특정 키워드가 있는지 확인하고, 키워드가 있다면 시스템 메세지를 보내도록 처리하는 것이다.

채팅 웹소켓 서버에서 직접 키워드를 확인하는 방식

위와 같이 직접 확인하는 경우, 매우 심플하게 처리할 순 있지만 유사한 기능이 계속 추가될 수록 채팅 웹소켓 서버가 갖는 역할이 너무 많아질 수 있고, 이로인해 채팅 기능이 다른 도메인 기능으로 인해 비대해질 수 있다.

 

 

또 다른 방식은 Message Queue를 통해 특정 키워드에 대해 실행되야하는 기능을 담당하는 서비스와 채팅 서비스와의 의존성을 느슨하게 만드는 것이다.

 

먼저 아래와 같이 채팅 웹소켓 서버에서 Message Queue로 보낸 채팅 메세지를 다른 서비스에서 또다른 Consumer/Subscriber로써 가져온다.

(AWS SQS를 쓰는 경우 새로운 SQS queue를 만들고 SNS를 통해 새로운 SQS queue에도 메세지를 보내주도록 설정해야 것이다)

 

그리고 해당 서비스에서 특정 키워드가 있는지를 확인하여

- 채팅 메세지를 보내는 Message Queue에 직접 시스템 메세지를 보내거나,

- 채팅 웹소켓 서버의 API를 통해 시스템 메세지를 보내도록 한다.

 

이렇게 함으로써 채팅 도메인에서는 채팅과 직접적으로 관련된 기능만을 관리하면서도, 추가적으로 채팅과의 통합이 필요한 다른 도메인의 기능을 더해갈 수 있다.

하지만 앞서 살펴본 채팅 웹소켓 서버에서 직접 처리하는 방식에 비해 시스템이 더 복잡해지고, 어쩌면 인프라를 추가로 구성해야할 수도 있다.

 

그렇기 때문에 상황에 맞게 적정 아키텍처를 선택할 수 있는 혜안이 필요하다.

개인적으로 모든 개발 팀원이 채팅 서비스를 관리하는 경우라면 앞서 방식을 취하되 어떤 기능들이 있는지를 잘 정리해두고,

개발 팀이 커져감에 따라 채팅 서비스를 관리하는 팀이 따로 떨어져 나갔을 때 이를 분리하는 전략을 취하는 방식이 좋을 것 같다.

댓글