본문 바로가기

Programming/System Design

메세지 브로커: In-Memory vs Log-Based

이 글은 메세지 브로커가 무엇인지, 메세지 브로커 종류에 대해 설명한다. (아래 영상을 참고했다.)

Message Broker(메세지 브로커)는 최신 분산 애플리케이션 아키텍처의 필수 기능 중 하나이다. 비동기적으로 메세지를 교환할 수 있는 기능을 제공한다. 대표적으로 RabbitMQ와 Kafka가 있으며 AWS에서는 SQS, Kinesis와 같은 서비스가 많이 사용된다. 메세지 브로커는 크게 두 개의 종류가 있다.

In Memory Message Broker

  • 모든 이벤트를 메모리에서 들고있다
  • Queue(Linked List 혹은 메모리에 Array 형태)에 각각의 이벤트가 저장되어 있고, 하나의 이벤트가 Consumer에게 전달되면, 전달된 이벤트는 (일시적으로) 삭제된다.
  • Consumer로부터 Acknowledgement(확인 응답)이 오면, 이벤트가 완벽하게 삭제된다.
  • 그렇다면 Queue의 순서대로 이벤트가 처리되는가? → 아니다.
  • Consumer가 여러 개인 경우, Queue의 이벤트들이 나눠서 분산되어 처리되므로 순서대로 처리되지 않는다.
  • Consumer 1로 보내진 이벤트가 처리될 때까지 기다리지 않고 Consumer 2로 다음 이벤트를 전송한다. ⇒ Round Robin 방식
    • Round Robin: 프로세스들 사이에서 우선 순위를 두지 않고, 순서대로 시간 단위로 CPU를 할당하는 방식

  • 장점
    • Round Robin 방식을 통해 Throughput 극대화
    • Throughput: 단위 시간동안 네트워크를 통해 전송된 데이터의 양
  • 단점
    • Queue의 순서대로 이벤트 처리가 보장되지 않는다.
    • 성공적으로 프로세싱되었을 때, 메모리/GC에서 삭제해버린다
      • Fault Tolerant(장애가 발생하더라도 시스템 중단없이 계속 동작할 수 있게 하는 것)가 좋지 못함
      • 삭제하므로 동일한 이벤트를 또 처리할 수 없다.
  • 순서를 보장하려면? Fan-out
    • 여러 개의 Consumer를 두는게 아니라, n개의 queue와 n개의 consumer를 두고 1대1 매칭을 시키는 것이다. 하지만 Throughput 극대화의 목적에는 맞지 않는 방법이다.

Log based Message Broker

  • 메세지들이 Disk에 저장되고, Sequential Write(순차 쓰기) 속도 지원
  • 메세지가 들어온 순서대로 처리된다.
  • 메세지 브로커는 각 consumer가 마지막으로 읽은 메세지의 위치를 기억한다.

 

  • Throughput 극대화 하고싶다면?
    • Message Broker를 한 개 더 만들어서 하나의 Consumer를 새로 생긴 메세지 브로커를 처리하도록 한다.
  • 장점
    • 메세지들이 durable(내구성있음)하다.
      • 디스크에 저장됨 → 시스템이 다운되더라도 문제없음
      • 한 번 읽고나서도 삭제하지 않는다. → 다시 읽어야하는 일이 생길때 그냥 다시 읽으면 된다
  • 단점
    • 순서대로 읽어야하므로, 중간에 특정 메세지가 처리하는데 오래 걸리면, 그 시간만큼 기다려야한다.

결론

  • In-Memory
    • Throughput 극대화
    • 메모리로부터 읽고 쓰기 빠름
    • round robin 방식으로 메세지를 읽고 처리하는데에 있어서 병목이 없다. → 하나의 Consumer가 메세지 처리를 끝내면 다음 메세지를 가져와서 바로 작업할 수 있다.
    • 예제
      • 유투브: 여러 사용자가 유투브에 영상을 업로드할 때 유투브 서버는 인코딩이 빨리 끝나는 업로드부터 처리해줘야한다. / 인코딩 작업을 또 할 필요가 없으며, 최대한 많은 인코딩된 영상을 올려서 Throughput 극대화해야하며, 순서를 보장하지 않아도 된다.
      • 트위터: 팔로워들의 뉴스피드 캐시에 전송될 트윗을 업로드할 때 / 순서보장될 필요없음
  • Log Based
    • Queue에 있는 모든 아이템들을 하나의 consumer로, 순서대로 처리
    • 예제
      • 센서 측정 시스템: 가장 최근 20개의 결과 통계 내기 → 순서 보장되어야 함 / 특정 기간의 결과 통계 내기 → 메세지에 다시 접근할 수 있음
      • 검색 인덱스에 추가할 값을 데이터베이스에 작성: Change Data Capture → DB 순서 보장되어야 함, 순서에 따라서 결과값이 달라짐
반응형