Spring Kafka多KafkaTemplate与多Schema Registry配置可行性咨询
Spring Kafka多模板配置问题解答
两个问题的答案均为是,具体实现说明如下:
1. 创建多个同Key/Value类型、不同生产者配置的KafkaTemplate
Spring Kafka 2.5+完全支持该需求,有两种常用实现方式:
方式一:定义多个独立ProducerFactory
分别为每个KafkaTemplate创建对应的ProducerFactory Bean,即使Key/Value类型完全一致也可以通过Bean名称区分,配置示例如下:
@Configuration public class KafkaMultiTemplateConfig { @Value("${spring.kafka.bootstrap-servers}") private String bootstrapServers; // 默认ProducerFactory与KafkaTemplate @Bean public ProducerFactory<String, String> defaultProducerFactory() { Map<String, Object> props = new HashMap<>(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); // 其他默认生产者配置 return new DefaultKafkaProducerFactory<>(props); } @Bean public KafkaTemplate<String, String> defaultKafkaTemplate() { return new KafkaTemplate<>(defaultProducerFactory()); } // 差异化配置的ProducerFactory与KafkaTemplate @Bean public ProducerFactory<String, String> anotherProducerFactory() { Map<String, Object> props = new HashMap<>(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); // 你需要的差异化生产者配置 return new DefaultKafkaProducerFactory<>(props); } @Bean public KafkaTemplate<String, String> anotherKafkaTemplate() { return new KafkaTemplate<>(anotherProducerFactory()); } }
使用时通过@Qualifier指定Bean名称注入对应模板即可:
@Autowired @Qualifier("defaultKafkaTemplate") private KafkaTemplate<String, String> defaultTemplate; @Autowired @Qualifier("anotherKafkaTemplate") private KafkaTemplate<String, String> anotherTemplate;
方式二:复用同一基础ProducerFactory,覆写指定配置
如果不想重复编写公共配置,可以调用copyWithConfigurationOverride方法基于基础工厂生成覆写配置的新工厂:
@Bean public KafkaTemplate<String, String> anotherKafkaTemplate(ProducerFactory<String, String> baseProducerFactory) { Map<String, Object> overrideProps = new HashMap<>(); // 填入所有需要覆写的生产者配置 ProducerFactory<String, String> overriddenFactory = baseProducerFactory.copyWithConfigurationOverride(overrideProps); return new KafkaTemplate<>(overriddenFactory); }
2. 为不同KafkaTemplate绑定独立Schema Registry
该需求完全可实现。Schema Registry的相关配置(包括Registry地址、认证信息、绑定的Schema ID/版本等)本身就是生产者配置的一部分,你只需要将不同Schema Registry的差异化配置写入对应ProducerFactory的属性即可。
针对AWS Glue Schema Registry场景,只需要在两个ProducerFactory的配置中分别添加对应Registry的配置即可:
- 默认模板的ProducerFactory配置中添加Registry A的相关参数,指定绑定schema 1
- 差异化模板的ProducerFactory配置中添加Registry B的相关参数,指定绑定schema 10
两个模板的序列化、Schema校验逻辑完全隔离,不会互相干扰。
内容的提问来源于stack exchange,提问作者Anvesh Raavi
相关产品推荐
相关产品推荐

