코드몬스터 2024. 8. 12. 23:18
728x90

3단계: 상세 설계

6. 푸시 vs 풀

브로커가 데이터를 소비자에게 보낼 것이냐 아니면 소비자가 브로커에게 가져갈 것인지 고민해야하는 부분이다.

푸시 모델

잠정

  • 낮은 지연: 브로커는 메세지를 받는 즉시 소비자에게 보낼 수 있다.

단점

  • 소비자가 메세지를 처리하는 속도가 생산자가 메세지를 만드는 속도보다 느릴 경우, 소비자에게 큰 부하가 걸릴 가능성이 있다.
  • 생산자가 데이터 전송 속도를 좌우하므로, 소비자는 항상 그에 맞는 처리가 가능한 컴퓨팅 자원을 준비해두어야 한다.

풀 모델

장점

  • 메세지를 소비하는 속도는 소비자가 알아서 결정한다.
  • 소비자는 지난번 마지막으로 가져간 로그 위치 다음에 오는 메세지를 한 번에 가져갈 수 있다. 따라서 데이터의 공격적 일괄 처리에 더 적합하다.

단점

  • 브로커에 메시지가 없어도 소비자는 계속 데이터를 끌어가려 시도할 것이기 때문에, 소비자 측 컴퓨팅 자원이 낭비된다.
    • 해당 문제를 해결하기 위해 롱 풀링 모드를 지원한다.

7.  소비자 재조정

어떤 소비자가 어떤 파티션을 책임지는지 다시 정하는 프로세스이다.

해당 절차는 코디네이터가 중요한 역할을 한다.

  • 코디네티어는 소비자 재조정을 위해 소비자들과 통신하는 브로커 노드이다.
  • 소비자로부터 오는 박동 메세지를 살피고 각 소비자의 파티션 내 오프셋 정보를 관리한다.

몇 가지 재조정 시나리오를 예시 들어주고 있지만, 그 중 소비자 B가 그룹에 합류한 경우의 처리 흐름을 살펴본다.
(소비자 수는 2로 가정하고, 토픽에 파티션은 4개로 가정한다.)

  1. 소비자 A만 있는 상태이고, 소비자 A는 모든 파티션의 메세지를 소비하며 코디네이터에게 박동 메세지를 보낸다.
  2. 소비자 Brk 그룹에 합류를 요청한다.
  3. 코디네이터는 소비자 재조정이 필요한 시점이라고 판단하고 모든 소비자에게 수동으로 사실을 통지한다. 소비자 A의 박동 메세지가 왔을 때 그 응답으로 그룹에 다시 합류하라고 알린다.
  4. 모든 소비자가 그룹에 다시 합류하면 하나의 소비자를 리더로 선출하고 모든 소비자에게 알린다.
  5. 리더는 파티션 배치 계획을 생성한 다음 코디네이터에게 보낸다. 리 더 외 소비자는 코디네이터에게 요청하여 파티션 배치 계획을 받아온다.
  6. 소비자는 자신에게 배치된 파티션에서 메세지를 가져온다.

8.상태 저장소

메세지 큐 브로커의 상태 저장소에는 아래 정보가 저장된다.

  • 소비자에 대한 파티션의 배치 관계
  • 소비자 그룹이 각 파티션에서 마지막으로 가져간 메세지의 오프셋

소비자 상태 정보 데이터가 이용하는 패턴

  • 읽기와 쓰기가 빈번하게 발생하지만 양이 많지 않다.
  • 데이터 갱신은 빈번하게 일어나지만 삭제되는 일은 거의 없다.
  • 읽기와 쓰기 연산은 무작위적 패턴을 보인다.
  • 데이터의 일관성이 중요하다.

키-값 저장소를 이용하는 것이 바람직해 보이지만, 카프카는 카프카 브로커에 저장하고 있다.

9.메타데이터 저장소

  • 메타데이터 저장소에는 토픽 설정이나 속성 정보를 보관한다.
  • 파티션 수, 메세지 보관 기간, 사본 배치 정보 등이 해당 된다.
  • 자주 변경되지 않으며 양도 적지만 일관성을 요구하기 때문에 보관하기에는 주키퍼가 적절하다.

10.주키퍼

주키퍼는 키-값 저장소 기능을 제공하는, 분산 시스템에 필수적인 서비스이다.

 

  • 메타데이터와 상태저장소는 주키퍼를 이용해 구현한다.
  • 브로커는 메세지 데이터 저장소만 유지한다.
  • 주키퍼가 브로커 클러스터의 리더 선출 과정을 돕는다.

11.복제

