卡夫卡UNKNOWN_PRODUCER_ID异常

时间:2018-06-26 06:38:33

标签: apache-kafka apache-kafka-streams

使用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被删除,生产者的元数据从   经纪人,生产者将来的附加操作将返回此异常。

它说,一种可能性是生产者闲置的时间超过保留时间(默认情况下为一周),因此该生产者的元数据将从代理中删除。经纪人无法找到生产者元数据还有其他原因吗?

2 个答案:

答案 0 :(得分:1)

两个原因可能会删除生产者的元数据:

  1. 由于达到保留时间,删除了日志段。
  2. 生产者状态可能由于不活动而过期,这由设置 transactional.id.expiration.ms 控制,该设置默认为7天

因此,如果您的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

进行了跟踪