ksql DB : 기본 개념
- Kafka eco-system/ksqlDB
- 2022. 10. 10.
들어가기 전
ksqlDB는 스트림을 처리하는 어플리케이션을 위해 제작된 DB다. ksqlDB 데이터의 기본 단위는 이벤트인데, 이벤트 기반의 처리는 Kafka가 매우 잘 만들어져 있다. 따라서 ksqlDB는 Kafka가 사용하고 있는 개념을 가지고 와서 사용한다. ksqlDB에서는 크게 Stream / Table이라는 개념을 가지고 작업을 한다.
Stream은 이벤트의 흐름이라고 이해할 수 있다. 과거부터 지금까지 흘러왔던 모든 역사를 보여주는 것이다. 반면 Table은 지금 현재 상태가 어떤지를 보여주는 개념이다.
Stream / Table
Stream과 Table은 각각 서로 다른 개념을 의미한다. 따라서 필요한 것을 적절하게 사용할 수 있어야 한다.
Stream
Stream은 흐름을 의미한다. Stream은 파티셔닝 되어있고, 변경이 불가능하다. 왜냐하면 카프카 토픽의 각 파티션에 저장된 메세지를 읽어오기 때문이다. 따라서 한번 삽입된 메세지(행)은 절대로 변경하거나 삭제할 수 없다.
Stream의 가장 큰 예시로는 계좌 이체 요청 같은 것이 있을 수 있다. 예를 들어 "A → B로 100만원을 송금했습니다"가 스트림의 적절한 예시가 될 수 있다.
Table
Table은 현재 상황을 의미한다. Table은 특정 Key를 기준으로 만들어지고 이 Key에 대한 Value의 현재 상태를 의미한다. 따라서 매 순간 순간 변할 수 있는 녀석을 의미한다.
Table의 가장 큰 예시로는 계좌 잔고 같은 것이 있을 수 있다. 예를 들어 "A의 계좌 잔고는 100만원입니다."가 될 수 있다.
스트림 처리
스트림을 좀 더 유용하게 사용하는 방법은 스트림을 구성하는 이벤트를 변환하고 필터링하고 집계하는 것이다. 카프카를 이용하면 이런 이벤트의 변환하고 필터링은 기본적으로 처리할 수 있다. 그렇지만 스트림에서 새로운 스트림을 만들어내고, 현재 상태를 기록하는 것은 쉽지 않다.
ksqlDB에서는 현재 Stream에서 새로운 Stream을 만들어 낼 수도 있고, 현재 Stream으로 새로운 Table을 만들어낼 수 있다. 이렇게 파생 Stream과 Table이 만들어진다면 Input Stream의 변화가 있을 때 파생 Stream / Table에도 그 변화가 반영된다. 즉, 좀 더 다양한 유형의 실시간 데이터를 손쉽게 취할 수 있다는 장점이 있다.
- 기존 스트림 → 새 스트림 생성
- 여러 스트림 → 새 스트림 생성
- 기존 스트림 → 새 테이블 생성
- 기존 테이블 → 새 테이블 생성
ksqlDB에서는 새로운 스트림과 테이블을 만들기 위해 4가지 방법을 제공해준다. 위의 방법을 좀 더 잘 이해하고 다양한 형태의 데이터를 실시간으로 잘 받아볼 수 있게 할 수 있다.
Materialized View (구체화된 View)
ksqlDB에서 이야기하는 Materialized View는 실시간 스트림에 의해서 처리되고 있는 테이블을 의미한다. ksqlDB는 쿼리를 평가할 때 전체 테이블에 대한 쿼리를 하는 것이 아니라, 변경 사항에 대한 쿼리만을 평가한다. 예를 들어 새 이벤트가 발생하면 현재 상태는 새로운 상태로 발전한다. 새로운 상태로 발전하면 테이블을 다시 계산되어야 하는데, 이 때 새 이벤트가 발생한 부분만 다시 계산한다는 것이다. 요약하면 스트림으로 만들어진 테이블은 변경사항에 대해서만 쿼리하기 때문에 효율적으로 쿼리를 할 수 있다는 것이다.
반면 카프카 토픽에서 바로 테이블을 생성할 수도 있지만, 이 테이블을 생성한다고 해도 쿼리를 할 수는 없다. 왜냐하면 카프카 토픽에는 너무나 많은 메세지가 쌓여있고 이 모든 메세지에 대해서 쿼리를 하는 것은 낭비이기 때문이다. 따라서 ksqlDB는 카프카 토픽에서 바로 생성된 테이블은 쿼리를 지원하지 않는다.
'Kafka eco-system > ksqlDB' 카테고리의 다른 글
ksqlDB : Materialized View (0) | 2022.10.14 |
---|---|
ksqlDB : 실시간 스트림 처리의 동작 방식 (0) | 2022.10.14 |
ksqlDB : Window 정리 (0) | 2022.10.12 |
ksqlDB : ksqlDB의 Join (1) | 2022.10.11 |
ksqlDB : Repartition (0) | 2022.10.10 |