マルチテナントや部門横断で Kafka を運用すると、あるクライアントの大量送受信が他を圧迫する問題が起きがちです。Kafka の Quota は、この資源の取り合いを抑え、予測可能なスループットを各クライアントへ配分するための仕組みです。
本記事では、公式ドキュメントに基づくクラスタ安定運用のための Quota 設計・設定・観測方法を、認定試験(CCAAK)で問われる粒度まで具体的に解説します。
Kafka のクライアント Quota は主に 3 種類です。producer_byte_rate(プロデューサの書き込みバイト/秒)、consumer_byte_rate(コンシューマのフェッチバイト/秒)、request_percentage(サーバ処理能力に対する割合的シェア)。超過時はハード拒否ではなく、応答遅延(スロットリング)で制御され、クライアントはレスポンスの throttle_time_ms で遅延を知ることができます。
制限は観測ウィンドウで平滑化され、短時間のバーストは許容しつつ平均レートを守ります(サーバ側の quota.window.num と quota.window.size.seconds で制御)。エンティティは user、client-id、user+client-id(組み合わせ)、およびデフォルト(全体)で指定できます。より具体的なエンティティが優先され、デフォルトは最後に適用されます。
| エンティティ | 適用範囲 | 代表的な用途 | 代表キー例 |
|---|---|---|---|
| user | 認証ユーザ単位(SASL Principal) | 部門/チームごとの総量制限 | users:alice |
| client-id | アプリケーション/プロセス単位 | 同一ユーザ内のアプリ毎の配分 | clients:etl-writer |
| user+client-id | ユーザ×アプリの組み合わせ | 同一ユーザ内の特定アプリだけ厳しめに | users:alice,clients:etl-writer |
| default | 全クライアント共通既定値 | 新規/未分類クライアントの初期上限 | users:* または clients:* |
スロットリングの流れ(概念図)
代表的な Quota キー(クライアント用)
# クライアント向けに設定可能なダイナミック Quota キー(抜粋)
# - producer_byte_rate: 1秒あたりの送信バイト上限
# - consumer_byte_rate: 1秒あたりの受信(フェッチ)バイト上限
# - request_percentage: サーバ処理能力に対する割合シェア(相対配分)
# いずれも超過時は応答に遅延を入れて調整されます。Quota は同時に複数レベルへ設定できます。評価時は最も具体的な一致が優先され、該当がなければより汎用な設定へフォールバックします。たとえば user=alice, client-id=etl の組み合わせがあればそれが使われ、なければ user=alice、さらに無ければ client-id=etl、最後に default へと落ちます。
default の活用で未登録クライアントの暴走を抑えつつ、重要系アプリだけ上限を広げる、といった段階的適用が可能です。
| 設計パターン | 利点 | 注意点 |
|---|---|---|
| default 厳しめ + 例外緩和 | 未登録でも安全 | 例外運用が増えると管理工数が増大 |
| user 単位で配分 | 部門ごとに予算化しやすい | 同一 user 内のアプリ差分を出しにくい |
| user+client-id 併用 | きめ細かい制御 | エントリが増えがちで棚卸しが必要 |
優先度イメージ(擬似マッチ順)
# 擬似コード
if quota.exists(user=u, client=c): use that
elif quota.exists(user=u): use that
elif quota.exists(client=c): use that
else: use defaultクライアント Quota はダイナミック設定としてクラスタに反映できます。kafka-configs.sh(--bootstrap-server 指定)か Admin API を用います。設定は即時に近い形で反映され、ブローカ再起動は不要です。
設定後は describe で確認し、必要に応じて alter/remove を行います。変更はメタデータとしてクラスタに保存され、全ブローカで有効になります。
| 操作 | CLI 例 | ポイント |
|---|---|---|
| 設定 | kafka-configs.sh --alter --add-config ... | 複数キーはカンマ区切り |
| 確認 | kafka-configs.sh --describe --entity-type ... | 対象エンティティを明示 |
| 削除 | kafka-configs.sh --alter --delete-config ... | 未設定時は上位/既定にフォールバック |
kafka-configs.sh 例(公式ドキュメント系シンタックス)
# client-id 単位
bin/kafka-configs.sh --bootstrap-server localhost:9092 \
--alter --add-config 'producer_byte_rate=1048576,consumer_byte_rate=1048576' \
--entity-type clients --entity-name etl-writer
# user 単位(SASL Principal 名)
bin/kafka-configs.sh --bootstrap-server localhost:9092 \
--alter --add-config 'producer_byte_rate=2097152' \
--entity-type users --entity-name alice
# user+client-id(組み合わせ)
bin/kafka-configs.sh --bootstrap-server localhost:9092 \
--alter --add-config 'consumer_byte_rate=524288' \
--entity-type users --entity-name alice \
--entity-type clients --entity-name etl-writer
# describe で確認
bin/kafka-configs.sh --bootstrap-server localhost:9092 \
--describe --entity-type clients --entity-name etl-writer上限は期待するメッセージサイズ、QPS、圧縮率、ヘッダ等のオーバーヘッドを加味して決めます。初期は需要の80%程度を配り、観測(throttle_time_ms、処理遅延、レイテンシ)を見ながら段階的に調整するのが安全です。
consumer と producer は非対称になり得ます。たとえば大量書き込みでも、読み取りは一部のグループだけ、という構成では consumer_byte_rate を低めに抑えることも合理的です。
| 設計項目 | 目安/判断 | 備考 |
|---|---|---|
| producer_byte_rate | 書き込みピークの8割程度から開始 | スロットリングが多ければ増やす |
| consumer_byte_rate | 消費後段の処理能力に合わせる | 遅延が積み上がるなら減らす/増やすを検討 |
| request_percentage | 混雑時の相対配分 | 帯域だけでなく処理スロットの配分にも影響 |
計算メモ(例)
# 平均 10 KB のレコードを 1500 rps で送る場合(圧縮後同程度と仮定)
# 10 * 1024 * 1500 ≈ 15,360,000 bytes/s ≈ 14.6 MiB/s
# 初期上限: 12–13 MiB/s 程度(観測しながら調整)
# → producer_byte_rate ≈ 13 * 1024 * 1024 = 13631488クライアントは応答ヘッダの throttle_time_ms でスロットリングを検知できます。継続的に非ゼロなら上限に当たっている可能性が高いです。ブローカ側はリクエスト別のスロットル時間やレートに関するメトリクスを公開します(例: リクエスト種別ごとの ThrottleTimeMs)。
スロットルが過大だと、プロデューサはバッファが詰まりレイテンシが増大、コンシューマはフェッチ間隔が伸びてアプリ側遅延やラグ増加につながります。まずは対象エンティティの設定と、default による巻き込みを確認します。
| 症状 | 考えられる原因 | 確認ポイント |
|---|---|---|
| throttle_time_ms が増加 | quota 超過 | 対象エンティティの上限/優先度 |
| Consumer ラグ増加 | consumer_byte_rate が低すぎる | グループの処理能力と整合性 |
| P99 レイテンシ悪化 | request_percentage が低い/競合 | 混雑時の相対配分 |
JMX/メトリクスの例(名称は環境により異なる)
# 例: リクエスト種別ごとのスロットル
# kafka.network:type=RequestMetrics,name=ThrottleTimeMs,request=Produce
# kafka.network:type=RequestMetrics,name=ThrottleTimeMs,request=FetchConsumer
# ダッシュボードで時系列を可視化し、対象エンティティの設定と突き合わせるマルチテナントでは default を堅めに敷き、重要系や夜間バッチにだけ緩和を付与するのが安全です。client.id 命名規約(team-app-purpose など)を統一し、棚卸しを四半期ごとに行うと陳腐化を防げます。
レプリケーショントラフィックのスロットリングはクライアント Quota とは別の設定領域です。パーティション再割当などの運用時に使うもので、アプリケーションクライアントの制御とは混同しないようにしましょう。
| 対象 | 制御手段 | 混同しやすい点 |
|---|---|---|
| アプリクライアント | producer/consumer_byte_rate, request_percentage | ユーザ/クライアントの優先度 |
| レプリケーション | 専用のレプリケーションスロットル設定 | クライアント Quota ではない |
| 未登録クライアント | default の厳しめ設定 | 例外許可の棚卸しが必要 |
運用時の棚卸しメモ(擬似手順)
# 1) 実利用の client.id と Principal を収集(メトリクス/ログ)
# 2) default で保護されているか確認
# 3) 重要系だけ user+client-id で緩和
# 4) 90日以上未使用のエントリは削除候補にCCAAK
問題 1
ある Kafka クラスタで、未分類の新規クライアントを抑制しつつ、user=analytics の client-id=nightly-batch にだけ高い書き込み帯域を与えたい。最も適切な設定手順はどれか?
正解: A
未分類クライアントの抑制には default を用いるのが基本。特定のユーザ×クライアントにだけ緩和を与える場合は、より具体的なエンティティ(user+client-id)が優先される性質を利用する。client-id や user のみでは他の同ユーザ/同クライアントにも影響し得る。
Quota はリクエストを拒否しますか?それとも遅延させますか?
Kafka のクライアント Quota は基本的にソフトスロットリングです。制限超過時は応答に遅延を入れ、クライアントには throttle_time_ms が返ります。
どのエンティティに適用された Quota が効いているかを確認できますか?
kafka-configs.sh の --describe で設定を確認し、クライアント側の throttle_time_ms が増加するかを観測します。優先度は user+client-id > user > client-id > default の順で適用されます。
レプリケーションのスロットリングも client Quota で制御できますか?
いいえ。レプリケーションのスロットリングは別の設定領域です。クライアント向けの producer/consumer_byte_rate や request_percentage では制御しません。
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-...