KafkaConsumer使用介绍、参数配置

Kafka的Java客户端-设置消费者长轮询poll消息 阅读详情

 

russqiang 2019-04-27 13:43:41  4325  收藏 5
展开
文章目录
前言
Consumer概要
Consumer程序开发
Consumer常用参数说明
消息解序列化
多线程处理
总结
前言
KafkaProducer作为生产者发送消息到Kafka,那么自然也就需要从kafka读取消息,这就是KafkaConsumer,通过和Producer使用相同的topic约定来消费指定数据,使用kakfa就是缓冲消息,消费端才是处理消息的中心,数据处理的业务逻辑都在消费者,下面就来看Consumer是如何设计以及消费数据的

Consumer概要
首先我们需要明确consumer中的几个关键术语
消费者(consumer):从kafka中拉取数据并进行处理
消费者组(consumer group):一个消费者组由一个或者多个consumer实例组成
位移(offset):记录当前分区消费数据的位置
位移提交(offset commit):将消费完成的消息的最大offset提交确认
位移topic(_consumer_offset):保存消费位移的topic
消费过程图解

Consumer从Kafka Broker上拉取(poll)数据,然后再提交位移信息(Commit Offset)

Consumer程序开发
构建Consumer
Consumer有三种消费交付语义
1、至少一次:消息不会丢失,但可能被重复处理(实现简单)
2、最多一次:消息可能丢失可能会被处理,但最多只会被处理一次(实现简单)
3、精确一次:消息被处理并且只会被处理一次(比较难实现)

提交位移方式

自动提交 :实现最简单,只需要在参数 enable.auto.commit 设置为 true,既可能重复消费,也可能丢失数据
package com.huawei.kafka.consumer;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;

import java.time.Duration;
import java.util.Arrays;
import java.util.Properties;

/**
 * @author: xuqiangnj@163.com
 * @date: 2019/4/26 13:08
 * @description:
 */
public class AutoCommitConsumer {

    private static Properties props = new Properties();


    static {
        props.put("bootstrap.servers", "192.168.142.139:9092");
        props.put("group.id", "Test");
        props.put("enable.auto.commit", true);//设置是否为自动提交
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    }

    final KafkaConsumer<String, String> consumer;

    private volatile boolean isRunning = true;

    public AutoCommitConsumer(String topicName) {
        consumer = new KafkaConsumer<String, String>(props);
        consumer.subscribe(Arrays.asList(topicName));
    }


    public void printReceiveMsg() {
        try {
            while (isRunning) {
                ConsumerRecords<String, String> consumerRecords = consumer.poll(Duration.ofSeconds(1));
                if (!consumerRecords.isEmpty()) {
                    for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
                        System.out.println("TopicName: " + consumerRecord.topic() + " Partition:" +
                                consumerRecord.partition() + " Offset:" + consumerRecord.offset() + "" +
                                " Msg:" + consumerRecord.value());
                        //进行逻辑处理
                    }

                }
            }
        }catch (Exception e){
            //处理异常
        }
        finally {
            close();
        }

    }

    public void close() {
        isRunning = false;
        if (consumer != null) {
            consumer.close();
        }
    }
}

手动提交
手动提交又分为两种提交方式(同步提交和异步提交)
(1)同步提交
package com.huawei.kafka.consumer;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;

import java.time.Duration;
import java.util.Arrays;
import java.util.Properties;

/**
 * @author: xuqiangnj@163.com
 * @date: 2019/4/27 13:13
 * @description:
 */
public class SyncCommitConsumer {

    private static Properties props = new Properties();


    static {
        props.put("bootstrap.servers", "192.168.142.139:9092");
        props.put("group.id", "Test");
        props.put("enable.auto.commit", false);//注意这里设置为手动提交方式
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    }

    final KafkaConsumer<String, String> consumer;

    private volatile boolean isRunning = true;

    public SyncCommitConsumer(String topicName) {
        consumer = new KafkaConsumer<String, String>(props);
        consumer.subscribe(Arrays.asList(topicName));
    }


