在 Debian 上运行的 Kafka 本身没有像“限速命令”那样简单的一个开关,限速通常是通过配置参数或外部工具来实现的。下面按常见场景给你总结几种实用方法。
通过限制发送速率来限速:
# producer 配置
linger.ms=50
batch.size=16384
max.in.flight.requests.per.connection=1
更精确的限速需要自己控制发送逻辑,例如:
if (rateLimiter.tryAcquire()) {
producer.send(record);
}
或使用 Guava RateLimiter。
Kafka 消费者是拉模型,天然可控:
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
// 处理
}
Thread.sleep(100); // 控制消费速度
}
也可使用:
fetch.max.bytes
max.poll.records
Kafka 支持 Quota(配额),这是最正规的“限速”方式。
kafka-configs.sh --bootstrap-server localhost:9092 \
--alter --entity-type clients --entity-name clientA \
--add-config 'producer_byte_rate=1048576,consumer_byte_rate=2097152'
含义:
producer_byte_rate=1MB/sconsumer_byte_rate=2MB/s查看:
kafka-configs.sh --bootstrap-server localhost:9092 \
--describe --entity-type clients
⚠️ 这是 broker 级强制限速,非常推荐。
Kafka 不直接支持 topic 限速,但可以通过:
实现“软限速”。
如果 Kafka 限速不够,可以用 Linux 工具:
# 限制 9092 端口 1MB/s
tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
⚠️ 影响所有流量,需谨慎。
iptables -A INPUT -p tcp --dport 9092 -m hashlimit \
--hashlimit-above 1/s --hashlimit-mode srcip \
--hashlimit-name kafka -j DROP
如果是 Docker:
services:
kafka:
networks:
default:
limits:
bandwidth: 1mb
或使用 docker-compose + tc。
| 场景 | 推荐方式 |
|---|---|
| 控制某客户端速度 | Kafka Quota ✅ |
| 控制消费速度 | Consumer sleep / max.poll.records |
| 系统级硬限 | tc / iptables |
| Docker | docker network limit |
如果你能告诉我:
我可以给你精确到配置文件的示例。