我们目前大约有80个应用程序(约200个K8s副本)每天向kafka写入16-17百万条记录,其中一些记录由于超时和重新平衡异常而间歇性地失败。失败率小于0.02%。
我们已经按照其他stackoverflow链接的建议正确地验证和配置了所有参数,但仍然遇到多个问题。
一个问题与再平衡有关,与此问题我们都面临生产者和消费者方面的问题。对于Consumer,我们正在使用自动提交,有时Kafka正在重新平衡,并且Consumer正在接收重复的记录。我们没有进行任何重复检查,因为这会降低处理速度并且重复记录率小于0.1%。我们正在考虑使用数据库进行手动提交和偏移量管理。但是需要从Kafka经纪人的角度理解为什么每天都会发生再平衡。
生产者错误:
org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition.
第二个问题与超时异常有关。对于某些应用程序,它间歇性地发生,Producer试图发送一条记录,并且已将其添加到批处理中,直到请求超时增加到5分钟后,它才无法交付。理想情况下,Kafka应该每隔一定时间重试一次。在调试过程中,我们发现记录累加器即将过期,而在请求超时的情况下甚至不尝试发送它们-这是预期的行为吗?无论如何,我们可以为此添加重试吗?
org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for xxTopic-41:300014 ms has passed since batch creation. </b>
配置: 1. 5位经纪人和3位动物园管理员-Kafka 2.2版2.经纪人在带有状态集的Kubernetes中运行。 3.每个代理都有Confluent for Production建议的32GB和8 CPU。4. Topic有200个分区和8个副本使用者。 5.每个使用者仅处理大约25-30个线程。消费者具有4GB和4CPU容量。
@Value("${request.timeout:300000}") <br/>
private String requestTimeOut;
@Value("${batch.size:8192}") <br/>
private String batchSize;
@Value("${retries:5}") <br/>
private Integer kafkaRetries;
@Value("${retry.backoff.ms:10000}") <br/>
private Integer kafkaRetryBackoffMs;
由于我们来自开发团队,对网络方面的了解不多,无论这是与网络拥塞有关还是我们需要改进应用程序本身的任何方面,都需要帮助。当每天的负载少于1000万并且许多新应用发送消息并增加负载时,我们没有遇到任何问题,我们间歇性地看到上述两个问题。
关于生产者方面的错误,请确保包括作为您的主题的分区领导者的所有代理。您可以通过运行以下命令找出哪个代理是分区的领导者:
./kafka-topics.sh \ --zookeeper zookeeper-host:2181 \ --describe \ --topic your-topic-name Topic: your-topic-name PartitionCount:3 ReplicationFactor:1 Topic: your-topic-name Partition: 0 Leader: 2 Replicas: 2 Isr: 2 Topic: your-topic-name Partition: 1 Leader: 0 Replicas: 0 Isr: 0 Topic: your-topic-name Partition: 2 Leader: 1 Replicas: 1 Isr: 1
在上面的示例中,您必须提供经纪人
0
,1
和2
的所有地址。
我认为我不得不不同意Giorgos,尽管我可能只是误解了他的观点。