如何处理Kafka Cluster的失败

时间:2016-03-03 03:35:17

标签: apache-kafka kafka-consumer-api

我们将实施Kafka Publish订阅系统。

现在,在最糟糕的情况下 - 如果给定主题的所有kafka经纪人都失败了 - 会发生什么?

我尝试了这一点......发布商在元数据提取和默认超时后检测到它如果不成功则抛出异常。

在这种情况下,我们可以在修复Kafka后监视异常并重新启动Publisher。

但是,消费者呢 - 一旦卡夫卡垮台,他们似乎没有任何例外。我们根本不能要求“所有”消费者重新启动他们的系统。有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:4)

  

但是,消费者呢 - 他们似乎没有任何例外   一旦卡夫卡下台。我们根本不能问“所有”消费者   重启他们的系统。有没有更好的方法来解决这个问题?

是的,消费者不会得到任何例外,并且行为按设计工作。但是,您不需要重新启动所有使用者,只需在您的逻辑中确保消费者定期调用poll()方法调用。即使没有集群存在,消费者的设计也不会受到影响。请考虑以下步骤以了解实际发生的情况:

1:所有群集都已关闭,没有活动群集。

2:consumer.poll(timeout) // This will be called form you portion of code

3:在poll()内进行KafkaConsumer.java方法调用,将进行以下调用。

poll() --> pollOnce() --> ensureCoordinatorKnown() --> awaitMetaDataUpdate()

我已经强调了在内部执行逻辑检查后将调用的主要方法调用。现在,此时您的消费者将等待群集重新启动。

4:再次集群或重新启动

5:将通知消费者,它将像群集发生故障之前一样重新开始工作。

注意: - Consumer将从最后一次偏移提交开始接收消息,成功接收的消息将不会重复。

描述的行为对(0.9.x版本)

有效

答案 1 :(得分:2)

如果消费者(0.9.x版本)正在轮询并且群集发生故障,则应该得到以下异常

java.net.ConnectException: Connection refused

您可以继续轮询,直到群集再次返回,无需重新启动使用者,它将重新建立连接。