有没有一种简单的方法可以说明使用者(使用spring boot和@KafkaListener创建)是否正常运行? 其中包括-可以访问和轮询代理,至少分配了一个分区,等等。
我看到有很多方法可以订阅不同的生命周期事件,但这似乎是一个非常脆弱的解决方案。
谢谢!
答案 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的应用程序声称其处于关闭状态,链中的下一个应用程序也执行了此类操作,依此类推,等等。这通常是通过断路器实现的,这种断路器旨在最大程度地减少因失败而导致的缓慢呼叫。 >