使用kafka流时,有时会发现UNKNOWN_PRODUCER_ID
异常。
2018-06-25 10:31:38.329 WARN 1 --- [-1-1_0-producer] o.a.k.clients.producer.internals.Sender : [Producer clientId=default-groupz-7bd94946-3bc0-4400-8e73-7126b9b9c0d4-StreamThread-1-1_0-producer, transactionalId=default-groupz-1_0] Got error produce response with correlation id 1996 on topic-partition default-groupz-mplat-five-minute-stat-urlCount-counts-store-changelog-0, retrying (2147483646 attempts left). Error: UNKNOWN_PRODUCER_ID
参考官方文件:
如果经纪人无法找到该异常,则会引发此异常 与相关的producerId相关联的生产者元数据。这个 例如,如果删除了生产者的记录,可能会发生 因为他们的保留时间已经过去了。一旦最后的记录 producerId被删除,生产者的元数据从 经纪人,生产者将来的附加操作将返回此异常。
它说,一种可能性是生产者闲置的时间超过保留时间(默认情况下为一周),因此该生产者的元数据将从代理中删除。经纪人无法找到生产者元数据还有其他原因吗?
答案 0 :(得分:1)
两个原因可能会删除生产者的元数据:
因此,如果您的Kafka是<2.4,您可以通过增加主题日志的保留时间(例如,系统允许)(例如30天)并增加 transactional.id.expiration.ms来解决此问题。 设置(到24天),直到释放KIP-360:
log.retention.hours = 720
transactional.id.expiration.ms = 2073600000
这将确保对于低流量主题(写的消息很少少于7天),生产者的元数据状态将在代理的内存中保留更长的时间,从而降低了获得UnknownProducerIdException的风险。
答案 1 :(得分:0)
您可能遇到https://issues.apache.org/jira/browse/KAFKA-7190。如票证中所述:
当流应用程序的流量很少时,消费者清除可能会删除 甚至是生产者发送的最后一条消息(即, 该生产者已被消耗和承诺),因此,经纪人 会删除该生产者的ID。下次该生产者尝试 发送,它将获得此UNKNOWN_PRODUCER_ID错误代码,但在这种情况下, 此错误是可重试的:生产者将只获得一个新的生产者ID,然后 重试,然后这次将成功。
此问题也在https://cwiki.apache.org/confluence/display/KAFKA/KIP-360%3A+Improve+handling+of+unknown+producer
进行了跟踪