ConfluentのCCDAKとCCAAKは、開発・運用双方の観点でKafkaの安全な利用と予測可能な挙動を問います。本稿は、過去の出題傾向と公式ドキュメント準拠の安定仕様をベースに、主要ドメインごとに“試験で問われやすい判断ポイント”を短く押さえます。
サンプル問題はあくまで演習用のイメージです。実務でも役立つ設定値やトレードオフを添えているので、手元のクラスタで再現しながら確認してください。
Kafkaのメッセージ配信は、少なくとも1回、厳密に1回、高々1回の3パターンで整理できます。プロデューサ側ではacks、retries、enable.idempotence、max.in.flight.requests.per.connectionの組み合わせ、コンシューマ側ではオフセットコミットのタイミング、さらにトランザクションと読み取り分離レベルが結果を左右します。
厳密に1回の処理(Exactly-Once Semantics, EOS)は、idempotent producerとトランザクション、そしてread_committedでの読み取りを前提に、Kafka内のread-process-writeを単一の原子的単位として扱うときに達成可能です。外部システムまで含めた“厳密に1回”は、その外部がトランザクション連携をサポートしない限り保証できません。
| セマンティクス | 欠落の可能性 | 重複の可能性 | 代表的な設定/条件 |
|---|---|---|---|
| 高々1回 (At-most-once) | あり | なし | 送信前コミットまたは再試行しない; retries=0が典型 |
| 少なくとも1回 (At-least-once) | なし(原則) | あり | retries>0, acks=all, コミットは処理後 |
| 厳密に1回 (Exactly-once) | なし(設計範囲内) | なし(設計範囲内) | enable.idempotence=true, transactional.id, acks=all, read_committed |
プロデューサ〜ブローカ〜コンシューマの流れ(EOS時)
プロデューサ設定例(EOS)
bootstrap.servers=broker:9092
aacks=all
enable.idempotence=true
retries=2147483647
max.in.flight.requests.per.connection=5
transactional.id=orders-txn-01
順序保証はパーティション単位です。特定キーでの順序維持が必要なら、必ずキーを設定します。キーなしの場合、現行クライアントのデフォルトはスティッキー・パーティショナーで、短時間は同一パーティションにまとめて送るためスループット改善が見込めますが、厳密な順序制御はできません。
ホットパーティションを避けるには、キーのカーディナリティ確保、パーティション数とコンシューマ並列度の計画、必要に応じたカスタムパーティショナーが有効です。パーティション数の増加は後方互換で可能ですが、減少は困難である点に注意します。
Java Producerのキー指定イメージ
producer.send(new ProducerRecord<>("orders", customerId, payload));
// customerIdで順序保証(同一キーは同一パーティション)
保持期間はretention.ms、サイズはretention.bytesで制御します。セグメント境界(segment.ms/segment.bytes)を超えて初めて削除対象になります。cleanup.policyがdeleteのとき、古いセグメントが期限やサイズ超過で削除されます。
cleanup.policy=compactでは、同一キーの最新レコードを残し、それ以前は圧縮対象になります。削除はキーに対するトゥームストーンを書き込み、一定時間(delete.retention.ms)経過後に物理削除されます。コンパクションは最終的整合であり、即時ではありません。
保持・コンパクションの代表設定(トピック単位)
kafka-topics.sh --bootstrap-server broker:9092 \
--alter --topic users \
--config cleanup.policy=compact,delete \
--config retention.ms=604800000 \
--config segment.ms=3600000
レプリケーション係数(例: 3)とISR(In-Sync Replicas)が可用性の基礎です。acks=allはISRの全レプリカへの追従を待ってから成功を返します。min.insync.replicasは書き込みに必要なISR数の下限で、acks=allと併用することで障害時の持続性を高めます。
リーダー選出では、原則としてISRから選ばれます。unclean.leader.election.enable=falseで不整合なフォロワからの選出を禁止し、データ損失を回避します(ただし停止時間は伸びる可能性)。ラックアウェアネスはブローカの配置情報を使って、レプリカを異なるラックに分散します。
代表的なサーバ設定の要点
min.insync.replicas=2
unclean.leader.election.enable=false
# ラックアウェアネス
broker.rack=az1
Schema RegistryはAvro/Protobuf/JSON Schemaを管理し、互換性モード(BACKWARD, FORWARD, FULL など)をポリシー化します。一般的なイベント追加にはBACKWARD互換が選ばれます。削除や必須フィールドの追加は後方互換を壊すため、試験では“不適切”な変更として問われがちです。
Confluentのワイヤフォーマットは先頭バイトのマジック値(0)に続けてスキーマIDを埋め込みます。クライアントはこのIDを使ってデシリアライズし、互換性チェックは登録時に適用されます。
互換性モード設定(例)
curl -s -X PUT -H "Content-Type: application/json" \
--data '{"compatibility":"BACKWARD"}' \
http://schema-registry:8081/config/subjects/orders-value
暗号化はTLS、認証はSASL/PLAIN, SASL/SCRAM, OAuthBearer, mTLSなどが選べます。ACLはリソース(Topic, Group, Cluster など)×操作(Read, Write, Create, Describe など)で付与します。運用ではACLのプリンシパルとパターン(literal/prefix)を明確に管理します。
コンシューマラグの監視、クォータの設定、段階的なローリングアップグレード、協調的リバランスの活用などが安定運用の要点です。協調的(cooperative-sticky)リバランスは再均衡時の停止を最小化します。
ACL付与例(プロデューサにWrite、コンシューマにRead)
kafka-acls.sh --bootstrap-server broker:9092 \
--add --allow-principal User:alice \
--operation Write --topic payments
kafka-acls.sh --bootstrap-server broker:9092 \
--add --allow-principal User:bob \
--operation Read --topic payments --group payments-cg
CCDAK / CCAAK
問題 1
レプリケーション係数3、min.insync.replicas=2のトピックに対し、プロデューサはacks=allで送信しています。1台のブローカ障害によりISRが2から1に低下しました。このとき期待される挙動として最も適切なのはどれか。
正解: B
acks=allはISR全体の追従を待ち、かつmin.insync.replicas=2は少なくとも2レプリカの同時書き込みを要求する。ISRが1に落ちると条件を満たせないため、プロデュースは失敗(NotEnoughReplicas)し続ける。耐久性重視の正しい挙動である。
Exactly-onceは外部DBまで保証できますか?
Kafka内のread-process-writeではトランザクションにより実現可能です。外部DBまで含めるには、その外部が同一トランザクション境界や二相コミット等に対応している必要があります。一般的なJDBCシンクでは厳密に1回を外部まで拡張するのは難しく、冪等キーやアップサート設計で実質的に1回相当を目指します。
キーなし送信時のパーティション選択は常にラウンドロビンですか?
現行のKafkaクライアントは、バッチ効率向上のためのスティッキー・パーティショナーが既定となっており、短期間は同一パーティションにまとめて送信します。厳密な順序制御が必要な場合はキーを設定してください。
ログコンパクションで“削除”はどう表現されますか?
対象キーに対して値null(トゥームストーン)をプロデュースします。コンパクションにより、一定の保持期間経過後に当該キーの古いエントリとともに物理削除されます。
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-...