前言

  与生产者客户端一样,消费者端也由最初的scala版本过渡到现在的Java版本。

  正常的消费者逻辑需要以下4个步骤:

  1. KafkaConsumer的客户端参数配置和对应实例;
  2. 订阅主题
  3. 拉取消息并消费
  4. 提交消费者位移
  5. 关闭消费者实例

  消费者客户端比较特殊的一点是加入了消费者组的概念;


KafkaConsumer消费者组

  默认情况下:

  • 一个消费者组中的每个消费者会分配到不同的分区;
  • 一个topic中的消息只会被一个消费者组消费一次;
  • 若一个组中的消费者数量多于partition数量,会出现消费者不会被分配分区,也就消费不到消息(如下c7消费不到数据);

KafkaConsumer使用示例

 1 public class KafkaConsumerAnalysis {
2 public static final String brokerList = "10.26.28.99:9092";
3 public static final String topic = "demo";
4 public static final String groupId = "group.demo";
5 public static final AtomicBoolean isRunning = new AtomicBoolean(true);
6
7 public static Properties initConfig() {
8 Properties props = new Properties();
9 props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
10 props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
11 props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, brokerList);
12 // 消费者组
13 props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
14 // 该客户端的id
15 props.put(ConsumerConfig.CLIENT_ID_CONFIG, "consumer.client.id.demo");
16 return props;
17 }
18
19 public static void main(String[] args) {
20 Properties props = initConfig();
21 KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
22 // 订阅某几个topic
23 consumer.subscribe(Arrays.asList(topic));
24 // 订阅demo的0号分区(订阅方式只能配置一种)
25 // consumer.assign(Arrays.asList(new TopicPartition("demo", 0)));
26 try {
27 while (isRunning.get()) {
28 //1000ms从服务端拉取一次
29 ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
30 for (ConsumerRecord<String, String> record : records) {
31 //do something to process record.
32 }
33 }
34 } catch (Exception e) {
35 log.error("occur exception ", e);
36 } finally {
37 consumer.close();
38 }
39 }
40 }

简单使用示例

 

订阅主题与订阅分区(两者中只能配置一种,否则爆出IllegalStateException异常)

//订阅topic
consumer.subscribe(Arrays.asList(topic));
// 订阅demo的0号分区(订阅方式只能配置一种)
consumer.assign(Arrays.asList(new TopicPartition("demo", 0)));

KafkaConsumer的反序列化类最好还是使用kafka提供的几种方式:如 StringDeserializer 等;

KafkaConsumer消息消费与唯一提交(TODO)

