Simple Consumer Scala API

Simple Consumer Scala API

官方example:
https://cwiki.apache.org/confluence/display/KAFKA/0.8.0+SimpleConsumer+Example

该模式下

  • 可以指定offset消费,同时也需要对offset进行管理
  • 在建立消费连接之前要确认所消费分区的leader broker
  • 要手动处理leader change

查询Topic元数据,找到leader

查询topic、分区的leader、replicas、isr等信息同样要建立SimpleConsumer连接,发送TopicMetadataRequest请求,获取响应TopicMetadataResponse中的List

offset查询

offset查询同样通过SimpleConsumer连接,构造kafka.javaapi.OffsetRequest请求,获取OffsetResponse

  • kafka.api.OffsetRequest.EarliestTime() 分区最小偏置
  • kafka.api.OffsetRequest.LatestTime() 分区最大偏置

对应OffsetRequest.scala两个常量val LatestTime = -1Lval EarliestTime = -2L

TopicAndPartition topicAndPartition = new TopicAndPartition(topic, partition);
Map<TopicAndPartition, PartitionOffsetRequestInfo> requestInfo = new HashMap<TopicAndPartition, PartitionOffsetRequestInfo>();
//请求信息K:分区 V:分区offset请求,whichTime可以是kafka.api.OffsetRequest.EarliestTime()、kafka.api.OffsetRequest.LatestTime()或unix时间戳
requestInfo.put(topicAndPartition, new PartitionOffsetRequestInfo(whichTime, 1));
//构造请求
kafka.javaapi.OffsetRequest request = new kafka.javaapi.OffsetRequest(requestInfo, kafka.api.OffsetRequest.CurrentVersion(), clientName);
OffsetResponse response = consumer.getOffsetsBefore(request);
return offsets[0];

PartitionOffsetRequestInfo的第二个参数是offset返回的个数,第一个就是请求的offset,其他值与日志segment配置大小有关,应该是会包含个segment段的关键offset,可以参考这个bolg:http://cfchou.github.io/blog/2015/04/23/a-closer-look-at-kafka-offsetrequest/

消费数据

通过Topic元数据查询找到leader后,通过该leader查询offset,再构造FetchRequest,获取FetchResponse提取数据

//构造请求,fetchSize为一次fetch的byte大小,这个值如若小于一个message大小,会返回空消息
FetchRequest req = new FetchRequestBuilder()
.clientId(clientName)
.addFetch(topic, partition, offset, fetchSize)
.build();

//获取响应
FetchResponse fetchResponse = simpleConsumer.fetch(req);
if(fetchResponse.hasError())
{
    System.out.println("fetchResponse has error, error code: " + fetchResponse.errorCode(topic, partition));
    //可能是offset错误,或者kafka宕机,发生了leader change,这里需要重新获取leader
}
//获取指定partition消息,因为FetchRequest里可以add多个addFetch
for (MessageAndOffset messageAndOffset : fetchResponse.messageSet(topic, partition))    
{
    //每条消息的payload
    ByteBuffer payload = messageAndOffset.message().payload();
    //下一个offset
    nextOffset = messageAndOffset.nextOffset();
}

leader change

kafka宕机实际上是通过zk进行检测的,当zk上broker临时节点不在时应会告知kafka集群重新进行leader选举,应用中需要进行一段时间的等待,可参考例子中的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值