Kafka Java API

本文档介绍如何使用Kafka的Java API创建Producer和Consumer。在Ubuntu环境中,通过Java项目设置Kafka依赖,启动ZooKeeper和Kafka服务,创建topic,编写Producer和Consumer的代码,实现消息的生产和消费。
摘要由CSDN通过智能技术生成

系统环境

Linux Ubuntu 16.04

jdk-7u75-linux-x64

kafka_2.10-0.8.2.2

zookeeper-3.4.5-cdh5.4.5

eclipse-java-juno-SR2-linux-gtk-x86_64

相关知识

1.Kafka提供了Producer类作为Java producer的api,该类有sync和async两种发送方式。默认是sync方式,即producer的调用类在消息真正发送到队列中去以后才返回。

(1)Kafka提供的java api中的Producer,底层只是维护该topic到每个broker的连接,并不是一个传统意义上的连接池。在使用sync方式时,我们应该自己实现一个连接池,里面包含若干Producer对象,以实现最大化写入效率。

(2)在写入的数据频率不高或要求获得写入结果时,应使用sync方式,否则会因async的等待时间引入额外的延迟。

(3)在写入的数据频率很高时,应使用async方式,以batch的形式写入,获得最大效率。

async方式与sync方式的不同在于,在初始化scala的producer时,会创建一个ProducerSendThread对象。然后,在调用send时,它并不是直接调用eventHandler.handle方法,而是把消息放入一个长度由queue.buffering.max.messages参数定义的队列(默认10000),当队列满足以下两种条件时,会由ProducerSendThread触发eventHandler.handle方法,把队列中的消息作为一个batch发送

①时间超过queue.buffering.max.ms定义的值,默认5000ms

②队列中当前消息个数超过batch.num.messages定义的值,默认200

2.Kafka的Consumer有两种Consumer的高层API、简单API–SimpleConsumer

(1)Consumer的高层API

主要是Consumer和ConsumerConnector,这里的Consumer是ConsumerConnector的静态工厂类

class Consumer {
   

public static kafka.javaapi.consumer.ConsumerConnector

createJavaConsumerConnector(config: ConsumerConfig);

}

具体的消息的消费都是在ConsumerConnector中

创建一个消息处理的流,包含所有的topic,并根据指定的Decoder

public Map>>createMessageStreams(Map topicCountMap, Decoder keyDecoder, Decoder valueDecoder);

创建一个消息处理的流,包含所有的topic,使用默认的Decoder

public Map>> createMessageStreams(Map topicCountMap);

获取指定消息的topic,并根据指定的Decoder

public List>>createMessageStreamsByFilter(TopicFilter topicFilter, int numStreams, Decoder keyDecoder, Decoder valueDecoder);

获取指定消息的topic,使用默认的Decoder

public List> createMessageStreamsByFilter(TopicFilter topicFilter);

提交偏移量到这个消费者连接的topic

public void commitOffsets();

关闭消费者

public void shutdown();

高层的API中比较常用的就是public List> createMessageStreamsByFilter(TopicFilter topicFilter);和public void commitOffsets();

(2)Consumer的简单API–SimpleConsumer

批量获取消息

public FetchResponse fetch(request: kafka.javaapi.FetchRequest);

获取topic的元信息

public kafka.javaapi.TopicMetadataResponse send(request:kafka.javaapi.TopicMetadataRequest);

获取目前可用的偏移量

public kafka.javaapi.OffsetResponse getOffsetsBefore(request: OffsetRequest);

关闭连接

public void close();

对于大部分应用来说,高层API就已经足够使用了,但是若是想做更进一步的控制的话,可以使用简单的API,例如消费者重启的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值