Zero To One

2) 마이크로서비스 정리 본문

마이크로서비스

2) 마이크로서비스 정리

Zero_To_One 2022. 4. 12. 11:09

1. 메세지 서비스로 Apache Kafka와 Amazon SQS, Amazon Kinesis가 있다. 각각은 어떤 차이점이 있을까?

Amazon SQS

  • 서비스형
  • 소비자가 큐에서 데이터를 땡겨오는 방식 (pull)
  • 데이터는 소비되고 나서 삭제됨
  • 많은 소비자를 붙일 수 있음
  • 처리량에 대한 프로비저닝 불필요
  • FIFO(first in first out, 선입선출)큐를 이용하면 순서를 보장함
  • 개별 메시지에 대한 지연 전송 가능

Amazon Kinesis

  • 서비스형
  • Pull방식 및 Push 방식 둘다 사용가능 (push : 메시징 시스템이 소비자에게 메시지를 전달)
  • 스트림 데이터와 같은 빅데이터를 다루는데 더욱 유리
  • 데이터 소비 행위 자체를 replay할 수 있음(이벤트 스트림 재생)
  • 데이터를 바로 삭제하지 않고 며칠 후에 만료되도록 설정할 수 있음
  • 처리량에 대한 프로비저닝 필요

Apache Kafka

  • 설치형
  • Pull방식 (높은 처리량과 낮은 지연시간)
  • 스트림 데이터와 같은 빅데이터를 다루는 데 더욱 유리
  • 데이터 소비 행위 자체를 replay할 수 있음 (이벤트 스트림 재생)
  • 데이터를 바로 삭제하지 않고 며칠 후에 만료되도록 설정할 수 있음

언제 무엇을 사용하면 되는가?

  • 메시지 큐를 간단하게 사용하려면 SQS
  • 스트림 데이터를 다루거나, 빅데이터를 다룰 때, 혹은 로그 저장소로써 메시지 브로커를 사용하려면 Kafka
    • (현업에서 가장 많이 사용함)
  • 돈 걱정을 안해도 된다면 Kinesis

 

2. 웹 서비스에서 메시지 브로커(메시지 큐)를 이용해 비동기적인 방법이 활용되는 사례와 어떻게 활용이 되는가?

- 두가지 패턴의 프로세스 간 통신(IPC)

  • 동기 커뮤니케이션 (애플리케이션 -> 애플리케이션)
  • 비동기 커뮤니케이션 (이벤트기반), (애플리케이션 -> 큐 -> 애플리케이션)

- 느슨한 결합(loose coupling)이 주는 장점

  • 프로세스 간의 의존성을 줄일 수 있음
    • 시스템을 유지보수하기 쉽게 만듦
    • 시스템의 유연성이 증가됨
    • 보다 쉽게 서비스를 테스트할 수 있음
    • 일부 시스템의 실패가 전체 시스템의 실패로 이어지지 않음
  • 프로그래밍 세계에서는 항상 느슨한 결합이 주된 관심사
    • UI (frontend) : 컴포넌트화
    • 객체 지향 프로그래밍(backend) : 의존성 주입 (Dependency Injection)
    • 마이크로서비스 : 메시징 시스템을 이용한 비동기 커뮤니케이션
  • 항상 REST API를 사용하면 중간에 메세지가 소실되면 컨슈머에게 도달할 수 없기 때문에 느슨한 결합이 중요하다.

- Queue의 사례 

  • 프린터
    • 일반적으로 프린터는 속도가 느림
    • CPU는 프린터와 비교하여, 데이터를 처리하는 속도가 빠름
    • 따라서, CPU는 빠른 속도로 인쇄에 필요한 데이터를 만든 다음 인쇄 작업 Queue에 저장하고 다른 작업을 수행함
    • 프린터는 인쇄 작업 Queue에서 데이터를 받아 일정한 속도로 인쇄
  • 컴퓨터 장치 사이
    • 컴퓨터 장치 사이에서 데이터를 주고받을 때, 각 장치 사이에 존재하는 속도의 차이 시간 차이 극복하기 위해 임시 기억장치의 자료구조 Queue를 사용
  • 이를 통틀어 버퍼, 과장 자체를 버퍼링이라 부른다
    • 1GB 이상의 동영상 파일들이 재생되기에 충분하지 않는 경우 발생하는 것 (유튜브의 회색바..)
  • 데이터가 버퍼로 끊임없이 흐르는 것 : 스트리밍

- 메세지 큐가 필요한 실제 사례

  • O2O (online to offline) 서비스를 구현할 때 (마켓컬리, 쿠팡 등등)
    • 컴퓨터가 할 수 있는 일은 대부분 수평확장으로 해결 가능
    • 그러나, O2O 서비스는 결국 사람이 해야 하므로, 주문 메시지를 메시지 큐에 모아놓고, 이벤트를 처리하는 주체가 주문을 차근차근 진행해야함
  • 빠른 응답속도를 필요로 할 때
    • 주(main) 작업과 별도로 처리되어도 상관 없고, 실시간성을 요구하지 않는 태스크
      • 메세지큐에 다 밀어넣어놓고 하나하나 처리하면서 알림을 받는 것들
    •