AWS(Amazon Web Service)

[AWS] AWS Integration & Messaging - Kinesis와 SQS FIFO에 대한 데이터 정렬

yunseohhe 2024. 11. 28. 11:31

Kinesis와 SQS FIFO에서 데이터가 어떻게 정렬되는지 보자.

기술이 서로 비슷해 보이고 기능도 비슷한 편이지만 실제로는 아주 많이 다르다.

밑의 사례로 살펴보자.

Ordering data into Kinesis

  • 도로에 트럭이 100대가 있고 각각 트럭 ID가 있다고 하자.
  • 트럭1, 트럭2 그리고 트럭 100까지 도로에 있으며 GPS 위치를 주기적으로 AWS에 보낼 것이다.
  • 각 트럭의 순서대로 데이터를 소비해서 트럭의 이동을 정확하게 추적하고 그 경로를 순서대로 확인하려고 한다.
  • 어떻게 Kinesis로 데이터를 전달할까?
      - 바로 파티션을 사용하면 된다. 이때 파티션 키 값은 트럭 ID이다.
  • 트럭 1은 트럭1의 파티션 키를 전송하고, 트럭 2는 트럭 2의 파티션 키를 전송할 것이다.
      - 같은 파티션 키를 지정하면 해당 키가 언제나 동일한 샤드로 전달된다.

 

  • Kinesis 데이터 스트림과 샤드 세 개가 1, 2, 3번 있고, 총 5대의 트럭이 도로에 있고 Kinesis에 데이터를 전송한다. 
  • 트럭 1이 GPS 데이터를 보낼 때 Kinesisd로 트럭 1의 파티션 키를 보내게 되며, 이때 Kinesis는 트럭1의 파티션 키를 해시한다. 다시 말해 계산을 하는 것이다.
  • 이번 예시의 경우 트럭1의 데이터가 샤드 1번으로 간다는 걸 알아내고, 데이터는 샤드 1번으로 이동한다.
  • 트럭 2번도 데이터를 전송한다. 트럭 2번의 파티션 키를 전송하고, Kinesis는 해당 파티션 키를 확인하고 해시를 한 후에 해당 값이 샤드 2번으로 들어가도록 한다.
  • 도로 위에 있는 트럭 3도 마찬가지이다. 트럭 3의 파티션 키를 전송하는데 Kinesis 데이터 스트림이 이번엔 트럭 3의 키가 샤드 1번으로 이동해야 한다고 결정한다. 샤드 3번으로 갈 필요 없이 이 파티션 키는 샤드 1로 이동하면 된다.
  • 트럭 4는 샤드 3번으로 이동하고, 트럭 5는 샤드 2번으로 간다.
  • 이렇게 재분할하는 것을 파티션이라고 하기에 파티션 키라고 부른다.
  • 각 트럭의 파티션 키는 거기에 따른 샤드에 속한다.
  • 트럭 1은 계속 트럭 1이라는 동일한 파티션 키를 전송하므로 데이터가 언제나 같은 샤드로 이동한다. 그러므로 트럭 1의 다음 데이터 지점은 샤드 1로 가고, 트럭 3의 다음 데이터 지점도 샤드 1번으로 계속 이동한다. 즉 트럭 1이 데이터를 보내면 꼭 샤드 1번으로 이동하고 또한 파란색 트럭인 트럭 3이 데이터를 보내도 샤드 1번에 정렬된다. 
      - 이유는 시간 흐름에 따라 동일한 파티션 키를 사용하도록 했기 때문이다.
      - 따라서 트럭1과 3의 데이터는 항상 샤드 1에 정렬된다.
  • 샤드 2번을 보면 트럭 2와 5의 데이터만 이동하게 된다. 
  • 샤드 3번의 경우, 트럭 4의 데이터만 전송된다. 
  • 트럭 100대와 샤드 5개가 있다고 하면 각 샤드는 평균적으로 20대의 트럭을 가질 것이다. 하지만 트럭과 각각의 샤드 사이가 직접적으로 연결된 것은 아니다.
  • Kinesis가 파티션 키를 해시해서 어느 샤드로 보낼지 결정하는것이다.
  • 다시 말해 안정된 파티션 키를 얻으면 바로 트럭이 그 데이터를 같은 샤드로 전달하고 그러면 샤드 레벨에서 각 트럭의 순서에 따른 데이터를 얻을 수 있게 된다.

 

 