분산 시스템에서 하드웨어 장애는 흔한 일이므로 무시해서는 안 된다.

이러한 문제를 해결하고 높은 가용성을 보장하기 위해 전통적으로 많이 사용된 방법이 바로 복제(replication)이다.

 

생산자는 파티션에 메세지를 보낼 때 리더에게만 보낸다.

다른 사본은 리더에게 새 메세지를 지속적으로 가져와 동기화 한다.

메세지를 완전히 동기화한 사본의 개수가 지정된 임계값을 넘으면 리더는 생산자에게 메세지를 잘 받았다는 응답을 보낸다.

 

12. 사본 동기화

메시지가 소실되는 것을 막기 위해 여러 파티션에 두며, 각 파티션은 다시 여러 사본으로 복제한다. 

여기서 풀어야하는 문제는 모두를 어떻게 동기화 시킬 것인가 하는 점이다.

 

동기화된 사본(In-Sync Replicas, ISR)은 리더와 동기화된 사본을 일컫는 용어이다.

'동기화되었다'는 것은 토픽의 설정에 따라 달라진다.

 

ISR은 성능과 영속성 사이의 타협점이다. 생산자가 보낸 어떤 메세지도 소실하지 않는 가장 안전한 방법은 생산자에게 메세지를 잘 받았다는 응답을 보내기 전에 모든 사본을 동기화하는 것이다.

 

메세지 수신 응답 설정을 살펴보자.

생산자는 K개의 ISR 메세지를 받았을 때 응답을 받도록 K 값을 설정할 수 있다.

 

ACK=all

  • 생산자는 모든 ISR 메세지를 수신한 뒤에 ACK 응답을 받는다.
  • 가장 느린 ISR 응답을 기다려야 하므로 메세지를 보내기 위한 시간이 길어진다.
  • 메세지의 영속성 측면에서는 좋은 구성이다.

ACK=1

  • 생산자는 리더가 메세지를 저장하고 나면 바로 ACK 응답을 받는다.
  • 데이터가 동기화 될 때까지 기다리지 않으니 응답 지연은 개선된다.
  • ACK를 보낸 직후 리더에 장애가 생기면 해당 메세지는 다른 사본에 반영되지 못하였으므로 복구할 길이 없이 소실된다.
  • 데이터가 사라져도 상관없는 낮은 응답 지연을 보장해야 하는 시스템에 적합하다.

ACK=0

  • 생산자는 보낸 메세지에 대한 수신 확인 메세지를 기다리지 않고 계속 메시지를 전송하며 어떤 재시도를 하지 않는다.
  • 지표 수집이나 데이터 로깅 등 처리해야 하는 메세지의 양이 많고 데이터 손실이 발생해도 상관 없는 경우에 좋다.

리더 사본에 요청이 너무 많이 몰리면 어떻게 될까? 왜 ISR 요건을 만족하는 사본에서 메세지를 가져가지 않을까?

  • 특정 파티션의 메세지는 같은 소비자 그룹 안에서는 오직 한 소비자만 읽어갈 수 있으므로 리더 사본에 대한 연결은 많지 않다.
  • 리더 사본에 대한 연결의 수는 그렇게 많지 않다.

보통 각 파티션 담당 리더는 자기 사본들이 어느 메세지까지 가져갔는지 추적하여 ISR 목록을 관리한다.

 

13.규모 확장성

생산자

  • 샌산자의 규모 확장성은 새로운 생산자를 추가하거나 삭제함으로써 쉽게 달성할 수 있다.

소비자

  • 소비자 그룹은 서로 독립적이므로 새 소비자 그룹은 쉽게 추가하고 삭제할 수 있다.
  • 같은 소비자 내의 소비자가 새로 추가/삭제되거나 장애로 제거되어야 하는 경우는 재조정 메커니즘이 맡아 처리한다.
  • 소비자 측의 규모 확장성과 결함 내성을 보장하는 것이 바로 소비자 그룹과 재조정 메커니즘이다.

브로커

  • 파티션의 모든 사본이 같은 브로커 노드에 있으면 해당 노드에 장애가 발생할 경우 파티션은 완전 소실될 것이다.
  • 파티션의 모든 사본에 문제가 생기면 해당 파티션의 데이터는 영원히 사라진다.

파티션

  • 파티션 수의 조정은 생산자와 소비자의 안전성에는 영향을 끼치지 않는다.

 

14.메세지 전달 방식

1) 최대 한번

