Kafka包含四种核心的API:

  1、Producer API支持应用将数据流发送到Kafka集群的主题

  2、Consumer API支持应用从Kafka集群的主题中读取数据流

  3、Streams API支持数据流从输入主题转化到输出主题

  4、Connect API支持实现持续地从一些源系统或应用划入Kafka或者从Kafka推入一些源系统或应用的接口。

  我们这里主要讨论Producer API和Consumer API的使用,由于最新版的kafka java api中使用了一些jdk8的新特性,所以要求我们在本机上jdk版本要在8以上。

  pom.xml如下:

<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>

Producer API

  Producer用来向Kafka集群中发布消息记录的Kafka客户端。Producer是线程安全的,并且通常来讲,在多个线程间共享一个producer要比每个线程都创建一个producer速度更快。producer代码示例:

package com.example.demo;

import java.util.Properties;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord; public class MyProducer { public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "192.168.1.124:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("batch.size", 16384);
props.put("linger.ms", 1);
props.put("partitioner.class", "com.example.demo.MyPartitioner");
props.put("buffer.memory", 33554432);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props);
for (int i = 0; i < 100; i++)
producer.send(new ProducerRecord<String, String>("powerTopic", Integer.toString(i), Integer.toString(i))); producer.close(); }
}

  properties里用到的配置参数在kafka的源码里org.apache.kafka.clients.producer.ProducerConfig类中,这里说一下常用的:

  bootstrap.servers 配置项处需要填写我们要发送到的Kafka集群地址。

  ack 配置项用来控制producer要求leader确认多少消息后返回调用成功。当值为0时producer不需要等待任何确认消息。当值为1时只需要等待leader确认。当值为-1或all时需要全部ISR集合返回确认才可以返回成功。

  retries 当 retries > 0 时,如果发送失败,会自动尝试重新发送数据。发送次数为retries设置的值。

  buffer.memory、batch.size、linger.ms三个参数用来控制缓冲区大小和延迟发送时间,具体含义可以参考官方文档的配置。

  key.serializer 和 value.serializer 指定使用什么序列化方式将用户提供的key和value进行序列化。

Consumer API

  Consumer的API分为High-level API和Low-level API。前者提供了高度抽象的API,使用起来简单、方便。因此本文将主要讲述High-level API。Low-level API提供了更强的控制能力,但使用起来较为繁琐。自动提交consumer代码示例:

package com.example.demo;

import java.util.Arrays;
import java.util.Properties; import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer; public class MyAutoCommitConsumer { public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "192.168.1.124:9092");
props.put("group.id", "test");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
@SuppressWarnings("resource")
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("powerTopic"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records)
System.out.printf("partition = %d,offset = %d, key = %s, value = %s%n",record.partition(), record.offset(), record.key(), record.value());
}
}
}

  properties里用到的配置参数在kafka的源码里org.apache.kafka.clients.consumer.ConsumerConfig类中,本例中用到参数解释如下:

  bootstrap.servers配置项指定了consumer需要连接的服务器集群。多台服务器用“,”分隔

  enable.auto.commit配置项指定了提交offset的方式为自动提交,auto.commit.interval.ms配置项配置了每次自动提交的时间间隔。

  group.id 即消费者组标签,本例中消费者组的名称为test。

  key.deserializer和value.deserializer指用什么方式进行反序列化。

  自动提交offset的方式非常简单,但多数情况下,我们不会使用自动提交的方式。因为不论从Kafka集群中拉取的数据是否被处理成功,offset都会被更新,也就是如果处理过程中出现错误可能会出现数据丢失的情况。所以多数情况下我们会选择手动提交方式,我们看到 enable.auto.commit 配置项被设置为false,代表手动提交。示例代码如下:

package com.example.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties; import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer; public class MyManualCommitConsumer { public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "192.168.1.124: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");
@SuppressWarnings("resource")
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("myFirstTopic"));
final int minBatchSize = 200;
List<ConsumerRecord<String, String>> list = new ArrayList<>();
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records) {
System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
list.add(record);
}
if (list.size() >= minBatchSize) {
System.out.println("list中的缓存数据大于minBatchSize时批量进行处理");
consumer.commitSync();
System.out.println("全部数据处理成功后手动提交");
list.clear();
}
} } }

  另外需注意,consumer是有状态的,所以不是线程安全的,所以在进行多线程操作时需要在每个线程实例化一个consumer。

