卡夫卡消费者健康检查

时间:2019-05-14 15:35:49

标签: spring-kafka

有没有一种简单的方法可以说明使用者(使用spring boot和@KafkaListener创建)是否正常运行? 其中包括-可以访问和轮询代理,至少分配了一个分区,等等。

我看到有很多方法可以订阅不同的生命周期事件,但这似乎是一个非常脆弱的解决方案。

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用AdminClient来获取当前组的状态...

@SpringBootApplication
public class So56134056Application {

    public static void main(String[] args) {
        SpringApplication.run(So56134056Application.class, args);
    }

    @Bean
    public NewTopic topic() {
        return new NewTopic("so56134056", 1, (short) 1);
    }

    @KafkaListener(id = "so56134056", topics = "so56134056")
    public void listen(String in) {
        System.out.println(in);
    }

    @Bean
    public ApplicationRunner runner(KafkaAdmin admin) {
        return args -> {
            try (AdminClient client = AdminClient.create(admin.getConfig())) {
                while (true) {
                    Map<String, ConsumerGroupDescription> map =
                            client.describeConsumerGroups(Collections.singletonList("so56134056")).all().get();
                    System.out.println(map);
                    System.in.read();
                }
            }
        };
    }

}
  

{so56134056=(groupId=so56134056, isSimpleConsumerGroup=false, members=(memberId=consumer-2-32a80e0a-2b8d-4519-b71d-671117e7eaf8, clientId=consumer-2, host=/127.0.0.1, assignment=(topicPartitions=so56134056-0)), partitionAssignor=range, state=Stable, coordinator=localhost:9092 (id: 0 rack: null))}

我们一直在考虑将getLastPollTime()暴露给侦听器容器API。

getAssignedPartitions()从2.1.3开始可用。

答案 1 :(得分:0)

我知道您没有在帖子中提到它-但是请注意,如果您随后将其添加到运行状况检查中,那么如果您随后将其部署到AWS中并在ELB扩展环境中使用这种运行状况检查即可。

例如,可能发生的一种情况是您的应用程序失去了与Kafka的连接-您的运行状况检查变成了红色-然后,弹性beantalks开始杀死并重新启动实例的过程(这种情况将持续发生,直到您的Kafka实例被再次可用)。这可能会很昂贵!

关于健康检查是否应该“级联失败”,例如,还有一个更普遍的哲学问题。 kafka处于关闭状态,因此连接到kafka的应用程序声称其处于关闭状态,链中的下一个应用程序也执行了此类操作,依此类推,等等。这通常是通过断路器实现的,这种断路器旨在最大程度地减少因失败而导致的缓慢呼叫。 >