我有时发现 UNKNOWN_PRODUCER_ID
使用Kafka流时出现异常。
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关联的producer元数据,则会引发此异常。例如,如果制作者的记录因保留时间已过而被删除,则可能发生这种情况。一旦producerid的最后一条记录被删除,producer的元数据就会从代理中删除,producer的后续附件将返回此异常。
它说一种可能性是生产者的空闲时间超过了保留时间(默认为一周),因此生产者的元数据将从代理中删除。代理找不到生产者元数据还有其他原因吗?
2条答案
按热度按时间tpgth1q71#
你可能正在经历https://issues.apache.org/jira/browse/kafka-7190. 就像那张票上说的:
当streams应用程序几乎没有通信量时,使用者清除可能会删除生产者发送的最后一条消息(即,该生产者发送的所有消息都已被消费和提交),因此,代理将删除该生产者的id。下一次当该生产者尝试发送时,它将获得这个未知的\u producer\u id错误代码,但在这种情况下,这个错误是可重试的:生产者将只获得一个新的生产者id并重试,然后这次它将成功。
这一问题也正在进行跟踪https://cwiki.apache.org/confluence/display/kafka/kip-360%3a+improve+handling+of+unknown+producer
brccelvz2#
有两个原因可能会删除生产者的元数据:
由于达到保留时间,日志段被删除。
生产者状态可能由于不活动而过期,这由设置transactional.id.expiration.ms(默认为7天)控制
因此,如果您的kafka<2.4,您可以通过增加主题日志的保留时间(考虑到您的系统允许)来解决此问题(例如30天),并增加transactional.id.expiration.ms设置(到24天),直到kip-360发布:
log.retention.hours=720小时
事务性.id.expiration.ms=207360000
这将保证对于低流量主题(很少写入7天以内的消息),生产者的元数据状态将在代理的内存中保持较长时间,从而降低获得未知ProducerIdexception的风险。