我的设置包括3个kafka代理(2.11-1.1.1),一个ZK和一个使用Streams API的Java服务。
java服务从主题A消费,执行持久性流操作(由changelog和重新分区流主题支持)并写入主题B。启用了EOS语义。
鉴于changelog和repartition主题的复制因子为1,万一我的代理关闭(例如,在我的DEV环境中,磁盘仅用于一个代理),流Java应用应如何表现。即使无法访问1/3的变更日志和重新分区分区,流仍会继续消耗吗?
编辑:另外,考虑到主题A,B和__consumer_offsets的RF = 3。
在我的java服务日志中,我看到:
index=* [| inputlookup test.csv]
什么也没消耗。
在两个有效的经纪人日志中,我看到:
2019-01-04 09:14:38,787 UTC WARN kafka-producer-network-thread | trsb-app-
nonprod.snapshot-14fa12b2-ac15-4ecc-8729-8f6c4a0034a7-StreamThread-2-0_4-
producer org.apache.kafka.clients.NetworkClient warn | [Producer
clientId=trsb-app-nonprod.snapshot-14fa12b2-ac15-4ecc-8729-8f6c4a0034a7-
StreamThread-2-0_4-producer, transactionalId=trsb-app-nonprod.snapshot-0_4]
Connection to node 1 could not be established. Broker may not be available.
2019-01-04 09:14:38,797 UTC WARN kafka-producer-network-thread | trsb-app-
nonprod.snapshot-14fa12b2-ac15-4ecc-8729-8f6c4a0034a7-StreamThread-2-1_10-
producer org.apache.kafka.clients.NetworkClient warn | [Producer
clientId=trsb-app-nonprod.snapshot-14fa12b2-ac15-4ecc-8729-8f6c4a0034a7-
StreamThread-2-1_10-producer, transactionalId=trsb-app-nonprod.snapshot-
1_10] Connection to node 1 could not be established. Broker may not be
available.
答案 0 :(得分:1)
由于您仅使用一次语义,因此至少需要3个代理才能继续处理,因此如果其中一个代理发生故障,您的应用程序将不会继续处理。在此处阅读(请参阅processing.guarantee部分)以获取有关此信息的更多信息:
https://kafka.apache.org/10/documentation/streams/developer-guide/config-streams.html#id25
答案 1 :(得分:0)
流继续消耗,但是由于状态存储库(取决于消息密钥)可能无法推送到其相应的更改日志分区,因此某些密钥可能会失败,并且这些事务将失败并回滚。结果,主题A上的第一个密钥一旦被使用,将导致状态存储推入失败,并将阻塞其分区,直到代理再次启动。这是因为状态存储推入是EOS事务的一部分。