
Stream과 Table은 Kafka Topic을 해석하는 두 가지 관점이다.
Stream은 Topic에 기록되는 이벤트 흐름 전체를 표현하고
Table은 동일 Key 기준의 최신 상태를 표현한다.
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의 특징
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의 특징
Table은 상태를 유지해야 하므로 내부적으로 RocksDB를 사용한다.
즉 Table은 Kafka Topic + Internal Topic + RocksDB 조합이다.
| 구분 | Stream | Table |
|---|---|---|
| 의미 | 이벤트 로그 | 최신 상태 |
| Key 의미 | 선택적 | 필수 |
| 같은 Key 재입력 | 여러 이벤트 생성 | 상태 갱신 |
| 저장 방식 | Append-only | Key-based Update |
| 용도 | 실시간 처리 | 조회 및 상태 유지 |
ksqlDB는 Key와 Value를 다양한 포맷으로 직렬화한다.
KEY_FORMAT = ‘KAFKA’,
VALUE_FORMAT ='JSON‘,
직렬화 포맷은 Key와 Value 각각 독립적으로 설정되며
ksqlDB는 이를 기반으로 메시지를 컬럼 스키마에 매핑한다.
ksqlDB의 모든 Query는 실행 상태를 가진다.
SELECT, INSERT 같은 단순 쿼리도 각각 별도의 Query Object로 관리된다.
Query 실행 시 생성되는 요소
Materialized View 기반 CSAS, CTAS 쿼리는
동일한 쿼리를 재실행할 경우 동일한 Query ID를 갖는다.
Push Query는 데이터가 변경될 때마다 실시간으로 결과를 반환한다.
select * from simple_user_stream emit changes;
특징
Pull Query는 요청 시점의 최신 상태를 단발성으로 조회한다.
select * from simple_user_table where id = 1;
특징
Pull Query 제약 (교재 원문 그대로)
| 구분 | Push | Pull |
|---|---|---|
| 방식 | 실시간 스트리밍 | 단발 조회 |
| 대상 | Stream/Table | Table |
| 동작 | 변경 즉시 결과 반환 | 실행 시점 값 반환 |
| 목적 | 이벤트 처리 | 최신 상태 조회 |
모든 Query는 Query Object로 표현되며
내부적으로 Consumer Group과 Consumer를 관리한다.
ksqlDB는 스키마 변경에 강한 제약을 둔다.