kafka java API的使用的更多相关文章

  1. Kafka笔记整理(二):Kafka Java API使用

    下面的测试代码使用的都是下面的topic: $ kafka-topics.sh --describe hadoop --zookeeper uplooking01:,uplooking02:,uplo ...

  2. Kafka Java API操作topic

    Kafka官方提供了两个脚本来管理topic,包括topic的增删改查.其中kafka-topics.sh负责topic的创建与删除:kafka-configs.sh脚本负责topic的修改和查询,但 ...

  3. Kafka Java API获取非compacted topic总消息数

    目前Kafka并没有提供直接的工具来帮助我们获取某个topic的当前总消息数,需要我们自行写程序来实现.下列代码可以实现这一功能,特此记录一下: /** * 获取某个topic的当前消息数 * Jav ...

  4. kafka java api消费者

    import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Properties; imp ...

  5. kafka java api生产者

    import java.util.HashMap; import java.util.List;import java.util.Map;import java.util.Properties; im ...

  6. kafka java使用

    首先添加maven依赖 Kafka <dependency> <groupId>org.apache.kafka</groupId> <artifactId& ...

  7. 使用Java API创建(create),查看(describe),列举(list),删除(delete)Kafka主题(Topic)

    使用Kafka的同学都知道,我们每次创建Kafka主题(Topic)的时候可以指定分区数和副本数等信息,如果将这些属性配置到server.properties文件中,以后调用Java API生成的主题 ...

  8. java api如何获取kafka所有Topic列表,并放置为一个list

    kafka内部所有的实现都是通过TopicCommand的main方法,通过java代码调用API,TopicCommand.main(options)的方式只能打印到控制台,不能转换到一个list. ...

  9. Java API获取topic所占磁盘空间(Kafka 1.0.0)

    很多用户都有这样的需求:实时监控某个topic各分区在broker上所占的磁盘空间大小总和.Kafka并没有提供直接的脚本工具用于统计这些数据. 如果依然要实现这个需求,一种方法是通过监控JMX指标得 ...

随机推荐

  1. .NET基础 (06)面向对象的实现

    面向对象的实现1 C#中类可以有多个父类.可以实现多个接口吗2 简述C#中重写.重载和隐藏的概念3 为什么在构造方法中调用虚方法会导致问题4 在C#中如何声明一个类不能被继承 面向对象的实现 1 C# ...

  2. easyui datagrid单元格实现溢出文本显示省略号的效果。

    Css .datagrid-btable .datagrid-cell{padding:6px 4px;overflow: hidden;text-overflow:ellipsis;white-sp ...

  3. Mac下默认JDK路径

    2.JDK8以及JDK7安装的默认路径为:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk

  4. 设计模式12---享元模式(Flyweight Pattern)

    享元模式 定义:共享元对象,运用共享技术有效地支持大量细粒度对象的复用.如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用创建新的对象. 享元模式是为数不多的.只为提 ...

  5. linux help

    linux提供了极为详细的帮助工具及文档,一定要养成查找帮助文档的习惯,可以大大减少需要记住的东西,并提高效率. 几乎所有命令都可以使用-h或--help参数获取使用方法,参数信息等. man man ...

  6. delphi中sql实现while循环插入,不存在则插入

    ' declare @i int; '+ ' set @i=0; '+ ' while @i<4 '+ ' begin '+ ' insert into NBCommission(Type,It ...

  7. user profile信息同步问题

    经过下午的远程会议, 该问题已经解决. 以下为小结以及针对AD同步账号的权限配置的要求: 纠正: 1. 将现有的所有User Profile Service Application 删除 2. 执行I ...

  8. Ray tracing performance benchmark

    accel. avg size 3.14accel. avg depth 16.15accel. max size 8accel. max depth 20accel. GPIT 3.00 MB tr ...

  9. 279. 完全平方数 leetcode JAVA

    题目: 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: 3 解释: ...

  10. POJ 1330 Nearest Common Ancestors(lca)

    POJ 1330 Nearest Common Ancestors A rooted tree is a well-known data structure in computer science a ...