Kafka03--Kafka消费者使用方式的更多相关文章

  1. kafka 消费者offset记录位置和方式

    我们大家都知道,kafka消费者在会保存其消费的进度,也就是offset,存储的位置根据选用的kafka api不同而不同. 首先来说说消费者如果是根据javaapi来消费,也就是[kafka.jav ...

  2. kafka消费者客户端(0.9.0.1API)

    转自:http://orchome.com/203 kafka客户端从kafka集群消费消息(记录).它会透明地处理kafka集群中服务器的故障.它获取集群内数据的分区,也和服务器进行交互,允许消费者 ...

  3. Kafka消费者-从Kafka读取数据

    (1)Customer和Customer Group (1)两种常用的消息模型 队列模型(queuing)和发布-订阅模型(publish-subscribe). 队列的处理方式是一组消费者从服务器读 ...

  4. Kafka集群安装部署、Kafka生产者、Kafka消费者

    Storm上游数据源之Kakfa 目标: 理解Storm消费的数据来源.理解JMS规范.理解Kafka核心组件.掌握Kakfa生产者API.掌握Kafka消费者API.对流式计算的生态环境有深入的了解 ...

  5. Kafka权威指南 读书笔记之(四)Kafka 消费者一一从 Kafka读取数据

    KafkaConsumer概念 消费者和消费者群组 Kafka 消费者从属于消费者群组.一个群组里的消费者订阅的是同一个主题,每个消费者接收主题一部分分区的消息. 往群组里增加消费者是横向伸缩消费能力 ...

  6. Kafka消费者APi

    Kafka客户端从集群中消费消息,并透明地处理kafka集群中出现故障服务器,透明地调节适应集群中变化的数据分区.也和服务器交互,平衡均衡消费者. public class KafkaConsumer ...

  7. JAVA封装消息中间件调用二(kafka消费者篇)

    上一遍我简单介绍了kafka的生成者使用,调用方式比较简单,今天我给大家分享下封装kafka消费者,作为中间件,我们做的就是最大程度的解耦,使业务方接入我们依赖程度降到最低. 第一步,我们先配置一个消 ...

  8. kafka消费者客户端

    Kafka消费者 1.1 消费者与消费者组 消费者与消费者组之间的关系 ​ 每一个消费者都隶属于某一个消费者组,一个消费者组可以包含一个或多个消费者,每一条消息只会被消费者组中的某一个消费者所消费.不 ...

  9. Kafka 学习之路(四)—— Kafka消费者详解

    一.消费者和消费者群组 在Kafka中,消费者通常是消费者群组的一部分,多个消费者群组共同读取同一个主题时,彼此之间互不影响.Kafka之所以要引入消费者群组这个概念是因为Kafka消费者经常会做一些 ...

  10. Kafka 系列(四)—— Kafka 消费者详解

    一.消费者和消费者群组 在 Kafka 中,消费者通常是消费者群组的一部分,多个消费者群组共同读取同一个主题时,彼此之间互不影响.Kafka 之所以要引入消费者群组这个概念是因为 Kafka 消费者经 ...

随机推荐

  1. Python+selenium自动循环发邮件

    Python源代码如下: # coding=utf-8 from selenium import webdriver from time import sleep from random import ...

  2. log4j的替换方案

    去年12月份,随着log4j暴露出高危漏洞,对于 Java 开发人员来说不是一个好消息,对于 Ops 来说更是如此.前者必须使用固定的 Log4J 版本重新打包他们的应用程序,而后者必须重新部署.但对 ...

  3. mysql学习+再复习

    mysql 函数 单行函数 exists 是否存在 字符函数 ​ concat(a,b)拼接两个字符串 ​ ifnull(a+b,0) 如果a+b等于null,则返回0 upper,lower 大小写 ...

  4. 一、Java 特性和运行机制

    目录 Java 特性和优势 Java应用程序的运行机制 JVM.JRE和JDK Java 特性和优势 跨平台/可移植性 核心优势.比如:Java的int型永远是32位,C++(16,32). 安全性 ...

  5. vue--vue-router 组件映射到路由

    前言 地址栏路由的发展经历了后端路由配置阶段.前后端分离阶段.直至单页面富应用阶段.本文来总结一下 vue-router 的相关知识点和用法. 正文 1.什么是 vue-router 路由 路由就是S ...

  6. Golang 包管理机制

    Golang 包管理机制 1. 历史 在go1.11之前, 并没有官方的包管理机制(Godep算个半官方), 主流的包管理机制有: GoVendor Glide Godep 在go1.11之后, 官方 ...

  7. mysql 的奇妙历险

    mysql 的奇妙历险 这几天在练习sql的时候,碰到下面几个题, 如下 他的表字段是这些 create table Student( SId varchar(10), # 学生id Sname va ...

  8. SaaS平台是什么,为什么字节、腾讯等大厂都在抢相关人才

    SaaS平台很多人可能没听说是什么,但是从事TO  B公司的员工来说,SaaS平台应该都有所耳闻.从2016年开始,腾讯开始发力TO B算起,到处在挖TO B公司的骨干人才,而熟悉SaaS平台的人才竞 ...

  9. Linux 中CPU 和 GPU 的行为监控

    由于 Steam(包括 Steam Play,即 Proton)和一些其他的发展,GNU/Linux 正在成为越来越多计算机用户的日常游戏平台的选择.也有相当一部分用户在遇到像视频编辑或图形设计等(K ...

  10. 匿名函数 =匿名方法+ lambda 表达式

    匿名函数的定义和用途 匿名函数是一个"内联"语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托[无需取名字的委托],或传递命名委托(而不是命名委托类型 ...