// 1. 引入 Guava
import com.google.common.util.concurrent.RateLimiter;// 2. 在类中加上
private static final RateLimiter rateLimiter = RateLimiter.create(20000.0 / 3600.0); // 每秒约5.55条// 3. 在每次发送前加
rateLimiter.acquire();
KafkaHelper.javaKafkaProducer("topic", message.getValue());
这样做的效果
- 每秒最多发送约5.55条消息,累计下来每小时不会超过2万条。
- rateLimiter.acquire() 会自动阻塞,保证速率不会超标。
- 这种方式简单、线程安全,适合绝大多数单实例 Producer 场景。
注意事项
- 如果你的 Producer 是多实例/多进程,每个实例都要加同样的限流,否则总量会超出2万条/小时。
- 如果你有分布式限流需求,需要用 Redis 等外部限流器。
你的场景是多线程推送 Kafka,这种情况下用 Guava 的 RateLimiter 依然适用,但有几点需要注意:
1. Guava RateLimiter 是线程安全的
- 你只需要定义一个静态的 RateLimiter 实例,所有线程共享它即可。
- 每个线程在发送前都调用 rateLimiter.acquire(),RateLimiter 会自动保证全局速率不超过设定值。
- 多线程推送时,只要所有线程共享同一个 RateLimiter 实例即可。
- 这样无论多少线程并发,整体速率都不会超过你设定的阈值(每小时2万条)。