Kafka 第三章,第四章阅读笔记

  1. Kafka 发送消息有三种方式:不关心结果的,同步方式,异步方式。
  2. Kafka 的异常主要有两类:一种是可重试异常,一种是无需重试异常。

生产者的配置:

  1. acks 越大,越不容易丢失消息,但是吞吐量下降。
  2. buffer.memory,设置不当会导致阻塞或者抛出异常。
  3. compression.type snappy和gzip, lz4。
  4. retries 重试次数,
  5. 如果要保证消息的顺序,必须保证max.in.flight.requests.per.connection=1.

分区

1.一个进程只从一个分区读取数据
2.相同键的消息都会被写到同一个分区。
3.使用默认分区器时,只有不改变分区数据的情况下,键和分区的映射关系才能保持不变。
4.群组协调器broker,不同的群组可以有不同的协调器。消费者在轮询消息或者提交偏移量时会发送心跳,如果心跳长时间停止,会话会过期,群组协调器会认为消费者死亡,发生再均衡。
5.同一个Topic的分区,只被同一个消费组里的消费者拥有一次。有多个放映厅(消费组),一场电影(分区),每一个放映厅里面人只能看一次。一个放映厅的人可以看多个不同的电影。

轮询间隔:
max.poll.interval.ms

分配分区:

消费者第一个加入群组,则它将成为群主。
群主从协调器获得群组的成员列表,并负责给每一个消费者分配分区。实现了一个PartitionAssignor的接口。
Kafka实现了两种分配策略。
分配完毕之后,群主把分配情况发送给群组协调器,协调器再把信息发送给所有的消费者。只有群主知道群组里所有的消费者信息。
该过程在每次再均衡时发生。

消费者的配置:

fetch.min.bytes,如果数据量小于fetch.min.bytes指定的大小,会等待满足条件broker才会返回给消费者。
fetch.max.wait.ms,指定broker的等待时间,默认500ms,如果没有足够的数据流入Kafka,会导致500ms的延迟。
如果fetch.max.wait.ms=100ms,fetch.min.bytes=1MB,Kafka收到消费者的请求后,要么返回1MB的数据,要么100ms后返回所有的数据。
max.partition.fetch.bytes 默认值是1MB。 poll()方法从每个分区里返回的记录最多不超过这个值。20分区,5个消费者,则至少4MB可用内存才能接收记录。该值必须比broker能手接受的最大消息的字节数,max.message.size大,否则可能无法读取消息,导致消费者一直挂起重试。。。
如果单次返回的数据过多,可能来不及处理数据,导致会话过期,这种情况下,可以把该值改小,或者延长会话过期时间。

session.timeout.ms
消费者超过这个时间没有发送心跳给群组协调器则会被认为死亡,从而触发再均衡。
该属性和heartbeat.interval.ms紧密相关,heartbeat.interval.ms指定了poll()方法向协调器发送心跳的频率。session.timeout.ms则指定了消费者多久可以不发心跳。
一般来说,heartbeat.interval.ms必须比session.timeout.ms小,一般是1/3。session.timeout.ms属性太小,有利于更快检测和恢复崩溃的节点,但是长时间轮询或垃圾收集等情况会导致非预期的再均衡。相反该值过大,可以减少意外的再均衡,但是检测崩溃节点会需要更长的时间。

auto.offset.reset
在偏移量无效的情况下,消费者将从何处读取分区记录。因消费者长时间失效,包含偏移量的记录已经过时并被删除。默认值为latest,意思为从最新的记录开始读取。另一个值是earliest,从起始位置读取分区的记录。

enable.auto.commit
该属性指定消费者是否自动提交偏移量,默认是true。为了尽量避免重复数据和数据丢失,可以把他设置为false,由自己控制何时提交偏移量。
auto.commit.interval.ms 可以控制相应的自动提交的频率,默认值是5秒。

partition.assignment.strategy
分区分配策略,kafka内置两种策略:
Range:该策略会把连续的分区分配给消费者。当分区数量是奇数时,容易将更多的分区分配给某一个消费者。
RoundRobin:该策略会将分区逐个分配给消费者,如果所有的消费者都订阅相同的主题,所有消费者分配到数量相同的分区,最多相差一个。

client.id
客户端的ID

max.poll.records
用于控制单次调用call方法能够返回的记录数量。

receive.buffer.bytes和send.buffer.bytes
socket用到的TCP的缓冲区大小。-1表示使用操作系统的默认值。

消费者如何提交偏移量

消费者更新分区的当前位置的操作叫做提交。
消费者往一个叫做_consumer_offset的特殊主题提交偏移量。
自动提交,按照时间间隔。
手动提交:
同步提交,异步提交。最好的写法就是轮询中异步提交,再最外部,关闭之前同步提交。

再均衡监听器

可以在发生再均衡期间提交偏移量。实现 ConsumerRebalanceListener接口。

  1. onPartitionsRevoked 方法会在再均衡开始之前,且消费者停止读取消息之后被调用。
  2. onPartitionAssigned 方法会在重新分配分区之后,且消费者开始毒气消息之前被调用。

seek 可以自定义偏移量。

退出

主线程上的消费者,退出线程可以使用addShutdownHook。退出循环的安全方式是通过wakeup()方法。poll会抛出WakeupException,退出循环。在退出之前,确保关闭了消费者。

没有群组的消费者。独立消费者

一个消费者可以订阅主题加入消费组,或者为自己分配分区,但是不能同时做这两件事情。

步骤是,先从集群请求主题哪些分区可用,然后调用assign方法。

