Simple Consumer Scala API
来源:互联网 发布:如何在淘宝上找同款 编辑:程序博客网 时间:2024/05/20 21:21
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 = -1L
与val 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多个addFetchfor (MessageAndOffset messageAndOffset : fetchResponse.messageSet(topic, partition)) { //每条消息的payload ByteBuffer payload = messageAndOffset.message().payload(); //下一个offset nextOffset = messageAndOffset.nextOffset();}
leader change
kafka宕机实际上是通过zk进行检测的,当zk上broker临时节点不在时应会告知kafka集群重新进行leader选举,应用中需要进行一段时间的等待,可参考例子中的代码。
- Simple Consumer Scala API
- Kafka High Level Consumer API in Scala
- kafka进击之路(四) ——consumer simple API开发
- Kafka consumer API简介
- Kafka Consumer API样例
- Kafka New Consumer API
- Kafka Consumer API样例
- Kafka Consumer java api 配置
- Kafka Consumer Java API实现
- scala API
- Scala-archetype-simple Version:1.6
- Simple API for XML
- My simple API
- OpenGL API simple summary
- simple-mock-api
- Kafka Consumer的底层API- SimpleConsumer
- kafka0.8 high-level consumer api使用
- Consumer
- 微信账号绑定
- linux编程-守护进程编写
- linux日志文件说明
- Java 分治法 求解一组数组元素的最大值和最小值
- 匿名内部类实现接口,继承类
- Simple Consumer Scala API
- 程序员面试金典题解 链表分割
- 冰与火之歌地图
- CQUOJ月赛(5月)H题:zzblack与斐波那契数列
- 019-dfs.bfs-图的遍历-《算法设计技巧与分析》M.H.A学习笔记
- 如何使用Xcode的Targets来管理开发和生产版本的构建
- Spring LDAP
- 提高项目12.1-数组大折腾 加倍
- hover显示遮罩层及border旋转