Kafka HighLevel API与LowLevel API说明
Kafka的Consumer API有两种
High Level Consumer API
Low Level Consumer API
对于开发这来说,选用哪个,首先要弄清楚这两种API的工作原理什么样,分别开放了哪些功能。
High Level Consumer API说明
High Level Consumer API围绕着Consumer Group这个逻辑概念展开。
- 它自动管理每个Topic的每个Partition的Offset(自动读取zookeeper中该Consumer group的last offset )
- 在Broker失败转移以及增减Partition、Consumer时的负载均衡(当Partition和Consumer增减时,Kafka自动进行负载均衡)
对于多个Partition,多个Consumer
注意kafka的设计是在一个partition上是不允许并发的,所以consumer数不要大于partition数,如果consumer比partition多,是浪费。
简单来说一个某个topic下的某个partition只能被一个消费实例处理。
- 如果consumer比partition少,一个consumer会对应于多个partitions。这里要合理分配consumer数和partition数,否则会导致partition里面的数据被取的不均匀。
- 通常做法partiton数目是consumer数量的整数倍,所以partition数量很重要,比如取24,consumer数量可以是3或者6或者8等。
- 如果consumer从多个partition读到数据,不保证数据间的顺序性,kafka只保证在一个partition上数据是有序的,但多个partition,根据你读的顺序会有不同。
- 增减consumer,broker,partition会导致rebalance,所以rebalance后consumer对应的partition会发生变化
- High-level接口中获取不到数据的时候是会block的
- 关于Offset初始值的问题:先produce一些数据,然后再用consumer读的话,需要加上一句offset读取设置,即如果初始offset非法,那么从最小的offset开始。
props.put("auto.offset.reset", "smallest"); //必须要加,如果要读旧数据
因为初始的offset默认是非法的,这个配置只有当offset非法时才会执行,如果不配置,默认是largest,即最新,所以要读之前produce的数据,必须加上这个配置。并且offset初始化后再加smallest配置是没用的,因为此时offset是合法的,不会再被修正了,需要手工或用工具改重置offset。
Low Level Consumer API说明
Low Level Consumer API控制灵活性高,但使用也相对复杂。
Low Level Consumer API,作为底层的Consumer API,提供了消费Kafka Message更大的控制,如:
- Read a message multiple times(重复读取)
- Consume only a subset of the partitions in a topic in a process(跳读)
- Manage transactions to make sure a message is processed once and only once(消息事务处理)
Low Level Consumer API提供更大灵活控制是以复杂性为代价的:
- Offset不再透明
- Broker自动失败转移需要处理
- 增加Consumer、Partition、Broker需要自己做负载均衡
注意如下:
- You must keep track of the offsets in your application to know where you left off consuming.(在自己的应用中管理Offset)
- You must figure out which Broker is the lead Broker for a topic and partition(如果一个Partition有多个副本,那么Lead Partition所在的Broker就称为这个Partition的Lead Broker,得自己判断)
- You must handle Broker leader changes(Broker Leader变更也得自己来)
使用Low Level Consumer API的步骤
- Find an active Broker and find out which Broker is the leader for your topic and partition(找到一个活跃的broker,并且找出当前topic和partition的leader broker)
- Determine who the replica Brokers are for your topic and partition(要决定哪些broker是当前topic和partition的leader broker的副本备份)
- Build the request defining what data you are interested in(创建请求数据说明)
- Fetch the data(拉取数据)
- Identify and recover from leader changes(在leader broker变更后,重新标识和恢复)。
最后
从开放的功能服务看,highlevel的配置与使用相对简单,分布式管理功能由Kafka集群与zookeeper自行管理,消费者只要从头或者从最新处获取数据即可,服务重启,能从上次消费位置开始,leader故障,能够自行rebalance。而lowlevel更为为灵活也更复杂,这些都是开放给自己的应用来管理。
资料来源:https://kafka.apachecn.org/documentation.html
Kafka HighLevel API与LowLevel API说明相关推荐
- kafka系列九、kafka事务原理、事务API和使用场景
一.事务场景 最简单的需求是producer发的多条消息组成一个事务这些消息需要对consumer同时可见或者同时不可见 . producer可能会给多个topic,多个partition发消息,这些 ...
- kafka java api 删除_Kafka入门系列—6. Kafka 常用命令及Java API使用
常用命令 启动Zookeeper ./zkServer.sh start-foreground 可选参数: ./zkServer.sh {start|start-foreground|stop|res ...
- 【Kafka笔记】4.Kafka API详细解析 Java版本(Producer API,Consumer API,拦截器等)
简介 Kafka的API有Producer API,Consumer API还有自定义Interceptor (自定义拦截器),以及处理的流使用的Streams API和构建连接器的Kafka Con ...
- 海边的卡夫卡之 - kafka的基本概念以及Api使用
海边的卡夫卡之 - kafka的基本概念以及Api使用 kafka的应用以及与其他MQ的对比 关于kafka的介绍,也许没有人能比官网更具有话语权,所以这里可以参考官网了解一下kafka:Kafka介 ...
- kafka Java客户端之 consumer API 消费消息
背景:我使用docker-compose 搭建的kafka服务 kafka的简单介绍以及docker-compose部署单主机Kafka集群 使用consumer API消费指定Topic里面的消息 ...
- java api 设计_Java API设计实践
使你的API在模块化和非模块化Java环境中都可用 在优锐课的java学习分享中,对微服务有了更深层次的新概念.关于API设计实践一点就通了. 介绍 了解设计Java API时应应用的一些API设计实 ...
- Python API vs C++ API of TensorRT
Python API vs C++ API of TensorRT 本质上,C++ API和Python API应该在支持您的需求方面接近相同.pythonapi的主要优点是数据预处理和后处理都很容易 ...
- 关于Android 隐藏 API 和内部 API的查看与使用
前言 Android 有两种类型的 API 不能通过 SDK 访问.一种是在 com.android.internal 包中的 API,称之为 internal API.另一种是被标记为 @hide ...
- 揭示Win32 API拦截细节/API hooking revealed (1)
原文出处:http://www.codeproject.com/system/hooksys.asp 简要介绍 拦截win32 API 调用对于多数windows开发人员来说都一直是很有挑战性的课题, ...
最新文章
- requirejs模块化html,requirejs模块化-入门
- 关键字提取_从杂乱无章的表格中找出关键字,批量提取字符
- USB 之三 常用抓包/协议分析工具(Bus Hound、USBlyzer、USBTrace、USB Monitor Pro等)
- Hadoop:你不得不了解的大数据工具
- rest服务器性能,使用多线程提高REST服务性能
- 祝融号火星车亮相,每小时仅移动40米,为何比乌龟还慢?
- 蓝桥杯 历届试题 带分数
- 简单粗暴地理解js原型链--js面向对象编程
- 2018在职计算机科学硕士申请,2018年计算机专业硕士在职研究生备考指导
- 数据结构与算法之-----向量(Vector)
- 计算机基础知识真题模拟7,计算机一级考试计算机基础及Photoshop应用模拟试题(7)...
- FLEX中restrict限定TextInput输入
- html选择区间,jQuery可选择区间值代码
- 城市大脑总体框架和主要平台
- 无人驾驶失败案例汇总
- NX二次开发 使用了一个已删除或无效的类号
- Vue子传父详细教程
- DS18B20温度传感器——测试环境温度及代码
- 突然无法访问局域网内的共享文件夹
- 【来日复制粘贴】关于排名
热门文章
- 【华为机试029】合唱队
- STM32G0系列的启动配置与程序下载说明
- android 十字架效果实现(水平和垂直滑动)
- 个人miniblog被迫备份至此
- 初识c语言加操作系统
- 百度在北京和深圳主攻腾讯 新浪等一些IM公司,大力挖人,甚至爆出15w-20w年薪,有人士对百度的行为做出以下分析:
- emem今天再记一道套路whalectf pwn3
- 你玩过轻量系统软总线应用吗?
- python游戏联机后直接掉线,怪物猎人世界联机掉线怎么办 Steam联机掉线解决办法整理(一)...
- SSL_read: Failure in SSL library (protocol error?)