Kafka-消费者

基本概念

消费者:负责定于Topic,并从Topic拉取消息

消费组:每个消费者都有对应的消费组。消息发布到Topic中,只会被投递给订阅它的每个消费组中的一个消费者

​ 基于消费者-消费组的模型,可以是的Kafka在消费消息方面具有很好的伸缩性。

消息投递模式

点对点:每条消息只会被一个消费者使用

发布订阅:一对多广播

  • 可以采用集合或者正则表达式订阅主题
  • 集合方式,以最后一次的为准
  • 正则,以最新为准,一般多用于系统之间数据复制
  • 除订阅主题外,可以订阅指定分区

消息消费

消费模式:一般有俩种,推和拉。Kafka基于拉。

​ 拉的内部还包含消费位移,消费者协调器,组协调器,消费者的选举,分区分配的分发,再均衡的逻辑,心跳等内容。

消息结构:与ConsumerRecord相对应,内部多了偏移量,时间戳

位移提交

offset

  • 对于分区而言,表示消息在分区中对应的位置
  • 对于消费者而言,代表消费到分区中某个消息所在的位置
    • 每次调用poll方法时,返回的是未被消费的消息集,因此偏移量需要持久化。除此之外新添加消费者,再均衡也需要偏移量。
    • 旧版客户端的偏移量存储到ZooKeeper,新版存储到Kafka内部的主题**_cunsumer_offsets**中
    • 消费完消息之后执行消费位移的提交,提交有自动和手动。提交不合理会造成消息重复消费。

再均衡

  • 分区的所属权从一个消费者转移到另外的一个消费者
  • 为消费组具备高可用,伸缩性提供保障
  • 发送期间,消费组不可用。原有的消息状态不会同步,尚未提交的会造成重复消费。

多线程

  • KafkaCustomer非线程安全。内部定义了acquire方法,用来检测当前是否只有一个线程操作。公用方法都会调用这个方法,除了wakeup方法。
  • acquire类似轻量级锁,不会阻塞等待。通过线程操作计数的方法来检测线程。
  • 实现多线程方式
    • 依靠一个Customer实例一个线程的方式去消费消息
    • 多线程消费同个分区,代码逻辑复杂。
    • 对于消息处理增加多线程,但消息的顺序性需要考虑。可以减少TCP连接
    • 创建一个滑动窗口。窗口包含消息,内部细分网格。消费者消费网格,完成之后提交,窗口滑动。网格长时间不提交,进行重试处理或其他处理。
<think>好的,我现在需要帮助用户了解如何在Spring Boot中集成Kafka以实现消息消费。首先,我应该回顾用户提供的引用内容,确保回答准确。用户提供了四个引用,其中提到了配置消费者、动态创建消费者、生产者和消费者的使用方法,以及运行Zookeeper和Kafka服务器的步骤。 第一步,我需要整理出一个清晰的步骤指南。根据引用1,首先要配置和运行Zookeeper和Kafka服务器。然后,引用2和3提到在Spring Boot配置文件中设置消费者参数,比如group id和auto offset reset。同时,引用3还提到了导入依赖包、发送和接收消息的方法。引用4讨论了动态创建消费者的问题,但用户的问题主要是基础配置和使用,所以可能暂时不需要深入动态部分,但可以简要提及。 接下来,我需要确保按照用户的要求使用正确的中文和LaTeX格式。例如,变量或配置项如`group-id`应该用$group-id$表示,但根据示例,可能需要用行内代码块更合适,或者根据系统级指令,数学表达式才用$...$。这里配置项属于代码,应该用反引号包裹,比如`group-id`。 然后,用户要求生成相关问题,我需要根据教程内容提出相关的问题,例如性能优化、配置参数作用、多消费者处理等。 在结构上,按照用户示例,先分步骤讲解,包括依赖添加、配置文件设置、消费者监听器的编写、运行服务器和测试。每个步骤需要结合引用内容,比如在配置文件中设置参数时引用[2]和[3]。同时,代码示例要正确,比如使用@KafkaListener注解,并指出其局限性,引用[4]提到动态创建的问题。 最后,检查是否所有引用都被正确标注,例如在提到配置参数时引用[2],在运行服务器步骤引用[1]。确保没有遗漏关键步骤,比如启动Zookeeper和Kafka服务器,这是消费消息的前提条件。 可能需要注意用户提到的系统级指令中的第5点,生成相关问题,所以需要围绕教程内容提出三个相关问题,例如配置参数的作用、多主题消费的方法、以及如何处理消费异常。 总结整个思考过程,需要将各个引用内容整合到步骤中,确保每个步骤都有对应的引用支持,同时保持回答结构清晰,符合用户的要求。</think>### Spring Boot集成Kafka消费者配置与使用教程 #### 1. 环境准备与依赖配置 - **步骤1**:在`pom.xml`中添加Kafka依赖: ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> ``` 此依赖提供了Spring Boot对Kafka的集成支持[^3]。 - **步骤2**:配置Kafka消费者参数(`application.yml`): ```yaml spring: kafka: bootstrap-servers: localhost:9092 consumer: group-id: my-consumer-group auto-offset-reset: earliest key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: org.apache.kafka.common.serialization.StringDeserializer ``` 其中: - `group-id`定义消费者组,同一组内消费者共享消息负载[^2]; - `auto-offset-reset: earliest`表示从最早未消费的偏移量开始读取。 #### 2. 实现消息监听 ```java @Component public class KafkaConsumer { @KafkaListener(topics = "my-topic") public void receiveMessage(String message) { System.out.println("Received: " + message); } } ``` - 使用`@KafkaListener`注解监听指定主题,支持多主题如`topics = {"topic1", "topic2"}`; - 默认情况下,消费者为静态配置,若需动态创建需扩展`ConcurrentKafkaListenerContainerFactory`[^4]。 #### 3. 运行与测试 - **步骤1**:启动Zookeeper与Kafka服务器[^1]: ```bash # 启动Zookeeper bin/zookeeper-server-start.sh config/zookeeper.properties # 启动Kafka bin/kafka-server-start.sh config/server.properties ``` - **步骤2**:使用Kafka生产者发送消息: ```java @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) { kafkaTemplate.send(topic, message); } ``` - **步骤3**:启动Spring Boot应用,消费者将自动订阅并消费消息。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值