Kafka多topic动态消费

3,304 阅读3分钟

背景

来源于公司最近的一个业务场景,基础组件会将各个业务不同服务的消息发送kafka的多个topic,我们的业务是去订阅这些topic的消息,并且每次有新的服务加入产生新的topic时,可以动态的配置进行订阅,然后消费这些服务的消息,一个topic可能对应多个服务,为了防止单点故障以及单topic消息量多大的问题,因此基础组件部门会将消息分发到多个topic上。

需要的问题

  1. 消费组如何批量订阅多个topic?
  2. 如何在线上动态更改消费组订阅的topic? 以下给出kafka的解决方案:

消费组如何批量订阅多个topic?

kafak支持批量订阅多个topic, Kafka有四个核心的API:

  • The Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。
  • The Consumer API 允许一个应用程序订阅一个或多个 topic ,并且对发布给他们的流式数据进行处理。
  • The Streams API 允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。
  • The Connector API 允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表(table)的所有变更内容。 topic中的partition是一个并行的概念。 Kafka能够为一个消费者池提供顺序保证和负载平衡,是通过将topic中的partition分配给消费者组中的消费者来实现的, 以便每个分区由消费组中的一个消费者消耗。通过这样,我们能够确保消费者是该分区的唯一读者,并按顺序消费数据。 众多分区保证了多个消费者实例间的负载均衡。但请注意,消费者组中的消费者实例个数不能超过分区的数量。

如何在线上动态更改消费组订阅的topic?

经过尝试,使用@KafkaListener注解实现不了此需求,在程序启动的时候,程序就会根据@KafkaListener的注解信息初始化好消费者去消费指定好的topic。如果在程序运行的过程中,修改topic,不会让此消费者修改消费者的配置再重新订阅topic的。 不使用@KafkaListener,使用kafka原生客户端依赖,手动初始化消费者,开启消费者线程。在消费者线程中,每次循环都从配置、数据库或者其他配置源获取最新的topic信息,与之前的topic比较,如果发生变化,重新订阅topic或者初始化消费者。