[英]How to use ABSwitchCluster to failover between Kafka clusters
我有一個使用 Kafka 在實例之間同步數據的應用程序,因此它既可以生成也可以使用來自 Kafka 的數據,此外,該應用程序正在使用 Kafka 主題並將該數據轉換和流式傳輸到另一個主題中供客戶使用。
我的應用程序有兩個用於故障轉移的集群。 通過 Kafka 文檔,我發現這個https://docs.spring.io/spring-kafka/docs/current/reference/html/#connecting談到ABSwitchCluster
。
如果 Kafka 集群出現故障,我如何使用ABSwitchCluster自動故障轉移,對於KafkaTemplate.send()
和@KafkaListener
注釋方法?
更新更多信息
我為 KafkaTemplate.send 和 Kafka Consumer Events NonResponsiveConsumerEvent
和ListenerContainerIdleEvent
添加了一些錯誤處理程序
最終他們調用一個shared Method進行切換,並使用一個BeanPostProcessor
將ABSwitchCluster
實際添加到KafkaResourceFactory
Beans中。
切換代碼如下所示:
@Autowired
KafkaSwitchCluster kafkaSwitchCluster;
@Autowired
WebApplicationContext context;
@Autowired
KafkaListenerEndpointRegistry registry;
/**
* Unable to use {@link Autowired} due to circular dependency
* with {@link KafkaPostProcessor}
* @return
*/
public DefaultKafkaProducerFactory getDefaultKafkaProducerFactory()
{ return context.getBean(DefaultKafkaProducerFactory.class); }
/** Back-End Method to Actually Switch between the clusters */
private void switchCluster()
{
if (kafkaSwitchCluster.isPrimary()) { kafkaSwitchCluster.secondary(); }
else { kafkaSwitchCluster.primary(); }
getDefaultKafkaProducerFactory().reset();
registry.stop();
registry.destroy();
registry.start();
for(MessageListenerContainer listener : registry.getListenerContainers() )
{
listener.stop();
listener.start();
}
}
在查看測試日志時,鑒於上面的更新,生產者似乎是正確的,正在切換集群,但我的消費者不是。
那么如何讓@KafkaListener
消費者切換呢?
默認的生產者和消費者工廠以及KafkaAdmin
是KafkaResourceFactory
的子類。
通過調用setBootstrapServersSupplier()
ABSwitchCluster
ABSwitchCluster
不會自動進行故障轉移。
您需要自己的代碼來執行故障轉移,然后在生產者工廠調用reset()
並停止/啟動所有偵聽器容器(所有@KafkaListener
的KafkaListenerEndpointRegistry.stop()/start()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.