在C#中使用Confluent Kafka如何订阅两个schema不同的主题?
问题结论
不可以用同一个消费者实例订阅这两个配置要求不同的主题,你需要创建两个独立的ConsumerBuilder生成不同的消费者实例分别处理两个主题。
核心原因
- 你使用的
CachedSchemaRegistryClient配置是初始化后不可修改的,而消费者绑定的反序列化器在创建时就关联了固定的Schema Registry客户端实例,无法在消费不同主题时动态切换有无BasicAuthUserInfo的配置。 - 就算强行通过自定义反序列化器实现动态切换逻辑,也会触发Schema缓存冲突、认证上下文错乱的问题,消费稳定性和性能都会受到严重影响,不属于合规的实现方案。
推荐实现方案
分别创建两个消费者实例,各自对应不同的Schema Registry配置,示例代码如下:
// 消费者1:处理需要Schema Registry认证的主题 var schemaRegistryWithAuth = new CachedSchemaRegistryClient(new SchemaRegistryConfig { Url = ConsumerConfig.SchemaRegistryUrl, BasicAuthUserInfo = ConsumerConfig.SchemaRegistryBasicAuthCredentials, }); var consumerWithAuth = new ConsumerBuilder<Ignore, 你的第一个消息类型>(通用消费者配置) .SetValueDeserializer(new AvroDeserializer<你的第一个消息类型>(schemaRegistryWithAuth).AsSyncOverAsync()) .Build(); consumerWithAuth.Subscribe("需要认证的主题名");
// 消费者2:处理不需要Schema Registry认证的主题 var schemaRegistryWithoutAuth = new CachedSchemaRegistryClient(new SchemaRegistryConfig { Url = ConsumerConfig.SchemaRegistryUrl }); var consumerWithoutAuth = new ConsumerBuilder<Ignore, 你的第二个消息类型>(通用消费者配置) .SetValueDeserializer(new AvroDeserializer<你的第二个消息类型>(schemaRegistryWithoutAuth).AsSyncOverAsync()) .Build(); consumerWithoutAuth.Subscribe("不需要认证的主题名");
两个消费者可以放在不同的后台线程/异步任务中运行,只要配置不同的消费者组ID就不会互相干扰,资源开销也在可控范围内。
内容的提问来源于stack exchange,提问作者Parham Gitijah
相关产品推荐
相关产品推荐

