Kafka

Kafka の Quota と帯域制御: クライアント単位の利用制限を設計・実装する

2026-04-19
NicheeLab編集部

マルチテナントや部門横断で Kafka を運用すると、あるクライアントの大量送受信が他を圧迫する問題が起きがちです。Kafka の Quota は、この資源の取り合いを抑え、予測可能なスループットを各クライアントへ配分するための仕組みです。

本記事では、公式ドキュメントに基づくクラスタ安定運用のための Quota 設計・設定・観測方法を、認定試験(CCAAK)で問われる粒度まで具体的に解説します。

Kafka Quota の基本: 何をどう制限するか

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(組み合わせ)、およびデフォルト(全体)で指定できます。より具体的なエンティティが優先され、デフォルトは最後に適用されます。

  • 対象メトリクス: producer_byte_rate, consumer_byte_rate, request_percentage
  • 制御方式: 応答遅延によるソフトスロットリング(throttle_time_ms)
  • 平滑化: 観測ウィンドウで平均化し、瞬間バーストを吸収
  • 適用単位: user、client-id、user+client-id、default(ワイルドカード)
  • 優先度: より具体的な指定が勝つ(user+client-id > user > client-id > default)
エンティティ適用範囲代表的な用途代表キー例
user認証ユーザ単位(SASL Principal)部門/チームごとの総量制限users:alice
client-idアプリケーション/プロセス単位同一ユーザ内のアプリ毎の配分clients:etl-writer
user+client-idユーザ×アプリの組み合わせ同一ユーザ内の特定アプリだけ厳しめにusers:alice,clients:etl-writer
default全クライアント共通既定値新規/未分類クライアントの初期上限users:* または clients:*

スロットリングの流れ(概念図)

Produce/Fetch ⇄ response (delay)Produce/Fetch ⇄ response (delay)Client A (id=A)user=aliceClient B (id=B)user=bobBrokerQuota Manager (per-entity) / window avg / throttle

代表的な Quota キー(クライアント用)

# クライアント向けに設定可能なダイナミック Quota キー(抜粋)
# - producer_byte_rate: 1秒あたりの送信バイト上限
# - consumer_byte_rate: 1秒あたりの受信(フェッチ)バイト上限
# - request_percentage: サーバ処理能力に対する割合シェア(相対配分)
# いずれも超過時は応答に遅延を入れて調整されます。

エンティティと優先度: user, client-id, 組み合わせ、default

Quota は同時に複数レベルへ設定できます。評価時は最も具体的な一致が優先され、該当がなければより汎用な設定へフォールバックします。たとえば user=alice, client-id=etl の組み合わせがあればそれが使われ、なければ user=alice、さらに無ければ client-id=etl、最後に default へと落ちます。

default の活用で未登録クライアントの暴走を抑えつつ、重要系アプリだけ上限を広げる、といった段階的適用が可能です。

  • 優先度(高→低): user+client-id > user > client-id > default
  • default はセーフティネット。まずは default を適切に設定してから個別緩和する
  • 命名規約(client.id)を運用に組み込むと可視化と割当が容易
設計パターン利点注意点
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

設定と検証: kafka-configs.sh と Admin API

クライアント Quota はダイナミック設定としてクラスタに反映できます。kafka-configs.sh(--bootstrap-server 指定)か Admin API を用います。設定は即時に近い形で反映され、ブローカ再起動は不要です。

設定後は describe で確認し、必要に応じて alter/remove を行います。変更はメタデータとしてクラスタに保存され、全ブローカで有効になります。

  • 単位はバイト/秒。数値は平均レートで評価される
  • 設定はクラスタ全体に適用(特定ブローカ専用ではない)
  • 取り消しは --delete-config または該当エンティティ削除で実施
操作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 を低めに抑えることも合理的です。

  • 概算: 上限[bytes/s] ≈ 平均レコードサイズ × QPS × 安全係数
  • 観測ウィンドウが短いと揺れやすい。平滑化設定と合わせて設計
  • ピーク時の遅延許容値(SLO)に合わせて request_percentage を併用
設計項目目安/判断備考
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 とメトリクス

クライアントは応答ヘッダの throttle_time_ms でスロットリングを検知できます。継続的に非ゼロなら上限に当たっている可能性が高いです。ブローカ側はリクエスト別のスロットル時間やレートに関するメトリクスを公開します(例: リクエスト種別ごとの ThrottleTimeMs)。

スロットルが過大だと、プロデューサはバッファが詰まりレイテンシが増大、コンシューマはフェッチ間隔が伸びてアプリ側遅延やラグ増加につながります。まずは対象エンティティの設定と、default による巻き込みを確認します。

  • クライアントログにスロットリングや待機の警告が出る実装が多い
  • describe でどのレベル(user / client-id / 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 とは別の設定領域です。パーティション再割当などの運用時に使うもので、アプリケーションクライアントの制御とは混同しないようにしましょう。

  • まず default を設定し、想定外の新規クライアントを抑制
  • 重要系は user+client-id で必要最小限の緩和を付与
  • レプリケーションのスロットリング設定は別物として扱う(再割当時のネットワーク占有を抑える用途)
  • CCAAK の観点: 優先度とキー名、スロットリングが遅延で実現される点、観測ウィンドウの概念を押さえる
対象制御手段混同しやすい点
アプリクライアント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 にだけ高い書き込み帯域を与えたい。最も適切な設定手順はどれか?

  1. default の producer_byte_rate を低めに設定し、user=analytics, client-id=nightly-batch の組み合わせに対してより高い producer_byte_rate を個別設定する
  2. client-id=nightly-batch に高い producer_byte_rate を設定し、他は何もしない
  3. user=analytics に高い producer_byte_rate を設定し、他は何もしない
  4. request_percentage を全クライアントで同じ値に設定する

正解: 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 では制御しません。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Kafka

Kafka Topic と Partition の基礎: 分散とスケーラビリティの要

CCDAK 対策と実務の両立を意識し、Topic/Partition/Replica/Consumer Group の役...

Kafka

CCDAK 試験ガイド:出題範囲・配点・申込み・対策

Confluent Certified Developer for Apache Kafka (CCDAK) の出題範囲...

Kafka

Confluent Certified Administrator (CCAAK) 対策: 出題範囲・配点の考え方・運用観点の要点

CCAAKに向けて、試験領域の押さえどころを運用目線で整理。プロダクションで通用する設定・監視・セキュリティの実践知を、...

Kafka

Kafka の Replica と In-Sync Replicas を正しく設計する: 耐障害性と一貫性

レプリカとISRの仕組みを起点に、acks と min.insync.replicas、クリーン/アンクリーンリーダー選...

Kafka

Kafka の Offset とコミット: ポジション管理と at-least-once の基礎

CCDAK 対策と実務の両立を意識して、Kafka コンシューマのオフセット管理とコミット戦略を整理。at-least-...

Kafkaの記事一覧 (101件)
© 2026 NicheeLab All rights reserved.