专栏首页码字搬砖深入理解kafka: 核心设计与实践原理

深入理解kafka: 核心设计与实践原理

bootstrap.servers ,分割,这里并非需要所有的broker地址清单,因为生产者会从给定的broker里查找到其他broker信息,不过建议 至少要设置两个以上broker地址信息

broker端接收的消息必须以字节数组( byte[] )形式存在,在发往broker之前需要将消息中对应的 key 和 value 做相应的序列化操作 来转化成字节数据 生产者需要用序列化器把对象转换成字节数组才能通过网络发送给kafka,而在对侧,消费者需要用反序列化器把kafka中收到的字节数据转化 成相应的对象 生产者和消费者的序列化器需要一一对应的 不建议自定义序列化器或反序列化器,会增加生产者和消费者之间的耦合度。 在实际应用中,在kafka提供序列化器和反序列化器满足不了应用需求的前提下,推荐使用 avro json thrift、protobuf等通过的序列化包

在不改变主题分区数量的情况下,key与分区之间的映射可以保持不变。不过,一旦主题中增加了分区,那么就难以保证key与分区之间的映射关系了

默认分区,当key不为null时,那么默认的分区器会对key进行哈希,如果key为null,轮询

kafka producer 线程安全的

回调函数也可以保证分区有序

发送消息三种方式:1.发后即忘 send() 2.同步(sync) send().get() 3.异步(async) send(,callback)

生产者客户端的整体架构:

RecordAccumulator主要用来缓存消息以便Sender线程可以批量发送,进而减少网络传输的资源消耗以提升性能,其大小可以通过生产者客户端参数 buffer.memory配置,默认是32M

batch.size

max.blocks.ms

max.in.flight.requests.pre.connection 默认 5,每个连接(客户端与Node之间的连接)最多只能缓存5个未响应的请求,超过该数值之后就不能再向这个连接发送更多的请求了,除非有缓存的请求收到了响应

元数据的更新:

metadata.max.age.ms 默认 5min

acks=all 并不意味着消息就一定可靠,因为 ISR 中可能只有 leader 副本,这样就退化成了 acks=1 的情况。要获得更高的消息可靠性需要配合 min.insysc.replicas 等参数的联动.

max.request.size 限制生产者客户端能发送的消息的最大值 默认 1M message.max.bytes

retries 默认值 0 和retry.backoff.ms 默认值 100

compression.type 默认 none 对消息进行压缩可以极大的减少网络传输量、降低网络I/O,从而提高整体性能。消息压缩是一种使用时间换空间的优化方式,如果对时延有一定的要求,则不推荐对消息进行压缩

connections.max.idle.ms 多久之后关闭空闲连接 默认 9min

linger.ms 生产者发送 ProducerBatch 之前等到更多消息(ProducerRecord)加入 ProducerBatch 的时间。 默认 生产者客户端会在 ProducerBatch 被填满或者等待时间超过 linger.ms 值时发送出去。增大这个参数的值会增加消息的延迟,但同时能提升一定的吞吐量( 当不为0的时候,适当调大batch.size 才有价值跟意义)

receive.buffer.bytes 设置 socket接收消息缓冲区(SO_RECBUF)的大小,默认 32K,如果设置 -1,则使用操作系统默认值。如果 producer 与kafka 处于不同机房,则可以适当调大这个参数

send.buffer.bytes 同上 默认128K

request.timeout.ms producer 等待请求响应的最长时间 默认 30s 注意这个参数要比 replica.lag.time.max.ms 的值要大,这样可以减少因客户端重试而引起消息重复的概率.

enble.idempotence 默认 false 是否开启幂等性

消费者

partition.assignment.strategy来设置消费者与订阅消费者与订阅主题之间的分区分配策略

Replicas AR集合

inSynReplicas ISR集合

offlineReplicas OSR集合

通过 subscribe()方法订阅主题具有消费者自动再均衡的功能,在多个消费者的情况下可以根据分区分配策略来自动分配各个消费者与分区的关系。而通过 assign() 方法订阅分区时,是不具备消费者自动均衡的功能的

Kafka 消费者是基于拉模式的( 消息的消费一般有两种模式:推模式和拉模式。 推模式是服务端主动将消息推送给消费者,而拉模式是消费者主动向服务端发起请求来拉消息 )

对于 poll()方法而言,如果某些分区中没有可供消费的消息,那么此分区对应的消息拉取的结果就为空。

/*
					可以获取消息集中的指定分区的消息
					可以获取消息集中的指定topic的消息
					可以获取消息集中所有的分区
					 */
//					records.records()
					
					/*
					count() 方法计算出消息集中的消息个数 int
					isEmpty() 判断消息集是否为空   boolean
					empty()   获取一个空消息集
					 */

kafka中它的每天消息都有唯一的offset,用来表示消息在分区中对应的位置 偏移量。对于消费者而言,它也有一个offset,消费者使用 offset 来表示消费到分区中某个消息所在的位置 位移 消费者消费到的位置 lastConsumerOffset

position=commited offset =lastConsumedOffset+1 position, commited offset 也不会一直相同

enable.auto.commit 默认 true enable.auto.interval.ms默认 5s

待续,未完

生产者、消费者 拦截器

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 二叉树遍历及查找

    所有的叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续

    shengjk1
  • hive原理分析

    基于hive1.1(从hive2.0开始,hive开始基于内存了,底层的实现框架不在基于MR)

    shengjk1
  • 二叉树删除节点-简化版

    shengjk1
  • 度量软件项目成本时如何识别逻辑文件?

     使用快速功能点法进行软件成本度量过程中,在明确了系统边界后,便要进行逻辑文件(数据功能)的识别。那么,什么是逻辑文件?在度量软件成本时如何正确区分哪些是逻辑文...

    软件成本造价评估
  • Mybatis深入源码分析之SQLSession一级缓存原理分析

    到了本篇文章的重点了,下面我们就开始分析selectOne()方法里面怎么实现的。

    须臾之余
  • 新版微信QQ半透明主题,这才是我喜欢的

    这几天科技圈还是挺多大事的,“微信之夜”,柚子看了一下,“微信之父”张小龙讲述了微信8年发展中的心路历程,对用户关心的问题进行了解答。

    IT小侠公社
  • 软件设计的风格

    ? 1 风格对于软件系统,犹如文化对于人类社会,对于组成系统的各个要素(无论模块、组件、对象还是函数),都会施加影响,只要是在运用该风格的边界范围之内。 这种...

    张逸
  • 如何解决架构与业务发展冲突?讯飞输入法Android架构演进

    IT大咖说
  • Go 学习笔记 第二弹 初识编写第一个Go程序与package

    up 在 GoProject 目录 src 下创建一个 study 项目目录,之后up又创建了 day01 目录来存放今天学习的代码

    风清醉
  • Ghost - How to change ghost's theme

    出来两个包啦。 + 这个时候重新启动你的 Ghost。 如果你是 forever 那么敲这个

    Mitchell

扫码关注云+社区

领取腾讯云代金券