Kafka-消费者如何避免消息积压+消费常用模式+配置参数

一、 常用消费者的消费模式

  • 多个消费线程可以在一个进程中,也可以在不同进程中
  • 消费线程负责拉取数据,每一条消费放到一个线程池负责业务逻辑的处理
    • 如果要保证消息有序这种模式不行
  • 自动提交偏移量
    • 可能丢失,可以调小自动提交偏移量的时间间隔,减少丢失的数量和丢失的概率
    • 可能重复,需要做幂等处理
  • 手动提交偏移量
    • 消费者自己维护需要提交的偏移量,按照不同分区维护
    • 消费自己控制提交偏移量的时机,什么时候提交
    • 消费者自己空提交偏移量的方式
      • 消费一条提交一条
      • 消费多条批量提交
      • 按照分区的维度提交偏移量
  • 如何控制消费速度避免消息积压,控制消费的速度
    • 每个topic多设置分区数,提高并行消费的并行力度
    • 消费线程拉取消息后,将消息放到处理线程池中,线程池的大小可以在适当调大一些
    • 消费线程每次拉取消息的消息数量可以适当调大,但是不能超过默认配置的poll间隔时间5分钟,因为超过5分钟没有poll组协调者会认为消费者下线;也可以把5分钟时间调大,不建议调
    • 消费者提价偏移量改为自动提交
    • 消费者偏移量如果是手动同步提交,改为手动异步提交或者自动提交
    • 消费线程将拉取的消息放到一个滑动窗口中,通过滑动窗口控制拉取的速度

 

 

 

二、消费者常用配置参数

1. fetch.min.byte
消费者从服务器获取记录的最小字节数。如果可用的数据量小于设置值,broker 会等待有足够的可用数据时才会把它返回给消费者。默认 1B大小,可以适当调高可以提高一定的吞吐量。针对一个concsumer而言的配置参数


2. fetch.max.wait.ms
broker 返回给消费者数据的等待时间,默认是 500ms。如果 fetch.min.byte配置的值不能达到,等到500ms后就返回。针对一个concsumer而言的配置参数

 

3. fetch.max.byte
有了最小肯定有最大的参数配置,默认最大50M。针对一个concsumer而言的配置参数


-----------------------------------------------------------------------------------------------------------------------------------


4. max.partition.fetch.bytes
该属性指定了服务器从每个分区返回给消费者的最大字节数,默认为 1MB。

 

5. max.poll.records
单次调用 poll(timeOut) 方法能够返回的记录数量。默认500条消息,如果没有达到500条消息通过 poll()方法中的timeOut参数配置等待超时时间


6. session.timeout.ms
组管理协议中用来检测消费者是否失效的超时时间;消费者在被认为死亡之前可以与服务器断开连接的时间,默认是 10s。

 

7.hearbeat.interval.ms
默认3秒;当使用Kafka分组管理功能时,心跳到消费者组协调器之间的预计时间,心跳用于确保消费者的会话保持活动状态,当有新的消费者加入或离开消费者组的时候方便重平衡。改值应该比  session.timeout.ms 小,通过不高于 1/3 ,也可以调得更低。
连续3次没有心跳,3次心跳的间隔时间(3s*3约等于10s)刚好要达到 session.timeout.ms的超时时间,这个时候消费者组管理器任务consumer离开组了

 

8.max.poll.interval.ms
当通过消费者组管理消费者时,该配置指定拉取消息的消费者最大的空闲时间,如超过这个时间间隔消费者还没发起poll请求,消费者组认为消费者已经离开,触发重平衡。默认  300000ms = 5分钟

 

9.connections.max.idle.ms
指定consumer多久之后关闭闲置的连接,默认540000ms=9分钟,生产者和消费者默认配置一样

 

消费者离开组触发重平衡的条件

  1. consumer连续多次没有心跳,累计达到配置的 session.timeout.ms 超时时间
  2. consumer连续5分钟没有从broker拉取消息,也就是连续5分钟没有调用 poll()方法(poll方法每次调用的时候内部会触发心跳和提交偏移量);如果一直有心跳,但是没有拉去消息会认为该消费者失效
  3. consumer主动退出,消费者订阅的topic对用的partion数量变化
  4. connections.max.idle.ms时间达到了9分钟,消费者和broker之间TCP连接空闲时间达到了阈值,连接关闭,消费者离开
  5. 新的消费者加入该组,触发重平衡

-----------------------------------------------------------------------------------------------------------------------------------


10. auto.offset.reset
该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:

latest (默认值) :在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的最新记录);
earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录。

 

-----------------------------------------------------------------------------------------------------------------------------------

 

11. enable.auto.commit
是否自动提交偏移量,默认值是 true。为了避免出现重复消费和数据丢失,可以把它设置为 false。

 

12.auto.commit.interval.ms
当enable.auto.commit配置为true的时候,表示开启消费者自动偏移量提交,该配置指定自动提交消费者便宜量的间隔时间
默认 5000ms = 5秒

-----------------------------------------------------------------------------------------------------------------------------------


 client.id
客户端 id,服务器用来识别消息的来源。


receive.buffer.bytes & send.buffer.byte
这两个参数分别指定 TCP socket 接收和发送数据包缓冲区的大小,-1 代表使用操作系统的默认值。
这两个参数一般开发者调优的过程中很少使用,
receive.buffer.bytes:默认64KB
send.buffer.byte:默认128KB

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka提供了一个Java客户端库`kafka-clients`,其中包含用于创建和管理消费者的类和方法。下面是一个示例,展示如何使用`kafka-clients`中的消费者类来消费Kafka消息: ```java import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.TopicPartition; import java.time.Duration; import java.util.Collections; import java.util.Properties; public class KafkaConsumerExample { public static void main(String[] args) { String bootstrapServers = "localhost:9092"; String groupId = "my-consumer-group"; String topic = "my-topic"; // 配置消费者属性 Properties properties = new Properties(); properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); properties.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); // 创建消费者实例 KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties); // 订阅主题 consumer.subscribe(Collections.singletonList(topic)); // 或者指定特定的分区进行订阅 // TopicPartition partition = new TopicPartition(topic, 0); // consumer.assign(Collections.singleton(partition)); // 开始消费消息 while (true) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000)); for (ConsumerRecord<String, String> record : records) { // 处理消息 System.out.println("Received message: " + record.value()); } } } } ``` 在上述示例中,首先配置消费者的属性,包括Kafka集群地址、消费者组ID以及消息的反序列化器。然后创建了一个`KafkaConsumer`对象,并使用`subscribe`方法订阅了一个主题(或者可以使用`assign`方法指定特定的分区进行订阅)。 最后,在一个无限循环中调用`poll`方法来获取消息记录,然后遍历处理每条消息。 需要注意的是,消费者需要定期调用`poll`方法以获取新的消息记录。另外,消费者还可以使用`commitSync`或`commitAsync`方法手动提交消费位移,以确保消息被成功处理。 希望以上示例对你理解如何使用`kafka-clients`库中的消费者类来消费Kafka消息有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值