Kafka旧版高级消费者API强依赖ZK,目前高版本kafka已将offset移交内部主题,若高版本可选用新版API。
实现低级API变成实现的主要步骤:
-
获取指定主题相应分区对应的元数据信息
-
找出指定分区的Leader副本节点,创建SimpleConsumer,建立与Leader副本的连接
-
构造消费请求
-
获取数据并处理
-
对偏移量进行处理
-
当代理发生变化时进行相应处理,保证消息被正常消费
1.创建一个类并定义部分常量:
public class LowConsumerAPI {
/**
* broker list
*/
private static final String BROKER_LIST = "192.168.1.100:9092,192.168.1.100:9093,192.168.1.100:9094";
/**
* 连接超时时间:1min
*/
private static final int TIME_OUT = 60 * 1000;
/**
* 读取消息缓存区大小:1M
*/
private static final int BUFFER_SIZE = 1024 * 1024;
/**
* 每次获取消息的条数
*/
private static final int FETCH_SIZE = 100000;
/**
* 发生错误时重试的次数
*///
private static final int RETRIES_TIME = 3;
/**
* 允许发生错误的最大次数
*/
private static final int MAX_ERROR_NUM = 3;
2.定义获取主题相应分区元数据信息的方法:
/**
* 获取指定主题指定分区的元数据
*/
private PartitionMetadata fetchPartitionMetadata(List<String> brokerList, String topic, int partitionId) {
SimpleConsumer consumer = null;
TopicMetadataRequest metadataRequest = null;
TopicMetadataResponse metadataResponse = null;
List<TopicMetadata> topicMetadatas = null;
try{
/*
* 循环是因为不确定传入的partition的leader节点是哪个
*/
for(String host : brokerList) {
// 1. 构建一个消费者SimpleConsumer,它是获取元数据的执行者
String[] hostsAndPorts = host.split(":");
// 最后一个参数是 clientId
consumer = new SimpleConsumer(hostsAndPorts[0], Integer.parseInt(hostsAndPorts[1]),
TIME_OUT, BUFFER_SIZE, topic + "-" + "0" + "-" + "client");
// 2. 构造请求主题元数据信息的请求 TopicMetadateRequest
metadataRequest = new TopicMetadataRequest(Arrays.asList(topic));
// 3. 通过send()正式与代理通信,发送TopicMetadateRequest请求获取元数据
try {