메세지가 전달 과정에서 소실되더라도 다시 전달 되는 일은 없다.

  • 생산자는 토픽에 비동기적으로 메세지를 보내고 수신 응답을 기다리지 않는다.
  • 소비자는 메세지를 읽고 처리하기 전에 오프셋부터 갱신한다. 오프셋이 갱신된 직후에는 장애로 죽으면 메세지는 다시 소비될 수 없다.

지표 모니터링 등 소량의 데이터 손실은 감수할 수 있는 애플리케이션에 적합

2) 최소 한번

메세지가 한 번 이상 전달될 수 있으나 메세지 소실은 발생하지 않는다.

  • 생산자는 메세지를 동기적/비동기적으로 보낼 수 있다. 즉, 메세지가 브로커에게 전달되었음을 반드시 확인한다.
  • 소비자는 데이터를 성공적으로 처리한 뒤에만 오프셋을 갱신한다.

데이터 중복이 큰 문제가 아니거나 소비자가 중복을 직접 제거할 수 있는 애플리케이션에서 괜찮은 전송 방식이다.

3) 정확히 한 번

사용자 입장에서는 편리하지만, 시스템의 성능 및 구현 복잡도 측면에서는 큰 대가를 지불해야한다.

지불, 매매, 회계 등 금융 관련 응용에서 해당 전송 방식이 적합하다.

15.고급 기능

1) 메세지 필터링

토픽은 같은 유형의 메세지를 담아 처리하기 위해 도입된 논리적 개념이다.

어떤 소비자 그룹은 특정한 세부/하위 유형의 메세지에만 관심이 있을 수 있다.

 

이러한 요구사항을 처리하는 방법은 각 토픽을 분리하는 것이지만 우려 사항이 있다.

  • 전용 토픽을 항상 만들 수 없다.
  • 같은 메세지를 여러 토픽에 저장하는 것은 자원 낭비이다.

메세지 필터링을 사용하면 이런 문제를 피할 수 있다.

 

브로커에게 메세지를 필터링하여 소비자는 원하는 메세지만 받을 수 있도록 하는 것이다.

필터링을 하기 위해 복호화나 역질렬화가 필요하다면 브로커 성능은 저하된다.

보호되어야 하는 데이터가 포함되어 있다면 메세지 큐에서 해당 메세지를 읽어서는 안된다.

 

메세지마다 태그 필드가 있으면 브로커는 해당 필드를 활용해 메세지를 필터링할 수 있다.

2) 메세지의 지연 전송 및 예약 전송

소비자에게 보낼 메세지를 일정 시간만큼 지연시켜야 하는 일이 있을 수 있다.

예를 들어, 주문을 넣은 후 30분 안에 결재가 이루어지지 않으면 해당 주문을 취소하고 싶다.

 

결재 완료 확인을 지시하는 메세지를 주문 시점에 바로 전송하되 큐 소비자에게는 30분 뒤에 전달되도록 해 두면, 소비자는 메세지를 받았을 때 결재 여부만 확인하면 된다.

 

이러한 멘세지는 토픽에 바로 저장하지 않고 브로커 내부 임시 저장소에 넣어 두었다가 시간이 되면 토픽으로 옮긴다.

이 시스템의 핵심 컴포넌트는 임시 저장소 및 타이밍 기능이다.

  • 하나 이상의 특별 메세지 토픽을 임시 저장소로 활용할 수 있다.
  • 타이밍 기능 기술 범주
    • 메세지 지연 전송 전용 메세지 큐를 활용한다.
    • 계층적 타이밍 휠을 사용하는 방안.

메세지 예약 전송 기능은 지정된 시간에 소비자에게 메세지를 보낼 수 있도록 하는 기능이다.

 

4단계: 마무리

면접 시간이 되면 다음 사항을 이야기 해보자.

  • 프로토콜: 분산 메세지 큐 시스템의 경우 다음 사항을 기술해야한다.
    • 메세지 생산과 소비, 박동 메세지 교환 등의 모든 활동을 설명해야 한다.
    • 대용량 데이터를 효과적으로 전송할 방법을 설명해야 한다.
    • 데이터의 무결성을 검증할 방법을 기술해야 한다.

유명한 프로토콜로는 AMQP, 카프카 프로토콜 등이 있다.

  • 메세지 소비 재시도: 제대로 받아 처리하지 못한 메세지는 일정 시간 뒤에 다시 처리를 시도해야 한다.
  • 이력 데이터 아카이브: 이미 삭제된 메세지를 다시 처리하길 원하는 소비자가 있다면 어떻게 해야 될까? 오래된 데이터는 HDFS 같은 대용량 저장소 시스템이나 객체 저장소에 보관해 두는 방법이 있다.