Ordering data into SQS

  • SQS 표준 방식에는 순서가 없다.
    그래서 SQS FIFO라는 선입선출 방식이 있다.
  • 이 SQS FIFO의 그룹 ID를 사용하지 않으면 모든 메시지가 소비되는 방식은 보내진 순서에 따르며 소비자는 하나만 존재한다.

  • 위의 예시를 보면 SQS FIFO 대기열에 전송되는 중이다.
  • 전송되는 순서대로 소비자가 수신 받을 것이다.
  • 보다시피 소비자는 하나이기 때문에 두 배치의 메시지를 소비한다. 
  • 첫 번째와 두 번째가 있는데 선입선출 방식으로는 판단하기 쉽다.

  • 소비자도 하나만 가질 수 있고, 트럭이 있다면 모든 트럭이 FIFO 대기열로 데이터를 보내더라도 소비자는 하나뿐이다.
  • 만약 소비자 숫자를 스케일링하고 서로 연관된 메시지를 그룹화하려는 경우, 그룹 ID를 사용할 수 있다.
  • Kinesis의 파티션 키와 개념이 비슷하다.
  • 그룹 ID를 사용하면 FIFO 대기열은 FIFO 내부에 두 개 그룹이 생기고 정의한 그룹마다 각각 소비자를 가질 수 있게 된다.
  • 위의 예시에서는 두 그룹이 있다. 그룹 A와 그룹 B
  • 두 개의 소비자인 소비자1 과 소비자2는 독자적으로 그룹 1과 2를 읽기 할 수 있다.
  • 중요한 점은 그룹 ID가 많을수록 소비자도 많아진다는 점이다.

 

 

Kinesis  vs  SQS

  • 트럭은 100대가 있고 Kinesis 샤드가 5개, SQS FIFO 대기열이 1개라면

Kinesis Data Streams

  • 평균적으로 가지는 값은 샤드당 트럭 20대가 될 것이다.
  • 해시 기능 덕분에 각 트럭은 하나의 샤드에 지정되고 해당 샤드에 계속 머물 것이다.
  • 트럭 데이터는 각 샤드에 순서대로 정렬된다. 하지만 동시에 가질 수 있는 최대 소비자 개수가 5개뿐이다.
  • 샤드가 5개이고, 샤드마다 하나의 소비자가 필요하기 때문이다.
  • Kinesis Data Streams은 샤드가 5개인 경우에 초당 최대 5MB의 데이터를 수신할 수 있으며 처리량이 꽤 많은 편이다.
  • 예를 들어, 트럭 10,000대가 많은 데이터를 전송하고 또 Kinesis Data Streams에 샤드당 데이터를 정렬할 때 사용하면 좋다.

SQS FIFO

  • SQS FIFO 대기열은 하나뿐이다.
  • 샤드 및 파티션을 정의할 필요 없이 SQS FIFO 대기열이 하나만 있다.
  • 트럭이 100대 있으므로, 각 트럭 ID에 상응하는 그룹 ID를 100개 생성한다. 즉, 그룹 ID가 100개가 되고 소비자도 최대 100개가 될 수 있다.
  • 각 소비자가 특정한 그룹 ID와 연결되니깐, 규모를 보면 SQS FIFO에서 최대 초당 300, 혹은 배치를 사용하면 3,000개의 메시지를 가진다.
  • 그룹ID 숫자에 따른 동적 소비자 수를 원할 때 사용하면 좋은 모델이다.