ksqlDB のテーブルは、継続クエリで算出した結果を RocksDB のステートストアに保持し、Kafka のチェンジログ・トピックで耐障害性を確保するマテリアライズド・ビューです。これにより、低レイテンシなキー参照(Pull Query)と、継続配信(Push Query)の両方に対応できます。
本稿では、テーブルの成り立ちと内部、Pull/Push の使い分け、キー設計とパーティショニング、典型的なクエリパターン、運用と試験対策ポイントを、CCDAK で問われる要点に沿って解説します。
ksqlDB の世界では、Stream は「不変のイベント列」、Table は「最新状態のアップサート表現」です。CREATE TABLE AS SELECT のような永続クエリは、計算結果をローカルのステートストアに維持し、背後で Kafka のトピックに変更履歴(チェンジログ)を永続化します。これが実質的なマテリアライズド・ビューです。
テーブルは主キーでインデックス化され、Pull Query による即時参照が可能です。一方で、Push Query は新規更新が発生するたびにストリームとして結果を押し流します。CCDAK では、用途に応じて Stream と Table、Pull と Push を正しく選ぶ設問が頻出します。
ksqlDB の永続クエリは Kafka Streams アプリケーションとして実行され、各パーティションに対応する RocksDB ステートストアを持ちます。更新はローカルに適用されるとともに、チェンジログ・トピックへ複製されます。ノード障害時はチェンジログから状態が復元されます。
再バランス時はパーティション担当が移動し、新しい担当ノードがチェンジログからキャッチアップします。これにより、マテリアライズド・ビューは耐障害性を保ちつつ、一貫性のある結果を提供できます。実運用では、チェンジログ・トピックの保護(適切な replication.factor と cleanup.policy)を確認します。
Pull Query は主キー条件での即時参照に最適です。ksqlDB はキーに基づき適切なノードへルーティングし、ローカルのマテリアイズド・ビューからすぐに応答します。一方、Push Query は連続的な更新通知に向き、監視ダッシュボードや下流へのストリーミング連携で有効です。
従来の Kafka コンシューマで同等を実現しようとすると、アプリ側で状態管理や照会機能を自作する必要があります。ksqlDB のテーブルはこれを標準機能として提供します。
| 観点 | Pull Query(テーブル) | Push Query(テーブル/ストリーム) | 通常のKafkaコンシューマ |
|---|---|---|---|
| 用途 | キーに対する即時参照 | 更新の逐次配信 | イベント消費と独自処理 |
| レスポンス | 同期リクエストで単発応答 | 継続ストリームで逐次応答 | アプリ実装次第 |
| 必要条件 | 主キー条件(等価) | クエリをサブスクライブ | なし(自由) |
| レイテンシ | ミリ秒〜サブ秒(ローカル状態) | イベント到着依存の即時 | 実装・ストア依存 |
| スケール | パーティション×ノードで水平分散 | ブローカー→ksqlDB→クライアントで拡張 | コンシューマグループで拡張 |
| 一貫性 | 同一キーで最新値を返す | 到着順で更新を配信 | 実装依存(自前の状態管理) |
Pull Query は主キーでの検索を前提とします。すなわち、GROUP BY で指定したキー、あるいはテーブル定義の主キーに対する等価条件が必要です。適切なキー設計とパーティショニングが、低レイテンシ参照の成否を分けます。
JOIN や再パーティショニングが絡む場合、ksqlDB は必要に応じて再パーティション用トピックを自動作成します。結合ではキーとパーティション数の整合が重要で、必要に応じて PARTITION BY を用いた明示的な再パーティショニングを行います。
マテリアライズド・ビューのデータフロー(概念)
テーブルは集計やディメンション参照を事前計算し、即時照会を可能にします。以下は典型的な定義と利用例です。
試験対策の観点では、CTAS によるテーブル作成=マテリアイズ、Pull=キー参照、Push=連続配信、JOIN 時のキー整合と再パーティショニング、という対応関係を押さえておきましょう。
ksqlDB の定義例(マテリアイズ+参照+結合)
/* ソースストリーム定義 */
CREATE STREAM pageviews (
user_id VARCHAR,
page VARCHAR,
ts BIGINT
) WITH (
KAFKA_TOPIC='pageviews',
VALUE_FORMAT='JSON'
);
/* ユーザー属性のディメンションテーブル(参照用) */
CREATE TABLE users (
user_id VARCHAR PRIMARY KEY,
plan VARCHAR
) WITH (
KAFKA_TOPIC='users',
VALUE_FORMAT='JSON'
);
/* 集計テーブル(マテリアライズド・ビュー) */
CREATE TABLE pv_count_by_user AS
SELECT user_id, COUNT(*) AS view_cnt
FROM pageviews
GROUP BY user_id
EMIT CHANGES;
/* Pull Query:単発のキー参照(最新の集計を即時取得) */
SELECT view_cnt FROM pv_count_by_user WHERE user_id='u-123';
/* Push Query:更新があるたびにストリーミング */
SELECT user_id, view_cnt FROM pv_count_by_user EMIT CHANGES;
/* 参照結合:ストリームをディメンション情報でエンリッチ */
CREATE STREAM enriched_pageviews AS
SELECT p.user_id, p.page, u.plan
FROM pageviews p
LEFT JOIN users u
ON p.user_id = u.user_id
EMIT CHANGES;マテリアライズド・ビューを再構築したい場合は、元トピックに必要な履歴が残っていること(十分な保持期間やコンパクション)が前提です。クエリを再作成すれば、ksqlDB は最初から読み直し、状態を再構築します。
障害やリバランス時は、チェンジログからローカル状態が復元されます。スケールはパーティション数とノード数に依存し、ホットキーがあると偏りが生じます。キー分布とパーティション設計は必ず検討しましょう。
CCDAK
問題 1
ユーザーごとのページビュー回数を即時に取得し、API から user_id を指定して単発で最新の値を返したい。最も適切なアーキテクチャはどれか?
正解: A
単発のキー参照には、主キーでインデックス化されたテーブル(マテリアライズド・ビュー)+ Pull Query が最適。Push Query は連続配信向けで単発参照には不向き。生トピックの都度走査や JOIN のみでは即時のキー参照要件を満たしにくい。
テーブルの背後のトピックはコンパクションが必須ですか?
テーブルはアップサートのモデルに適しており、チェンジログ・トピックはキー単位の最新値を保つためにコンパクションが用いられます。シンク側トピックの cleanup.policy は環境設定に依存しますが、最新状態を保持したい用途では compact を有効にするのが一般的です。
Pull Query はどうやってスケールしますか?
キーでパーティションが決まり、対応ノードのローカル状態から即時応答します。パーティション数とノード数を増やすことで水平スケールでき、ksqlDB はキーに基づき担当ノードへルーティングします。
キーを変えて再設計したいときはどうすればよいですか?
PARTITION BY または GROUP BY により再パーティショニングされた新しいパイプライン(テーブル)を作成します。内部的に再パーティショントピックが生成され、以降は新キーでの Pull/Push が可能になります。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Kafka Topic と Partition の基礎: 分散とスケーラビリティの要
CCDAK 対策と実務の両立を意識し、Topic/Partition/Replica/Consumer Group の役...
CCDAK 試験ガイド:出題範囲・配点・申込み・対策
Confluent Certified Developer for Apache Kafka (CCDAK) の出題範囲...
Confluent Certified Administrator (CCAAK) 対策: 出題範囲・配点の考え方・運用観点の要点
CCAAKに向けて、試験領域の押さえどころを運用目線で整理。プロダクションで通用する設定・監視・セキュリティの実践知を、...
Kafka の Replica と In-Sync Replicas を正しく設計する: 耐障害性と一貫性
レプリカとISRの仕組みを起点に、acks と min.insync.replicas、クリーン/アンクリーンリーダー選...
Kafka の Offset とコミット: ポジション管理と at-least-once の基礎
CCDAK 対策と実務の両立を意識して、Kafka コンシューマのオフセット管理とコミット戦略を整理。at-least-...