    public void printReceiveMsg() {
        try {
            while (isRunning) {
                ConsumerRecords<String, String> consumerRecords = consumer.poll(Duration.ofSeconds(1));
                if (!consumerRecords.isEmpty()) {
                    for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
                        System.out.println("TopicName: " + consumerRecord.topic() + " Partition:" +
                                consumerRecord.partition() + " Offset:" + consumerRecord.offset() + "" +
                                " Msg:" + consumerRecord.value());
                        //进行逻辑处理
                    }
                    consumer.commitSync();//同步提交
                }
            }
        }catch (Exception e){
            //处理异常
        }
        finally {
            consumer.commitSync();
            close();
        }

    }

    public void close() {
        isRunning = false;
        if (consumer != null) {
            consumer.close();
        }
    }
}

(2)异步提交

package com.huawei.kafka.consumer;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;

import java.time.Duration;
import java.util.Arrays;
import java.util.Properties;

/**
 * @author: xuqiangnj@163.com
 * @date: 2019/4/27 13:16
 * @description:
 */
public class AsyncCommitConsumer {

    private static Properties props = new Properties();


    static {
        props.put("bootstrap.servers", "192.168.142.139:9092");
        props.put("group.id", "Test");
        props.put("enable.auto.commit", false);//注意这里设置为手动提交方式
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    }

    final KafkaConsumer<String, String> consumer;

    private volatile boolean isRunning = true;

    public AsyncCommitConsumer(String topicName) {
        consumer = new KafkaConsumer<String, String>(props);
        consumer.subscribe(Arrays.asList(topicName));
    }


    public void printReceiveMsg() {
        try {
            while (isRunning) {
                ConsumerRecords<String, String> consumerRecords = consumer.poll(Duration.ofSeconds(1));
                if (!consumerRecords.isEmpty()) {
                    for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
                        System.out.println("TopicName: " + consumerRecord.topic() + " Partition:" +
                                consumerRecord.partition() + " Offset:" + consumerRecord.offset() + "" +
                                " Msg:" + consumerRecord.value());
                        //进行逻辑处理
                    }
                    consumer.commitAsync();//异步提交
                }
            }
        }catch (Exception e){
            //处理异常
        }
        finally {
            consumer.commitAsync();
            close();
        }

    }

    public void close() {
        isRunning = false;
        if (consumer != null) {
            consumer.close();
        }
    }
}

Consumer常用参数说明
bootstrap.servers:Kafka群集信息列表,用于连接kafka集群,如果集群中机器数很多,只需要指定部分的机器主机的信息即可,不管指定多少台
group. id:标识一个consumer组的名称
key.deserializer:消息key反序列化器
value.deserializer:消息value反序列化器
session .timeout.ms:消费者和群组协调器的最大心跳时间,如果超过该时间则认为该消费者已经死亡或者故障,需要提出消费者组
max.poll.interval .ms:一次poll间隔最大时间
auto.offset.reset:当消费者读取偏移量无效的情况下,需要重置消费起始位置,默认为latest(从消费者启动后生成的记录),另外一个选项值是 earliest,将从有效的最小位移位置开始消费
enable.auto.commit:consumer提交方式设置
fetch.max.bytes:consumer端一次拉取数据的最大字节数
max.poll.records:consumer端一次拉取数据的最大条数
connections.max.idle .ms:consumer默认和kafka broker建立长连接,当连接空闲时间超过该参数设置的值,那么将连接断开,当使用时,在进行重新连接

消息解序列化
consumer消息解序列化与producer消息序列化是一个操作对,在producer使用什么方式序列化,consumer端就要使用对应的解序列化方式进行消息反解

默认解序列化

自定义解序列化:可以通过org.apache.kafka.common.serialization.Serializer来自定义序列化器
多线程处理
consumer并不是线程安全的类,如果在多线程下使用将抛出异常,可以在单线程中使用consumer,具体的消费逻辑委托到多线程中进行执行

总结
该文档主要介绍了consumer的简单使用以及参数介绍,kafka consumer具有很高的吞吐量,不适合消费耗时很长的逻辑,会严重影响消费性能。
————————————————
版权声明:本文为优快云博主「russqiang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_18581221/article/details/89409703

