使用 Kafka 配额实现负载隔离

本页介绍了如何使用配额控制 Managed Service for Apache Kafka 集群中的代理资源。

概览

Kafka 可让您设置配额,以限制不同客户端的带宽和请求速率。您可以使用配额来确保一个应用上意外出现的负载高峰不会影响其他应用。

您可以设置以下配额:

  • 提供方和使用方的网络带宽。
  • I/O 和网络线程的百分比,用于限制请求速率。

如需详细了解 Kafka 配额,请参阅 Kafka 文档中的配额。Kafka 配额不同于适用于 Managed Service for Apache Kafka 的Google Cloud 配额

设置配额

您可以为经过身份验证的主账号client-id 群组设置配额。本页面介绍了如何为正文设置配额,但这些步骤同样适用于 client-id 群组。

前提条件

在开始之前,请在 Compute Engine 虚拟机上安装 Kafka 命令行工具。虚拟机必须能够访问连接到集群的子网。如需创建虚拟机并安装 Kafka 工具,请按照使用 Kafka 命令行工具生成和使用消息中的说明操作。

设置网络带宽配额

如需设置网络带宽配额,请按如下所示运行 kafka-configs.sh --alter 命令:

kafka-configs.sh --alter \
  --entity-type users \
  --entity-name KAFKA_USER \
  --add-config 'producer_byte_rate=PRODUCER_LIMIT,consumer_byte_rate=CONSUMER_LIMIT' \
  --bootstrap-server=BOOTSTRAP_ADDRESS \
  --command-config client.properties

替换以下内容。

  • KAFKA_USER:应用配额的主账号。
  • PRODUCER_LIMIT:生产者字节速率上限,以每秒字节数为单位。
  • CONSUMER_LIMIT:消费者字节速率上限,以每秒字节数为单位。
  • BOOTSTRAP_ADDRESS:集群的引导地址

设置请求速率配额

如需设置请求速率配额,请按如下方式运行 kafka-configs.sh --alter 命令:

kafka-configs.sh --alter \
  --entity-type users \
  --entity-name KAFKA_USER \
  --add-config 'request_percentage=REQUEST_RATE_LIMIT' \
  --bootstrap-server=BOOTSTRAP_ADDRESS \
  --command-config client.properties

替换以下内容。

  • KAFKA_USER:应用配额的主账号。
  • REQUEST_RATE_LIMIT:允许的 IO 和网络线程时间百分比,总时间为 (num.io.threads + num.network.threads) * 100%。该值可以超过 100。
  • BOOTSTRAP_ADDRESS:集群的引导地址

查看配额

如需查看为所有主账号设置的配额,请按如下方式运行 kafka-configs.sh --describe 命令:

kafka-configs.sh --describe --all \
  --entity-type users \
  --bootstrap-server=BOOTSTRAP_ADDRESS \
  --command-config client.properties

BOOTSTRAP_ADDRESS 替换为集群的引导地址

移除配额

如需移除主账号的配额,请按如下方式运行 kafka-configs.sh --alter 命令:

kafka-configs.sh --alter \
  --entity-type users \
  --entity-name KAFKA_USER \
  --delete-config 'producer_byte_rate,consumer_byte_rate,request_percentage' \
  --bootstrap-server=BOOTSTRAP_ADDRESS \
  --command-config client.properties

替换以下内容。

  • KAFKA_USER:要移除配额的主账号。
  • BOOTSTRAP_ADDRESS:集群的引导地址

示例:限制提供方带宽

本部分介绍了如何通过为 Compute Engine 默认服务账号设置网络带宽配额来限制生产者带宽。默认情况下,此服务账号会附加到您创建的所有 Compute Engine 虚拟机。

  1. 定义以下 shell 变量:

    export BOOTSTRAP=BOOTSTRAP_ADDRESS
    export TOPIC=TOPIC_NAME
    export KAFKA_USER=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    
  2. 如需查找基准吞吐量,请使用 kafka-producer-perf-test.sh 命令运行性能测试。

    kafka-producer-perf-test.sh \
      --topic test-topic \
      --num-records 1000000 --throughput 1000 --record-size 1024 \
      --print-metrics \
      --producer-props bootstrap.servers=$BOOTSTRAP \
      --producer.config client.properties
    

    此命令会将 100 万条记录发送到指定的 Kafka 主题。--throughput 标志将吞吐量限制为每秒 1000 条消息,--record-size 将消息大小设置为 1024 字节。因此,此测试的负载为每秒 (1000 * 1024) 字节,即大约 1 MBps。

    输出结果会显示测试的性能指标,如下所示:

    5005 records sent, 1000.6 records/sec (0.98 MB/sec), 3.7 ms avg latency, 41.0 ms max latency.
    5002 records sent, 1000.2 records/sec (0.98 MB/sec), 3.3 ms avg latency, 23.0 ms max latency.
    

    在此示例中,吞吐量大约等于所请求的 1 MBps 速率。

  3. 假设您想将提供方的速度限制为 100 kBps。将生产者吞吐量配额设置为如下值:

    kafka-configs.sh --alter \
      --entity-type users \
      --entity-name $KAFKA_USER \
      --add-config 'producer_byte_rate=100000' \
      --bootstrap-server=$BOOTSTRAP \
      --command-config client.properties
    
  4. 重复执行性能测试。输出显示吞吐量较低:

    118 records sent, 204.6 records/sec (0.20 MB/sec), 220.7 ms avg latency, 4348.0 ms max latency.
    60 records sent, 10.7 records/sec (0.01 MB/sec), 6145.2 ms avg latency, 9912.0 ms max latency.
    1020 records sent, 181.5 records/sec (0.18 MB/sec), 11693.7 ms avg latency, 14513.0 ms max latency.
    75 records sent, 13.0 records/sec (0.01 MB/sec), 16864.1 ms avg latency, 20219.0 ms max latency.
    1005 records sent, 183.9 records/sec (0.18 MB/sec), 22088.6 ms avg latency, 24679.0 ms max latency.
    75 records sent, 13.0 records/sec (0.01 MB/sec), 27030.4 ms avg latency, 30387.0 ms max latency.
    

    在此示例中,吞吐量每秒都在变化,但在任何 2 秒的时间窗口内,吞吐量都与配额保持一致。延迟时间也会增加,因为测试生成数据的速度快于发送数据的速度(由于配额限制)。

    后续步骤