[HEY-TOSS-ME] 채팅 기능 - 1

허진혁·2023년 3월 12일
0

프로젝트에서의 기능 방향

채팅 기능 RabbitMQ라는 외부 브로커를 활용하여 WebSocket 프로토콜을 통해 구현하려고 한다.
해당 프로젝트에서 채팅은 아래와 같은 사항을 요구하고 있다.

  1. 사용자간 대화를 위한 잦은 메세지 데이터 송수신
  2. 1:1 채팅방이 여러개 만들어 질 수 있음
  3. 채팅 기능만 있는 것이 아니기 때문에 부하 분담이 필요함

위와 같은 요구 사항을 만족 시키기 위해 사용 기술은 다음과 같은 순서로 변경 및 수정 되었다.

  1. WebSocket : 양방향 통신을 통한 데이터 송수신
  2. STOMP : Binding을 통해 채팅방을 구분하여 Queue에 메세지 전달
  3. RabbitMQ : 서버 부하를 분담하기 위한 외부 브로커

RabitMQ?

RabbitMQ를 이해하기 위해서는 amqp라는 것을 이해해야 한다.
amqp는 advaced message queuing protocol의 약자로 메세지 프로토콜이다.

이 프로톨의 라우팅 동작을 위해 아래와 같은 세 가지 추상 컴포넌트를 알아보자

  1. Exchange : 메세지 브로커에서 큐에 메세지를 전달하는 컴포넌트
    -> 다양한 라우팅 규칙이 존재
    ⅰ) Direct exchange
    ⅱ) Fanout exchange
    ⅲ) Topic exchange
    ⅳ) Headers exchange
  2. Queue : 메세지를 추가 및 소비하는 디스크 혹은 메모리 상의 자료구조
  3. Binding : Exchange와 Queue가 어떤 관계에 있는지를 정의하는 컴포넌트

위 추상 컴포넌트를 활용하여 메세지가 전달 되는 방식은 다음과 같다.

  1. 회원이 메세지를 Exchange에게 puliblish 한다.
  2. Exchange는 Binding 규칙에 맞게 Queue에 메세지를 라우트한다
    -> 여기서 실제 메세지를 저장하는 것이 아닌 복사본을 Queue에 라우트하여 최종적으로 클라이언트에는 참조 주소만 전달 된다.
  3. broker는 Queue에 저장된 메세지를 구독하고 있는 회원에게 전달한다.

다음 내용부터 어떻게 코드를 구현할 것인지 생각하며 작성해보자

출처

  1. https://www.rabbitmq.com/tutorials/amqp-concepts.html
  2. https://devahea.github.io/2019/04/30/AMQ-%EB%AA%A8%EB%8D%B8%EA%B3%BC-Exchange-Queue-Binding-%EC%97%90-%EB%8C%80%ED%95%B4/
profile
멈추지 않는 개발자입니다.

0개의 댓글