前言

  与生产者客户端一样,消费者端也由最初的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. JMM之synchronized关键字

    对于通讯,涉及两个关键字volatile和synchronized: Java支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象及其成员变量分配的内存实在共享 ...

  2. mongodb4.x 集群搭建

    下载包 官网选择合适的操作系统版本下载tgz包 https://www.mongodb.com/download-center/community 部署结构 集群结构 典型的三分片Mongo集群如下图 ...

  3. transient关键字有何作用

    使用对象流保存对象时,将对象的全部信息都保存了,但是有些信息是不希望保存,如密码,该如何避免该信息的保存? 使用transient关键字修饰的属性,在保存对象时,该属性并不会被保存. transien ...

  4. Centos 6 yum源

    wget -O /etc/yum.repos.d/CentOS-Base.repo http://file.kangle.odata.cc/repo/Centos-6.repo wget -O /et ...

  5. PostgreSQL VACUUM 之深入浅出 (四)

    VACUUM 参数优化 上面已经介绍过了以下设置表级 AUTOVACUUM 相关参数和 autovacuum_max_workers: ALTER TABLE pgbench_accounts SET ...

  6. [题解]Mail.Ru Cup 2018 Round 1 - A. Elevator or Stairs?

    [题目] A. Elevator or Stairs? [描述] Masha要从第x层楼去第y层楼找Egor,可以选择爬楼梯或者坐直升电梯.已知爬楼梯每层需要时间t1:坐直升电梯每层需要时间t2,直升 ...

  7. Renix导入报文--如何将PCAP报文里的内容转换为流量

    要从PCAP文件生成流,请执行以下步骤: 1.导入PCAP到流 在导航树,右键点击流模板,然后从右键菜单选择"导入PACP到流",系统将弹出"导入PCAP到流" ...

  8. 实现按钮跳转&下划线等

    按钮点击跳转页面:(在java文件里写) 1 public class MainActivity extends AppCompatActivity { 2 3 private Button mbtn ...

  9. Qt:QListWidgetItem

    0.说明 一个QListWidgetItem是QListWidget中的一项(一行). 每个Item都可以持有多部分的信息,并将它们在适当时候展示出来. 在构造一个Item时指明它所在的List Wi ...

  10. Pycharm:设置完Anaconda后报错TypeError: an integer is required (got type bytes)

    背景:安装了最新版本的Anaconda3.9后,在Pycharm中设置Python Interpreter为这个最新版本Anaconda文件下的python.exe后,控制台无法启动并报错TypeEr ...