【kafka原理】聊聊 Kafka Consumer 那点事 今天我们主要来聊聊 Kafka Consumer 即消费者的内部底层原理设计思想。 1、Consumer之总体概述 在 Kafka 中, 我们把消费消息的一方称为 Consumer 即 消费者, 它是 Kafka 的核心组件之一。它的主要功能是将 Producer 生产的消息进行消费处理,完成消费任务。那么这些 Producer 产生的消息是怎么被 Consumer 消费的呢?又是基于何种消费方式进行消费,分区分配策略都有哪些,消费者组以及重平衡机制是如何处理的,偏移量如何提交和存储,消费进度. 阅读详情

相关推荐

【大数据学习 | kafka】简述kafka的消费者consumer

首先我们要知道kafka这个消息队列主要的功能就是起到缓冲的作用,比如flume采集数据然后交给spark或者flink进行计算分析,但是flume采用的就是消息的push方式,这个方式不能够保证推送的数据消费者端一定会消费完毕,会出现数据的反压问题,这个问题很难解决,所以才出现了消息队列kafka,它可以起到一个缓冲的作用,一个消费者组中的消费者和分区是一一对应的关系,一个分区应该对应一个消费者,但是如果消费者多了,那么有的消费者就没有分区消费,如果消费者少了那么会出现一个消费者消费多个分区的情况。

2301_80912559的博客 1522

聊聊Kafka(三)Kafka消费者与消费组

Kafka消费者与消费组简介消费者概念入门消费者、消费组心跳机制消息接收必要参数配置订阅反序列化位移提交消费者位移管理再均衡避免重平衡消费者拦截器消费组管理什么是消费者组消费者位移(consumer position)位移管理(offset management)再谈再均衡再均衡过程总结 简介 上节开了个头,探讨了kafka中的生产者的流程和思想,本节将继续研究消费者特性。 消费者 概念入门 消费者、消费组 消费者从订阅的主题消费消息,消费消息的偏移量保存在Kafka的名字是 __consumer_offs

1万+

kafka原理和实践(四)spring-kafka消费者源码

目录一、kafkaConsumer消费者模型一、kafkaConsumer构造二、消费者容器启动流程 正文系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践(四)spring-kafka消费者源码 kafka原理和实践(五)spring-kafka配置...

博客园搬家测试账号 3923

kafka Java客户端之consumer 流量控制 以及 Rebalance解析

Consumer 流量控制 为了避免Kafka中的流量剧增导致过大的流量打到Consumer端将Consumer给压垮的情况,我们就需要针对Consumer进行限流。例如,当处理的数据量达到某个阈值时暂停消费,低于阈值时则恢复消费,这就可以让Consumer保持一定的速率去消费数据,从而避免流量剧增时将Consumer给压垮。大体思路如下: 在poll到数据之后,先去令牌桶中拿取令牌 如果获取到令牌,则继续业务处理 如果获取不到令牌,则调用pause方法暂停Consumer,等待令牌 当令牌桶中的令牌足够,

小灰狼与大白兔的博客 1万+

【大数据Kafka系列】Consumer

Consumer 消费组 每个消费者对应一个消费组,当消息发布到主题后,只会被投递给订阅它的每个消费组中的一个消费者,topic 中的每一个分区只能被一个消费组中的消费者所消费 消息投递模式 点对点 基于队列,消息生产者发送消息到队列,消费者从队列接收消息 消息会被均匀的投递给同一消费组下的所有消费者(所有消费者属于同一消费组),每条消息被一个消费者处理 发布 / 订阅 发布者将消息发送到某个 topic,消费者从 topic 订阅,发布于订阅互相保持独立不需要进行接触,在消息一对多广播时采用

weixin_54707168的博客 294

【强化学习】11 —— Double DQN算法与Dueling DQN算法

可以看到由于数据点的分布,使得拟合出的价值函数无法与真实的价值函数吻合,甚至在部分区域产生了明显的偏差。Dueling DQN 是 DQN 另一种的改进算法,它在传统 DQN 的基础上只进行了微小的改动,但却能大幅提升 DQN 的表现。这样,即使其中一套神经网络的某个动作存在比较严重的过高估计问题,由于另一套神经网络的存在,这个动作最终使用的值不会存在很大的过高估计问题。.在同一个状态下,所有动作的优势值之和为 0,因为所有动作的动作价值的期望就是这个状态的状态价值。环境的状态包括倒立摆角度的正弦值。

