ksqlDB は Kafka の上で SQL ライクにストリーム処理を行うためのコンポーネントで、結果の取得方法として Push Query と Pull Query を持ちます。両者は名前が似ていますが、設計思想も適用場面も異なります。
本稿では、継続的に結果が流れ続ける Push(継続クエリ)と、必要なときに現在値を一度だけ取得する Pull(一問一答)の違いを、内部動作、性能、一貫性、そして CCDAK 試験での出題傾向を踏まえて解説します。
Push Query は新着データに応じて結果が途切れなく配信される継続クエリです。変化が起きるたびにクライアントへイベントとして届けるため、サブスクリプション型の UI 更新、アラート、リアルタイムメトリクスに向きます。
Pull Query は現在の集計結果や最新状態を、問い合わせの都度一度だけ返す一問一答です。キーに対する現在値の参照や API の同期レスポンスに適します。
ksqlDB は Kafka トピックを消費し、永続クエリ(CSAS/CTAS)で中間結果をトピックとステートストアにマテリアライズします。Push Query はこのストリームやテーブルの更新を逐次クライアントへ流し、Pull Query はマテリアイズドテーブルの現在値をキーで読み出します。
Pull Query はテーブルが前提です。内部的には状態ストア(一般的に RocksDB バックエンド)からキー検索を行い、現在の合流済み・集計済みの値を返します。Push は新規レコード到着や再計算のたびに下流へイベントとして送出します。
データフローとクエリの位置づけ
意思決定の基準は、継続的に変化を受け取りたいか(Push)、それとも今の確定値だけが必要か(Pull)です。API 設計、UI、アラート、バッチ後処理など、データ利用形態に合わせて選びます。
もう一つの軸は、マテリアライズドテーブルが用意できるかどうかです。Pull はテーブル必須で、ストリームを直接 Pull することはできません。
| 観点 | Push Query | Pull Query | 対象 |
|---|---|---|---|
| 結果の形 | 変更イベントを逐次配信 | 現在値のスナップショットを返却 | Stream または Table |
| クエリ条件 | 任意の述語(ストリーム/テーブル) | 主にキー等価(テーブル) | Table のみ |
Push は EMIT CHANGES が鍵語です。永続クエリ(CREATE STREAM/TABLE AS SELECT ... EMIT CHANGES)にすれば結果をトピックとテーブルへ継続出力します。トランジエントに試す場合は SELECT ... EMIT CHANGES を対話実行します。
Pull はテーブルに対してキー条件で現在値を問い合わせます。ストリームには発行できません。全表スキャンのような Pull は通常の運用では想定されません。
Push と Pull の具体例(ksqlDB CLI/REST)
---- サンプルデータ定義 ----
CREATE STREAM orders (
order_id VARCHAR KEY,
user_id VARCHAR,
amount DECIMAL(9,2),
ts BIGINT
) WITH (
KAFKA_TOPIC='orders',
VALUE_FORMAT='JSON'
);
-- ユーザーごとの累計をマテリアイズ(永続クエリ: Table を作成)
CREATE TABLE spend_by_user AS
SELECT user_id,
SUM(amount) AS total_amount
FROM orders
GROUP BY user_id
EMIT CHANGES;
---- Push Query(トランジエント、しきい値超過を即時配信) ----
-- ksql> プロンプトで実行(終了は Ctrl+C または LIMIT)
SELECT user_id, total_amount
FROM spend_by_user
WHERE total_amount >= 1000
EMIT CHANGES;
-- 早期終了させたい場合
SELECT user_id, total_amount
FROM spend_by_user
EMIT CHANGES LIMIT 50;
---- Pull Query(現在値を一問一答で取得) ----
-- ksql> プロンプトで実行
SELECT total_amount FROM spend_by_user WHERE user_id='u_123';
-- REST 呼び出し例(Pull は /query エンドポイント)
curl -s -X POST http://localhost:8088/query \
-H 'Content-Type: application/vnd.ksql.v1+json; charset=utf-8' \
-d '{"ksql": "SELECT total_amount FROM spend_by_user WHERE user_id=\"u_123\";"}'
-- Push を REST で受け取りたい場合(/query-stream など)
curl -N -s -X POST http://localhost:8088/query-stream \
-H 'Content-Type: application/vnd.ksql.v1+json; charset=utf-8' \
-d '{"sql": "SELECT user_id, total_amount FROM spend_by_user EMIT CHANGES;"}'Push は連続配信のため、クライアント数とフィルタ条件がスループットに直結します。必要最小限の列選択と述語で下流負荷を抑えます。停止条件があるなら LIMIT を使い切断を明確にします。
Pull は状態ストアのキー検索なので低遅延です。ただし、参照するのはマテリアイズ済みの現在値であって、上流トピックの直近レコードが必ず反映済みとは限りません。整合性はテーブル更新の伝播までの遅延に依存します。
可用性面では、Pull は担当パーティションを持つノードが応答します。フェイルオーバによりスタンバイから提供される場合、直前の更新が未反映の可能性を理解して設計するのが安全です。
CCDAK では、Push/Pull の適用対象、終了条件、テーブル必要性、そしてキー条件の有無が頻出です。名称で連想せず、内部動作までイメージして選択肢を切り分けてください。
CCDAK
問題 1
ksqlDB における Push Query と Pull Query の説明として最も正しいものはどれか。
正解: A
Push は EMIT CHANGES による継続配信で、トランジエント/永続どちらも可能。Pull はテーブルが前提で、状態ストアにある現在値をキーで単発取得する。B は対象が逆、C はテーブル不要とする誤り、D はトランジエント Push を否定しており誤り。
Pull Query で常に最新のイベントまで反映された値が得られますか?
いいえ。Pull はマテリアイズドテーブルに反映済みの現在値を返します。上流トピックの最新イベントからテーブル更新までの伝播遅延があるため、厳密な最新イベント直後の値を必ずしも保証しません。
Push Query を一時的に使って安全に止めるには?
SELECT ... EMIT CHANGES LIMIT N のように LIMIT を付与して明示的に終了させるか、クライアント側で接続を閉じます。永続クエリの場合は DROP QUERY で停止します。
Pull Query で集計やジョインをその場で実行できますか?
基本的には事前に永続クエリでテーブルをマテリアイズしておき、そのテーブルを Pull します。重い集計やジョインを Pull で都度実行する設計は推奨されず、運用設定によっては許可されません。
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-...