我有一个Kafka基础架构,其主题只有一个分区,将有2个使用者订阅该分区。第二个使用者将运行备份副本应用程序。
现在的问题是,我希望第二个使用者充当故障转移使用者,即,如果主应用程序的使用者崩溃,则故障转移应用程序的使用者开始阅读。
我可以做的是,在第二个使用者方面,我可以通过调用Thread#Sleep
引入延迟,这样第一个使用者将获得分配的分区。
// called at the consumer bean initialization
void subscribeConsume() {
// leaving exception handling for brevity
if(application.type.equals("BackupApp")) {
TimeUnit.MINUTE.sleep(5);
}
...
// subscription logic
}
但是这似乎是解决方法/破解,而不是可靠的解决方案。消费者库中是否有任何Kafka属性可以在此处提供帮助。
如果您的一台kafka服务器的一个主题具有单个分区,而两个使用者使用同一主题,则默认情况下,一次只能有一个使用者接收消息。因为它只有一个分区。当该使用者关闭时,在会话超时后(默认值为5分钟),该使用者重新平衡将开始,您的第二个使用者将能够接收相同主题的消息。现在,正如您所提到的,您拥有kafka基础结构,如果您提到该基础结构是否具有kafka集群,则在故障转移配置中就变得很有意义。