sinat_52032317的博客 1万+

深入解析KafkaConsumer:从拉取模型到调优实战

在分布式消息系统中,消费者模型是保障数据可靠传递与高效处理的核心组件。其底层通常基于拉取(Pull)或推送(Push)机制实现,其中拉取模型将消费速率控制权交由消费者,能更好地适配异构处理能力并实现自然背压。理解这一原理对构建高吞吐、可扩展的数据管道至关重要。在技术实现上,双线程架构(用户线程与心跳线程)与消费者组协调机制共同保障了服务的高可用性与负载均衡。掌握这些基础概念后,便能深入KafkaConsumer这一具体实现。本文将聚焦其核心工作流程,包括消息拉取、反序列化、偏移量管理等环节,并针对消费积压、

weixin_42533751的博客 268

aruco_ros实战:从USB摄像头到Marker位姿检测全流程解析

本文详细解析了使用aruco_ros从USB摄像头实现ArUco Marker检测与位姿估计的全流程。内容涵盖环境搭建、核心launch文件配置、可视化调试、位姿数据解析以及深度优化技巧,帮助开发者快速掌握ROS下的视觉定位关键技术,并集成到机器人项目中。

weixin_29230805的博客 265

深入理解Kafka核心设计与实践原理_03

消费者并非逻辑上的概念,它是实际的应用实例,它可以是一个线程,也可以是一个进程。Kafka 同时支持两种消息投递模式,而这正是得益于消费者与消费组模型的契合:· 如果所有的消费者都隶属于同一个消费组,那么所有的消息都会被均衡地投递给每一个消费者,即每条消息只会被一个消费者处理,这就相当于点对点模式的应用。如果消费者采用的是正则表达式的方式(subscribe(Pattern))订阅,在之后的过程中,如果有人又创建了新的主题,并且主题的名字与正则表达式相匹配,那么这个消费者就可以消费到新添加的主题中的消息。

北笙LBJ的博客 1282

数字IC后端实现 | Innovus各个阶段常用命令汇总

数字IC后端设计实现之Innovus常用命令汇总

weixin_37584728的博客 7334

工业4.0 底层逻辑

工业4.0 的概念已经被滥用了,它与物联网,工业物联网等概念一样,几乎什么都往里面装。演变成了一句口号和愿景。许多人并不清楚工业4.0的底层逻辑到底是什么?如何遵循工业4.0 的思想构建新一代智能制造系统?并没用清晰地展示工业4.0的技术路线图。

姚家湾博客 1996

Consumer源码解读

Consumer源码解读

爱笑的boy的博客 1068

【SoloPi】SoloPi使用2-功能使用,录制回放

Soloπ是什么 Soloπ是一个无线化、非侵入式的Android自动化工具,公测版拥有录制回放、性能测试、一机多控三项主要功能,能为测试开发人员节省宝贵时间。 录制回放功能 Soloπ拥有录制操作的能力,用户只需要通过Soloπ执行用例步骤,Soloπ就能够将用户的操作记录下来,并且支持在各个设备上进行回放,这一切都能够在手机上独立完成。 ...

q_Catherine的博客 5829

【Kafka】开发实战和Springboot集成kafka

kafka开发实战和Springboot集成kafka

qq_43745578的博客 1754

CTP开发实战:如何高效处理预埋单与委托单的完整流程(附代码示例)

本文深入探讨了CTP开发中预埋单与委托单的完整处理流程,从订单生命周期理解、核心代码实现到异步事件处理与系统健壮性构建。通过详细的代码示例和状态机分析,为开发者提供了构建高可靠订单处理系统的实战指南,重点解决了状态同步、异常恢复等关键工程挑战。

weixin_29234239的博客 118

springboot+vue项目基础开发(12)vue项目的搭建

