Kafka - KSQL Stream & Table

develkkm·2025년 11월 17일

0부터 시작하는 Kafka

목록 보기
15/18

Stream과 Table은 Kafka Topic을 해석하는 두 가지 관점이다.
Stream은 Topic에 기록되는 이벤트 흐름 전체를 표현하고
Table은 동일 Key 기준의 최신 상태를 표현한다.


Stream

Stream은 Topic으로 들어오는 이벤트를 순서대로 처리하는 구조다.
각 레코드는 독립된 이벤트이며 과거 값이 유지되지 않는다.

create stream simple_user_stream
(
  id int (KEY),
  name varchar,
  email varchar
)
with
(
  KAFKA_TOPIC='simple_user_stream',
  KEY_FORMAT='KAFKA',
  VALUE_FORMAT='JSON'
);

Stream의 특징

  • 모든 이벤트가 로그로 축적된다.
  • Key가 있어도 상태를 유지하지 않는다.
  • 동일 Key가 여러 번 입력되면 각 이벤트가 모두 기록된다.

Table

Table은 Primary Key 기준으로 상태를 유지한다.
동일 Key가 다시 입력되면 이전 값을 덮어쓰고 최신 상태만 유지한다.

create table simple_user_table
(
  id int PRIMARY KEY,
  name varchar,
  email varchar
)
with
(
  KAFKA_TOPIC='simple_user_table',
  KEY_FORMAT='KAFKA',
  VALUE_FORMAT='JSON',
  PARTITIONS=1
);

Table의 특징

  • Primary Key 기준 최신 상태 유지
  • 과거 동일 Key 데이터는 Table 관점에서 의미 없음

RocksDB

Table은 상태를 유지해야 하므로 내부적으로 RocksDB를 사용한다.

  1. 입력 이벤트가 Table과 연결된 Topic으로 들어온다
  2. 변경 내역은 Change Log 형태로 Internal Topic에 기록된다
  3. RocksDB는 Key 각각의 최신 상태를 구성한다
  4. Pull Query는 RocksDB에 저장된 값을 즉시 조회한다

즉 Table은 Kafka Topic + Internal Topic + RocksDB 조합이다.


Stream vs Table

구분StreamTable
의미이벤트 로그최신 상태
Key 의미선택적필수
같은 Key 재입력여러 이벤트 생성상태 갱신
저장 방식Append-onlyKey-based Update
용도실시간 처리조회 및 상태 유지

Serialization Format

ksqlDB는 Key와 Value를 다양한 포맷으로 직렬화한다.

KEY_FORMAT = ‘KAFKA’,
VALUE_FORMAT ='JSON‘,
  • KAFKA: Primitive 직렬화에 사용되며 주로 Key값의 직렬화 포맷으로 적용
  • JSON: JSON 포맷 직렬화. Schema Registry 적용 없이 사용
  • AVRO: AVRO 포맷 직렬화. Schema Registry 사용
  • DELIMITED(CSV): CSV 형태의 직렬화
  • PROTOBUF: Protocol Buffer 형태의 직렬화

직렬화 포맷은 Key와 Value 각각 독립적으로 설정되며
ksqlDB는 이를 기반으로 메시지를 컬럼 스키마에 매핑한다.


Query

ksqlDB의 모든 Query는 실행 상태를 가진다.
SELECT, INSERT 같은 단순 쿼리도 각각 별도의 Query Object로 관리된다.

Query 실행 시 생성되는 요소

  • Query Object
  • Consumer Group
  • Consumer

Materialized View 기반 CSAS, CTAS 쿼리는
동일한 쿼리를 재실행할 경우 동일한 Query ID를 갖는다.

Push Query

Push Query는 데이터가 변경될 때마다 실시간으로 결과를 반환한다.

select * from simple_user_stream emit changes;

특징

  • 실시간 스트림 기반
  • 변경 즉시 결과 제공
  • Stream/Table 모두 사용 가능

Pull Query

Pull Query는 요청 시점의 최신 상태를 단발성으로 조회한다.

select * from simple_user_table where id = 1;

특징

  • 단발성 조회

Pull Query 제약 (교재 원문 그대로)

  • Stream 에 Group by 적용 시 Pull 쿼리 수행 불가
  • Topic을 Source로 하는 Table에 Pull 쿼리 수행 불가

Push vs Pull

구분PushPull
방식실시간 스트리밍단발 조회
대상Stream/TableTable
동작변경 즉시 결과 반환실행 시점 값 반환
목적이벤트 처리최신 상태 조회

Query Object

모든 Query는 Query Object로 표현되며
내부적으로 Consumer Group과 Consumer를 관리한다.

  • Stream/Pull/Push 모두 Query Object 생성
  • Query ID 단위로 쿼리가 관리됨
  • CSAS/CTAS와 같은 상태 기반 쿼리는 Query ID가 고정됨

ALTER DDL

ksqlDB는 스키마 변경에 강한 제약을 둔다.

  • 컬럼 추가만 가능
  • 컬럼 삭제 불가
  • 타입 변경 불가
  • 모든 컬럼은 nullable
  • NOT NULL 제약 불가
profile
알던것을 더 확실하게

0개의 댓글