问题描述

配置

Kafka-client 2.x, Spring-Kafka

默认配置

Kafka 三个partition, 使用KafkaListener按group消费。

现象

某天突然发现两个partition出现了Lag堆积,并且一直没有下降。看业务日志有相同消息在不断重复消费。

分析

看日志发现一直在刷,某个partition的任务超过了max.poll.intervals.ms, reassign other partition.

 OffsetAndMetadata{offset=3107, metadata=''}} failed: Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member. This means that the time between subsequent calls to poll() was longer than the configured max.poll.interval.ms, which typically implies that the poll loop is spending too much time message processing. You can address this either by increasing the session timeout or by reducing the maximum size of batches returned in poll() with max.poll.records.

思考应该是消息后续的任务执行时间太长了,导致超过了默认时间,kafka server认为任务失败,不断指定新的partition去做,而之前在规定时间外做完的已经不可以提交offset了。

修复

做异步,使用线程池,将consumer收到的消息打到线程池去做,放进去之后即可立刻提交offset。

hotfix之后lag很快消费掉了,恢复正常。

优化

在consumer中最好加入partition, offset 信息到日志中,有助排查问题。

可以在消费时计算Lag信息,提供异常报警。

使用线程池异步在重启时有风险,可能会丢失数据。最好还是加长max.poll.intervals.ms。

对于关键业务统计耗时,并且设置max.poll.intervals.ms时留有余力。

KafkaListener默认一次消费一条 也可以指定 max.poll.records。

在producer端send时指定key,可以确定消费端唯一性。

Demo

Producer

   @Resource
private KafkaTemplate kafkaTemplate; @SuppressWarnings("unchecked")
public void sendMessage(String topic, final String message) {
LogUtil.info(LogTypeEnum.APPLICATION, "sending message='{}' to topic='{}'", message, topic);
kafkaTemplate.send(topic, message);
}

Consumer

  @KafkaListener(topics = "${topic}", groupId = "groupId",
containerFactory = "kafkaListenerContainerFactory",
autoStartup = "${kafka.consumer.listen.auto.start}",
properties = "max.poll.records=1")
public void businessConsumer(ConsumerRecord<Integer, String> consumerRecord,
@Header(KafkaHeaders.CONSUMER) KafkaConsumer<String, String> consumer) {
LogUtil.info(LogTypeEnum.APPLICATION,
"business log, offset is {}, partition id is {}, received message key is {}, param is {}",
consumerRecord.offset(), consumerRecord.partition(), consumerRecord.key(),
consumerRecord.value());
checkLag(consumer);
 } private void checkLag(KafkaConsumer<String, String> consumer) {
final Set<TopicPartition> topicPartitions = consumer.assignment();
Map<TopicPartition, Long> tailOffsetMap = consumer.endOffsets(topicPartitions);
for (final TopicPartition topicPartition : topicPartitions) {
final long tailOffset = tailOffsetMap.get(topicPartition);
final long currentOffset = consumer.position(topicPartition);
if (tailOffset < currentOffset || (tailOffset - currentOffset) > 30) {
LogUtil.error(LogTypeEnum.APPLICATION,
"kafka consumer lag exception, current offset is {}, max offset is {}",
currentOffset, tailOffset);
}
}
}

Kafka 实践的更多相关文章

  1. php下kafka实践

    Kafka是一种高吞吐的分布式发布订阅消息系统 kafka安装和简单测试 安装kafka 下载 wget https://www-us.apache.org/dist/kafka/2.1.1/kafk ...

  2. Kafka实践1--Producer

    一.Kafka设计原理参考: http://blog.csdn.net/suifeng3051/article/details/48053965?locationNum=2 http://www.cn ...

  3. Kafka实践

    1. kafka发送方法 @Component@Import(KafkaAutoProperties.class)public class KafkaProducer { @Autowired pri ...

  4. Kafka实践、升级和新版本(0.10)特性预研

    本文来自于网易云社区 一.消息总线MQ和Kafka (挡在请求的第一线) 1. 几个应用场景 case a:上游系统往下游系统推送消息,而不关心处理结果: case b:一份新数据生成,需要实时保存到 ...

  5. python操作kafka实践

    1.先看最简单的场景,生产者生产消息,消费者接收消息,下面是生产者的简单代码. ------------------------------------------------------------ ...

  6. Kafka入门 --安装和简单实用

    一.安装Zookeeper 参考: Zookeeper的下载.安装和启动 Zookeeper 集群搭建--单机伪分布式集群 二.下载Kafka 进入http://kafka.apache.org/do ...

  7. 02_Kafka单节点实践

    1.实践场景 开始前的准备条件: 1) 确认各个节点的jdk版本,将jdk升级到和kafka配套的版本(解压既完成安装,修改/etc/profile下的JAVA_HOME,source /etc/pr ...

  8. kafka消费者

    from kafka import KafkaConsumer,TopicPartition import json scrapy_kafka_hosts = ["ip:端口", ...

  9. 【AI】微软人工智能学习笔记(一)

    数据分析平台 01|数据平台概况图示 上面图中所示就是微软人工智能数据平台的相关的技术. 02.1| Cortana Intelligence Suite 从上面图中可以看到, 其中有一个Cortan ...

随机推荐

  1. datatable 写入excel 2007

    1 添加引用: NPOI NPOI.OOXML 2 private static void GenerateFile(DataTable dt) { DataSet ds = new DataSet( ...

  2. IDEA GIT 忽略文件

    1.装插件 .igore 2.新建忽略文件格式 3.编辑忽略后缀文件 可以是文件夹 也可以是 具体文件类型

  3. 【jekins】jenkins构建触发

    一.定时构建的语法 * * * * *(五颗星,中间用空格隔开)第一颗*表示分钟,取值0~59第二颗*表示小时,取值0~23第三颗*表示一个月的第几天,取值1~31第四颗*表示第几月,取值1~12第五 ...

  4. bootstrapTable post提交数据,后台无法接收的问题

    解决方法:contentType:"application/x-www-form-urlencoded; charset=UTF-8",

  5. STM32——CAN协议帧的标准格式和扩展格式与优先级的关系

    一.CAN数据帧的标准格式和扩展格式 我们知道CAN总线上的数据帧都可以配置一个ID号,其可以为11位(标准ID格式)或者29位(扩展ID格式),这也是数据帧的标准格式和扩展格式的区别所在. 这个ID ...

  6. UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)

    # -*- coding:utf-8 -*- china=u'我爱你,中国' #china=china.encode('utf8') file_txt = open("zhongguo.tx ...

  7. [Abp vNext微服务实践] - 服务通讯

    简介 服务通讯是微服务架构中必不可少的功能,服务通讯的效率决定了微服务架构的优略.常用的微服务通讯策略有两种,分别是rpc.http,其中rpc以gRpc框架为代表使用者最多.abp vNext微服务 ...

  8. AtCoder Beginner Contest 132 F Small Products

    Small Products 思路: 整除分块+dp 打表发现,按整除分块后转移方向如下图所示,上面的块的前缀转移到下面的块 代码: #pragma GCC optimize(2) #pragma G ...

  9. 十一届河南省赛-checkpoints(个人解法)-能AC代码

    大致题意: zznuoj,大致题意:从A点出发达到B点去解救人质,再从B点返回到A点,经历第二遍的点只计算一次即可,AB两点不计数!求完成任务最少需要经过的点数. 大致思路:暴力!从起点到终点,和从终 ...

  10. 百度人脸识别java html5

    1.前端thymeleaf+h5 index.html    人脸识别+定位,用的百度sdk <!DOCTYPE html> <html xmlns="http://www ...