由于代理关闭,流的更改日志和重新分区的子集不可用-流应如何表现?

时间:2019-01-04 13:42:23

标签: apache-kafka apache-kafka-streams

我的设置包括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.

2 个答案:

答案 0 :(得分:1)

由于您仅使用一次语义,因此至少需要3个代理才能继续处理,因此如果其中一个代理发生故障,您的应用程序将不会继续处理。在此处阅读(请参阅processing.guarantee部分)以获取有关此信息的更多信息:

https://kafka.apache.org/10/documentation/streams/developer-guide/config-streams.html#id25

答案 1 :(得分:0)

流继续消耗,但是由于状态存储库(取决于消息密钥)可能无法推送到其相应的更改日志分区,因此某些密钥可能会失败,并且这些事务将失败并回滚。结果,主题A上的第一个密钥一旦被使用,将导致状态存储推入失败,并将阻塞其分区,直到代理再次启动。这是因为状态存储推入是EOS事务的一部分。