Kafka 权威指南阅读笔记(第三章,第四章)的更多相关文章

  1. Kafka权威指南阅读笔记(第六章)

    Broker配置 Kafka可以同时拥有可靠的主题和非可靠的主题.非可靠的主题允许丢失. 复制系数 主题级别的配置参数是 replication.factor,在Broker级别则可以通过defaul ...

  2. Kafka权威指南阅读笔记(第五章)

    Kafka Broker kafka 第一个启动的Broker在ZooKeeper中创建一个临时节点/controller,让自己成为控制器.其他Broker启动后在控制器节点上创建Watch对象,便 ...

  3. html5+css3 权威指南阅读笔记(三)---表单及其它新增和改良元素

    一.新增元素及属性 1.表单内元素的form属性. html5: <form id="testForm"> <input type=text> </f ...

  4. Kafka权威指南阅读笔记(第八章)

    跨集群数据镜像 使用场景: 区域集群和中心集群 这种场景下,每个区域的应用程序只访问相应的区域内的集群.而有些情况下,需要将各个集群的信息汇总到中心集群,就可以用中心集群分析业务数据了. 冗余 一个K ...

  5. Javascript权威指南阅读笔记--第3章类型、值和变量(1)

    之前一直有个想法,好好读完JS权威指南,便于自己对于JS有个较为全面的了解.毕竟本人非计算机专业出生,虽然做着相关行业的工作,但总觉得对于基础的掌握并没有相关专业学者扎实,正好因为辞职待业等原因,还是 ...

  6. mycat权威指南阅读笔记--序言1

    前言 mycat官方地址http://www.mycat.io/,mycat是关系数据库的中间件,也就是说它可以把后端的多个数据库,抽象成一个关系数据库. mycat能干啥 官方文档介绍,主要是用来做 ...

  7. 《HTTP 权威指南》笔记:第三章 HTTP 报文

    如果说 HTTP 是因特网的信使,那么 HTTP 报文就是它用来搬东西的包了. 这一章讲述关于 HTTP 报文的相关知识,包括: HTTP 报文的三个组成部分 请求报文以及其各种功能 响应报文以及各种 ...

  8. HTTP权威指南阅读笔记三:HTTP报文

    报文的组成部分 报文由三部分组成:对报文进行描述的起始行(start line).包含属性的首部(header),以及可选的.包含数据的主体(body)部分. 请求报文格式 <method> ...

  9. Kafka权威指南 读书笔记之(三)Kafka 生产者一一向 Kafka 写入数据

    不管是把 Kafka 作为消息队列.消息总线还是数据存储平台来使用 ,总是需要有一个可以往 Kafka 写入数据的生产者和一个从 Kafka 读取数据的消费者,或者一个兼具两种角色的应用程序. 开发者 ...

随机推荐

  1. Selenium+python操作id为动态变化的frame(iframe)

    先定位到一组frame:ele = dr.find_elements_by_tag_name('iframe')此时获得一组frame 再通过index取需要切进去的frame并取到该frame的id ...

  2. Java 基础篇之编程基础

    基本数据类型 java 是强类型语言,在 java 中存储的数据都是有类型的,而且必须在编译时就确定其类型. 基本数据类型变量存储的是数据本身,而引用类型变量存的是数据的空间地址. 基本类型转换 自动 ...

  3. IT修养-基础篇

    1.科学基础 成为开发人员的过程不尽相同,有的是科班出身,有的是兴趣爱好,还有的是专业机构的培训,在这个过程中,可能全面或者零散甚至没有学习过计算机基础学科,但无论是哪一种,想要成为更高层次的开发人员 ...

  4. Sentinel基本概念

     Sentinel是阿里开源的一款高性能的限流框架.这里将对Sentinel的使用和实现进行介绍.  这里先介绍下Sentinel中涉及到的基本概念,包括使用上或者实现上.主要是笔者在阅读文档和源码时 ...

  5. 初识PE文件结构

    前言 目前网络上有关PE文件结构说明的文章太多了,自己的这篇文章只是单纯的记录自己对PE文件结构的学习.理解和总结. 基础概念 PE(Portable Executable:可移植的执行体)是Win3 ...

  6. 23种设计模式之原型模式(Prototype Pattern)

    原型模式 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 分析: 孙悟空:根据自己的形状复制(克隆)出多个身外身 软件开发:通过复制一个原型对象得到多个与原型对象一模一样的新对象 ...

  7. Flask基础(16)-->WTForms表单创建和简单验证

    Flask基础(16)-->WTForms表单创建和简单验证 前言:使用Flask_WTF需要配置参数SECRET_KEYCSRF_ENABLED是为了CSRF(跨站请求伪造)保护.SECRET ...

  8. 微信小程序 实现多行文字 超出部分省略号显示

    在开发小程序: 澳买 的 时候 遇到一个棘手的问题: 当搜索澳洲产品,获取产品列表的时候,有时候产品的名称翻译成中文特别长 我们不能全部在有限的列表里面把产品名都显示出来,这样格式不好控制,显示 出来 ...

  9. 手把手教你如何在Windows下allure与jenkins的集成生成让你一见钟情的测试报告 - 03(非常详细,非常实用)

    简介 好了,国庆假期结束,开始搬砖.为什么要把allure和jenkins集成了?原因是集成以后,我们就可以直接查看allure的结果,不需要重复输入命令.重复使用浏览器打开文件来查看allure的结 ...

  10. SpringBoot 整合 MyBatis-Plus 入门体验

    一.前言 本文小编将基于 SpringBoot 整合 MyBatis-Plus , MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上做增强并且不改变原本功能 ...