在src目录下新建 api,utils,views文件夹。删除componets目录下自动生成的所有文件。在utils文件夹下创建request.js。启动项目,记得是要在管理员下启动。

m0_58498702的博客 154

kafkaAPI

使用方法见官网API介绍: https://kafka.apache.org/22/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html 转载于:https://www.cnblogs.com/f-society/p/10730475.html

weixin_30883311的博客 84

知识图谱-构建:知识图谱构建流程【本体构建、知识抽取(实体抽取、 关系抽取、属性抽取)、知识表示、知识融合、知识存储】

旅游领域的类是用来描述旅游的抽象化概念术语,是对众多旅游个体共性的概念化描述。术语是划分类的基础,根据构建领域本体的目标和具体需要,可以确定哪些术语能作为领域本体的类。在以上抽取的众多旅游领域术语中,有些是能直接作为类的,如旅游、人物、交通方式、景区等等,而有些则不能作为类,如票价、景区门票、联系方式等等,它们只是属性。“旅游”很明显是最顶层的类,是父类。然后,要确定旅游的子类,根据大众标签里体现的共性和《中国分类主题词表》确定了旅游领域的11个核心概念,即本体层次结构图数据属性(固有属性)...

u013250861的博客 4万+

kafka多个消费者消费一个topic_Kafka 服务中消费者创建详解

与生产者对应的是消费者,应用程序可以通过 KafkaConsumer 来订阅主题,并从订阅的主题拉取消息。不过在使用 KafkaConsumer 之前需要了解消费者与消费组的概念,否则无法理解如何使用 KafkaConsumer。一、消费者与消费组消费者(Consumer)负责订阅主题(Topic),并从订阅的主题上拉取消息。与其他消息中间间不同的是,再Kafka消费者观念里还有一层消费组(Con...

weixin_39560064的博客 3588

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Kafka Consumer

Kafka Consumer消费以组的方式划分,Topic中的每一个分区只会分给同一个组中的其中一个实例。这是基于队列模式,如果想基于发布订阅模式,那订阅同一个Topic的实例需要指定不同的组名。 必需参数 bootstrap.servers Kafka服务器 group.id Consumer Group的名字,唯一标识一个consumer group key.deserializer Key的...

Code 257

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

kafka学习笔记整理1

比较不错的一篇入门例子,注释很详细很详细感谢博主:https://blog.csdn.net/cjf_wei/article/details/78075263KafkaProducer(org.apache.kafka.clients.producer.KafkaProducer)是一个用于向kafka集群发送数据的Java客户端。该Java客户端是线程安全的,多个线程可以共享同一个produce...

nieji3057的博客 611

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Kafka Consumer源码讲解

Kafka Consumer源码讲解

an13654067079的博客 886

kafka发送者与消费者参数详解

20220825~kafka发送者与消费者参数详解

ClearLove6的博客 1039

深入浅出分析kafka客户端程序设计 ----- 消费者篇----万字总结

再平衡回调函数负责对基于RdKafka::ERR_ASSIGN_PARTITIONS和RdKafka::ERR_REVOKE_PARTITIONS事件更新rdkafka的分区分配,也能处理任意前两者错误除外其它再平衡失败错误。没有再平衡回调函数,rdkafka也能自动完成再平衡过程,但注册一个再平衡回调函数可以使应用程序在执行其它操作时拥有更大的灵活性,例如从指定位置获取位移或手动提交位移。事件的触发是由 Kafka broker 和 Kafka consumer 之间的交互而引起的。

txh1873749380的博客 1418

万字详解Kafka3.0源码-消费者的初始化

掌握KafkaConsumer消费者都包含了哪些核心组件以及他们的职责依赖SubscriptionState管 理订阅的Topic 集合和Partition 的消费状态通过ConsumerCoordinator 与服务端的 GroupCoordinator 交互,完成Rebalance 操作并请求最近提交的offsetFetcher 负责从 Kafka中拉取消息并进行解析,同时参与position 的重置操作,提供获取指定Topic的集群元数据的操作。

wdj_yyds的博客 439
上一篇: Flink| 状态一致性
下一篇: 解决KafKa数据存储与顺序一致性保证
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值