我们将实施Kafka Publish订阅系统。
现在,在最糟糕的情况下 - 如果给定主题的所有kafka经纪人都失败了 - 会发生什么?
我尝试了这一点......发布商在元数据提取和默认超时后检测到它如果不成功则抛出异常。
在这种情况下,我们可以在修复Kafka后监视异常并重新启动Publisher。
但是,消费者呢 - 一旦卡夫卡垮台,他们似乎没有任何例外。我们根本不能要求“所有”消费者重新启动他们的系统。有没有更好的方法来解决这个问题?
答案 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
您可以继续轮询,直到群集再次返回,无需重新启动使用者,它将重新建立连接。