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说明相关推荐

  1. kafka系列九、kafka事务原理、事务API和使用场景

    一.事务场景 最简单的需求是producer发的多条消息组成一个事务这些消息需要对consumer同时可见或者同时不可见 . producer可能会给多个topic,多个partition发消息,这些 ...

  2. kafka java api 删除_Kafka入门系列—6. Kafka 常用命令及Java API使用

    常用命令 启动Zookeeper ./zkServer.sh start-foreground 可选参数: ./zkServer.sh {start|start-foreground|stop|res ...

  3. 【Kafka笔记】4.Kafka API详细解析 Java版本(Producer API,Consumer API,拦截器等)

    简介 Kafka的API有Producer API,Consumer API还有自定义Interceptor (自定义拦截器),以及处理的流使用的Streams API和构建连接器的Kafka Con ...

  4. 海边的卡夫卡之 - kafka的基本概念以及Api使用

    海边的卡夫卡之 - kafka的基本概念以及Api使用 kafka的应用以及与其他MQ的对比 关于kafka的介绍,也许没有人能比官网更具有话语权,所以这里可以参考官网了解一下kafka:Kafka介 ...

  5. kafka Java客户端之 consumer API 消费消息

    背景:我使用docker-compose 搭建的kafka服务 kafka的简单介绍以及docker-compose部署单主机Kafka集群 使用consumer API消费指定Topic里面的消息 ...

  6. java api 设计_Java API设计实践

    使你的API在模块化和非模块化Java环境中都可用 在优锐课的java学习分享中,对微服务有了更深层次的新概念.关于API设计实践一点就通了. 介绍 了解设计Java API时应应用的一些API设计实 ...

  7. Python API vs C++ API of TensorRT

    Python API vs C++ API of TensorRT 本质上,C++ API和Python API应该在支持您的需求方面接近相同.pythonapi的主要优点是数据预处理和后处理都很容易 ...

  8. 关于Android 隐藏 API 和内部 API的查看与使用

    前言 Android 有两种类型的 API 不能通过 SDK 访问.一种是在 com.android.internal 包中的 API,称之为 internal API.另一种是被标记为 @hide ...

  9. 揭示Win32 API拦截细节/API hooking revealed (1)

    原文出处:http://www.codeproject.com/system/hooksys.asp 简要介绍 拦截win32 API 调用对于多数windows开发人员来说都一直是很有挑战性的课题, ...

最新文章

  1. requirejs模块化html,requirejs模块化-入门
  2. 关键字提取_从杂乱无章的表格中找出关键字,批量提取字符
  3. USB 之三 常用抓包/协议分析工具(Bus Hound、USBlyzer、USBTrace、USB Monitor Pro等)
  4. Hadoop:你不得不了解的大数据工具
  5. rest服务器性能,使用多线程提高REST服务性能
  6. 祝融号火星车亮相,每小时仅移动40米,为何比乌龟还慢?
  7. 蓝桥杯 历届试题 带分数
  8. 简单粗暴地理解js原型链--js面向对象编程
  9. 2018在职计算机科学硕士申请,2018年计算机专业硕士在职研究生备考指导
  10. 数据结构与算法之-----向量(Vector)
  11. 计算机基础知识真题模拟7,计算机一级考试计算机基础及Photoshop应用模拟试题(7)...
  12. FLEX中restrict限定TextInput输入
  13. html选择区间,jQuery可选择区间值代码
  14. 城市大脑总体框架和主要平台
  15. 无人驾驶失败案例汇总
  16. NX二次开发 使用了一个已删除或无效的类号
  17. Vue子传父详细教程
  18. DS18B20温度传感器——测试环境温度及代码
  19. 突然无法访问局域网内的共享文件夹
  20. 【来日复制粘贴】关于排名

热门文章

  1. 【华为机试029】合唱队
  2. STM32G0系列的启动配置与程序下载说明
  3. android 十字架效果实现(水平和垂直滑动)
  4. 个人miniblog被迫备份至此
  5. 初识c语言加操作系统
  6. 百度在北京和深圳主攻腾讯 新浪等一些IM公司,大力挖人,甚至爆出15w-20w年薪,有人士对百度的行为做出以下分析:
  7. emem今天再记一道套路whalectf pwn3
  8. 你玩过轻量系统软总线应用吗?
  9. python游戏联机后直接掉线,怪物猎人世界联机掉线怎么办 Steam联机掉线解决办法整理(一)...
  10. SSL_read: Failure in SSL library (protocol error?)