- Kafka的用途有哪些?使用场景如何?
总结下来就几个字:异步处理、日常系统解耦、削峰、提速、广播
如果再说具体一点例如:消息,网站活动追踪,监测指标,日志聚合,流处理,事件采集,提交日志等 - Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么
AR:Assigned Replicas 所有副本列表
ISR:InSync Replicas 同步副本列表
ISR expand : 有副本恢复同步状态
ISR shrink : 有副本脱离同步状态
ISR是由leader维护,follower从leader同步数据有一些延迟(包括延迟时间replica.lag.time.max.ms和延迟条数replica.lag.max.messages两个维度),任意一个超过阈值都会把follower剔除出ISR, 存入OSR(Outof-Sync Replicas)列表,新加入的follower也会先存放在OSR中。AR=ISR+OSR。 - Kafka中的HW、LEO、LSO、LW等分别代表什么?
HW:High Watermark 高水位,取一个partition对应的ISR中最小的LEO作为HW,consumer最多只能消费到HW所在的位置上一条信息。
LEO:LogEndOffset 当前日志文件中下一条待写信息的offset
HW/LEO这两个都是指最后一条的下一条的位置而不是指最后一条的位置。
LSO:Last Stable Offset 对未完成的事务而言,LSO 的值等于事务中第一条消息的位置(firstUnstableOffset),对已完成的事务而言,它的值同 HW 相同
LW:Low Watermark 低水位, 代表 AR 集合中最小的 logStartOffset 值 -
Kafka中是怎么体现消息顺序性的?
kafka每个partition中的消息在写入时都是有序的,消费时,每个partition只能被每一个group中的一个消费者消费,保证了消费时也是有序的。
整个topic不保证有序。如果为了保证topic整个有序,那么将partition调整为1. -
Kafka中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?
拦截器->序列化器->分区器
-
Kafka生产者客户端的整体结构是什么样子的?
- Producer :消息生产者,就是向kafka broker发消息的客户端。
Consumer :消息消费者,向kafka broker取消息的客户端
Topic :可以理解为一个队列。
Consumer Group (CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partion只会把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。
Broker :一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。
Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。
** Offset:**kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka -
Kafka生产者客户端中使用了几个线程来处理?分别是什么?
2个,主线程和Sender线程。主线程负责创建消息,然后通过分区器、序列化器、拦截器作用之后缓存到累加器RecordAccumulator中。Sender线程负责将RecordAccumulator中消息发送到kafka中.
-
“消费组中的消费者个数如果超过topic的分区,那么就会有消费者消费不到数据”这句话是否正确?如果不正确,那么有没有什么hack的手段?
不正确,
- 消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset+1?
offset+1
- 有哪些情形会造成重复消费?
消费者消费后没有commit offset(程序崩溃/强行kill/消费耗时/自动提交偏移情况下unscrible)
- 那些情景下会造成消息漏消费?
消费者没有处理完消息 提交offset(自动提交偏移 未处理情况下程序异常结束)
-
KafkaConsumer是非线程安全的,那么怎么样实现多线程消费?
1.在每个线程中新建一个KafkaConsumer
2.单线程创建KafkaConsumer,多个处理线程处理消息(难点在于是否要考虑消息顺序性,offset的提交方式) -
简述消费者与消费组之间的关系
消费者从属与消费组,消费偏移以消费组为单位。每个消费组可以独立消费主题的所有数据,同一消费组内消费者共同消费主题数据,每个分区只能被同一消费组内一个消费者消费。
-
当你使用kafka-topics.sh创建(删除)了一个topic之后,Kafka背后会执行什么逻辑?
创建:在zk上/brokers/topics/下节点 kafkabroker会监听节点变化创建主题
删除:调用脚本删除topic会在zk上将topic设置待删除标志,kafka后台有定时的线程会扫描所有需要删除的topic进行删除 - topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?
可以
- topic的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?
不可以
- 创建topic时如何选择合适的分区数?
根据集群的机器数量和需要的吞吐量来决定适合的分区数
- Kafka目前有那些内部topic,它们都有什么特征?各自的作用又是什么?
__consumer_offsets 以下划线开头,保存消费组的偏移
- 优先副本是什么?它有什么特殊的作用?
优先副本 会是默认的leader副本 发生leader变化时重选举会优先选择优先副本作为leader
- Kafka有哪几处地方有分区分配的概念?简述大致的过程及原理
创建主题时
如果不手动指定分配方式 有两种分配方式
消费组内分配 - 简述Kafka的日志目录结构
每个partition一个文件夹,包含四类文件.index .log .timeindex leader-epoch-checkpoint
.index .log .timeindex 三个文件成对出现 前缀为上一个segment的最后一个消息的偏移 log文件中保存了所有的消息 index文件中保存了稀疏的相对偏移的索引 timeindex保存的则是时间索引
leader-epoch-checkpoint中保存了每一任leader开始写入消息时的offset 会定时更新
follower被选为leader时会根据这个确定哪些消息可用 - Kafka中有那些索引文件?
如上
- 如果我指定了一个offset,Kafka怎么查找到对应的消息?
1.通过文件名前缀数字x找到该绝对offset 对应消息所在文件
2.offset-x为在文件中的相对偏移
3.通过index文件中记录的索引找到最近的消息的位置
4.从最近位置开始逐条寻找 - 如果我指定了一个timestamp,Kafka怎么查找到对应的消息?
原理同上 但是时间的因为消息体中不带有时间戳 所以不精确
- 聊一聊你对Kafka的Log Retention的理解
kafka留存策略包括 删除和压缩两种
删除: 根据时间和大小两个方式进行删除 大小是整个partition日志文件的大小
超过的会从老到新依次删除 时间指日志文件中的最大时间戳而非文件的最后修改时间
压缩: 相同key的value只保存一个 压缩过的是clean 未压缩的dirty 压缩之后的偏移量不连续 未压缩时连续 -
聊一聊你对Kafka的Log Compaction的理解
-
聊一聊你对Kafka底层存储的理解(页缓存、内核层、块层、设备层)
-
聊一聊Kafka的延时操作的原理
-
聊一聊Kafka控制器的作用
-
消费再均衡的原理是什么?(提示:消费者协调器和消费组协调器)
-
Kafka中的幂等是怎么实现的
-
Kafka中的事务是怎么实现的(这题我去面试6家被问4次,照着答案念也要念十几分钟,面试官简直凑不要脸。实在记不住的话…只要简历上不写精通Kafka一般不会问到,我简历上写的是“熟悉Kafka,了解RabbitMQ….”)
-
Kafka中有那些地方需要选举?这些地方的选举策略又有哪些?
-
失效副本是指什么?有那些应对措施?
-
多副本下,各个副本中的HW和LEO的演变过程
-
为什么Kafka不支持读写分离?
-
Kafka在可靠性方面做了哪些改进?(HW, LeaderEpoch)
-
Kafka中怎么实现死信队列和重试队列?
-
Kafka中的延迟队列怎么实现(这题被问的比事务那题还要多!!!听说你会Kafka,那你说说延迟队列怎么实现?)
-
Kafka中怎么做消息审计?
-
Kafka中怎么做消息轨迹?
-
Kafka中有那些配置参数比较有意思?聊一聊你的看法
-
Kafka中有那些命名比较有意思?聊一聊你的看法
-
Kafka有哪些指标需要着重关注?
-
怎么计算Lag?(注意read_uncommitted和read_committed状态下的不同)
-
Kafka的那些设计让它有如此高的性能?
-
Kafka有什么优缺点?
-
还用过什么同质类的其它产品,与Kafka相比有什么优缺点?
-
为什么选择Kafka?
吞吐量高,大数据消息系统唯一选择。
-
在使用Kafka的过程中遇到过什么困难?怎么解决的?
-
怎么样才能确保Kafka极大程度上的可靠性?
-
聊一聊你对Kafka生态的理解
1 什么是kafka
Kafka是分布式发布-订阅消息系统,它最初是由LinkedIn公司开发的,之后成为Apache项目的一部分,Kafka是一个分布式,可划分的,冗余备份的持久性的日志服务,它主要用于处理流式数据。
2 为什么要使用 kafka,为什么要使用消息队列
缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。
解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。
冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。
健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。
异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
3 kafka中的broker 是干什么的
broker 是消息的代理,Producers往Brokers里面的指定Topic中写消息,Consumers从Brokers里面拉取指定Topic的消息,然后进行业务处理,broker在中间起到一个代理保存消息的中转站。
4 kafka中的 zookeeper 起到什么作用,可以不用zookeeper么
zookeeper 是一个分布式的协调组件,早期版本的kafka用zk做meta信息存储,consumer的消费状态,group的管理以及 offset的值。考虑到zk本身的一些因素以及整个架构较大概率存在单点问题,新版本中逐渐弱化了zookeeper的作用。新的consumer使用了kafka内部的group coordination协议,也减少了对zookeeper的依赖,
但是broker依然依赖于ZK,zookeeper 在kafka中还用来选举controller 和 检测broker是否存活等等。
5 kafka follower如何与leader同步数据
Kafka的复制机制既不是完全的同步复制,也不是单纯的异步复制。完全同步复制要求All Alive Follower都复制完,这条消息才会被认为commit,这种复制方式极大的影响了吞吐率。而异步复制方式下,Follower异步的从Leader复制数据,数据只要被Leader写入log就被认为已经commit,这种情况下,如果leader挂掉,会丢失数据,kafka使用ISR的方式很好的均衡了确保数据不丢失以及吞吐率。Follower可以批量的从Leader复制数据,而且Leader充分利用磁盘顺序读以及send file(zero copy)机制,这样极大的提高复制性能,内部批量写磁盘,大幅减少了Follower与Leader的消息量差。
6 什么情况下一个 broker 会从 isr中踢出去
leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR(in-sync Replica),每个Partition都会有一个ISR,而且是由leader动态维护 ,如果一个follower比一个leader落后太多,或者超过一定时间未发起数据复制请求,则leader将其重ISR中移除 ,详细参考 kafka的高可用机制
7 kafka 为什么那么快
-
Cache Filesystem Cache PageCache缓存
-
顺序写 由于现代的操作系统提供了预读和写技术,磁盘的顺序写大多数情况下比随机写内存还要快。
-
Zero-copy 零拷⻉技术减少拷贝次数
-
Batching of Messages 批量量处理。合并小的请求,然后以流的方式进行交互,直顶网络上限。
-
Pull 拉模式 使用拉模式进行消息的获取消费,与消费端处理能力相符。
8 kafka producer如何优化打入速度
-
增加线程
-
提高 batch.size
-
增加更多 producer 实例
-
增加 partition 数
-
设置 acks=-1 时,如果延迟增大:可以增大 num.replica.fetchers(follower 同步数据的线程数)来调解;
-
跨数据中心的传输:增加 socket 缓冲区设置以及 OS tcp 缓冲区设置。
优化方面的参考 kafka最佳实践
9 kafka producer 打数据,ack 为 0, 1, -1 的时候代表啥, 设置 -1 的时候,什么情况下,leader 会认为一条消息 commit了
1(默认) 数据发送到Kafka后,经过leader成功接收消息的的确认,就算是发送成功了。在这种情况下,如果leader宕机了,则会丢失数据。
0 生产者将数据发送出去就不管了,不去等待任何返回。这种情况下数据传输效率最高,但是数据可靠性确是最低的。
-1 producer需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成,可靠性最高。
当ISR中所有Replica都向Leader发送ACK时,leader才commit,这时候producer才能认为一个请求中的消息都commit了。
10 kafka unclean 配置代表啥,会对 spark streaming 消费有什么影响
unclean.leader.election.enable 为true的话,意味着非ISR集合的broker 也可以参与选举,这样有可能就会丢数据,spark streaming在消费过程中拿到的 end offset 会突然变小,导致 spark streaming job挂掉。如果unclean.leader.election.enable参数设置为true,就有可能发生数据丢失和数据不一致的情况,Kafka的可靠性就会降低;而如果unclean.leader.election.enable参数设置为false,Kafka的可用性就会降低。
11 如果leader crash时,ISR为空怎么办
kafka在Broker端提供了一个配置参数:unclean.leader.election,这个参数有两个值:
true(默认):允许不同步副本成为leader,由于不同步副本的消息较为滞后,此时成为leader,可能会出现消息不一致的情况。
false:不允许不同步副本成为leader,此时如果发生ISR列表为空,会一直等待旧leader恢复,降低了可用性。
12 kafka的message格式是什么样的
一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成
header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成。
当magic的值为1的时候,会在magic和crc32之间多一个字节的数据:attributes(保存一些相关属性,
比如是否压缩、压缩格式等等);如果magic的值为0,那么不存在attributes属性
body是由N个字节构成的一个消息体,包含了具体的key/value消息
13 kafka中consumer group 是什么概念
同样是逻辑上的概念,是Kafka实现单播和广播两种消息模型的手段。同一个topic的数据,会广播给不同的group;同一个group中的worker,只有一个worker能拿到这个数据。换句话说,对于同一个topic,每个group都可以拿到同样的所有数据,但是数据进入group后只能被其中的一个worker消费。group内的worker可以使用多线程或多进程来实现,也可以将进程分散在多台机器上,worker的数量通常不超过partition的数量,且二者最好保持整数倍关系,因为Kafka在设计时假定了一个partition只能被一个worker消费(同一group内)。
Kafka 基本配置及性能优化
这里主要是 Kafka 集群基本配置的相关内容。
硬件要求
Kafka 集群基本硬件的保证
OS 调优
-
OS page cache:应当可以缓存所有活跃的 Segment(Kafka 中最基本的数据存储单位);
-
fd 限制:100k+;
-
禁用 swapping:简单来说,swap 作用是当内存的使用达到一个临界值时就会将内存中的数据移动到 swap 交换空间,但是此时,内存可能还有很多空余资源,swap 走的是磁盘 IO,对于内存读写很在意的系统,最好禁止使用 swap 分区;
-
TCP 调优;
-
JVM 配置
-
JDK 8 并且使用 G1 垃圾收集器;
-
至少要分配 6-8 GB 的堆内存。
Kafka 磁盘存储
-
使用多块磁盘,并配置为 Kafka 专用的磁盘;
-
JBOD vs RAID10;
-
JBOD(Just a Bunch of Disks,简单来说它表示一个没有控制软件提供协调控制的磁盘集合,它将多个物理磁盘串联起来,提供一个巨大的逻辑磁盘,数据是按序存储,它的性能与单块磁盘类似)
-
JBOD 的一些缺陷:
-
任何磁盘的损坏都会导致异常关闭,并且需要较长的时间恢复;
-
数据不保证一致性;
-
多级目录;
-
社区也正在解决这么问题,可以关注 KIP 112、113:
-
必要的工具用于管理 JBOD;
-
自动化的分区管理;
-
磁盘损坏时,Broker 可以将 replicas 迁移到好的磁盘上;
-
在同一个 Broker 的磁盘间 reassign replicas;
-
RAID 10 的特点:
-
可以允许单磁盘的损坏;
-
性能和保护;
-
不同磁盘间的负载均衡;
-
高命中来减少 space;
-
单一的 mount point;
-
文件系统:
-
使用 EXT 或 XFS;
-
SSD;
基本的监控
Kafka 集群需要监控的一些指标,这些指标反应了集群的健康度。
-
CPU 负载;
-
Network Metrics;
-
File Handle 使用;
-
磁盘空间;
-
磁盘 IO 性能;
-
GC 信息;
-
ZooKeeper 监控。
Kafka replica 相关配置及监控
Kafka Replication
-
Partition 有两种副本:Leader,Follower;
-
Leader 负责维护 in-sync-replicas(ISR)
-
replica.lag.time.max.ms
:默认为10000,如果 follower 落后于 leader 的消息数超过这个数值时,leader 就将 follower 从 isr 列表中移除; -
num.replica.fetchers
,默认为1,用于从 leader 同步数据的 fetcher 线程数; -
min.insync.replica
:Producer 端使用来用于保证 Durability(持久性);
Under Replicated Partitions
当发现 replica 的配置与集群的不同时,一般情况都是集群上的 replica 少于配置数时,可以从以下几个角度来排查问题:
-
JMX 监控项:kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions;
-
可能的原因:
-
Broker 挂了?
-
Controller 的问题?
-
ZooKeeper 的问题?
-
Network 的问题?
-
解决办法:
-
调整 ISR 的设置;
-
Broker 扩容。
Controller
-
负责管理 partition 生命周期;
-
避免 Controller’s ZK 会话超时:
-
ISR 抖动;
-
ZK Server 性能问题;
-
Broker 长时间的 GC;
-
网络 IO 问题;
-
监控:
-
kafka.controller:type=KafkaController,name=ActiveControllerCount,应该为1;
-
LeaderElectionRate。
Unclean leader 选举
允许不在 isr 中 replica 被选举为 leader。
-
这是 Availability 和 Correctness 之间选择,Kafka 默认选择了可用性;
-
unclean.leader.election.enable
:默认为 true,即允许不在 isr 中 replica 选为 leader,这个配置可以全局配置,也可以在 topic 级别配置; -
监控:kafka.controller:type=ControllerStats,name=UncleanLeaderElectionsPerSec。
Broker 配置
Broker 级别有几个比较重要的配置,一般需要根据实际情况进行相应配置的:
-
log.retention.{ms, minutes, hours}
,log.retention.bytes
:数据保存时间; -
message.max.bytes
,replica.fetch.max.bytes
; -
delete.topic.enable
:默认为 false,是否允许通过 admin tool 来删除 topic; -
unclean.leader.election.enable
= false,参见上面; -
min.insync.replicas
= 2:当 Producer 的 acks 设置为 all 或 -1 时,min.insync.replicas
代表了必须进行确认的最小 replica 数,如果不够的话 Producer 将会报NotEnoughReplicas
或NotEnoughReplicasAfterAppend
异常; -
replica.lag.time.max.ms
(超过这个时间没有发送请求的话,follower 将从 isr 中移除), num.replica.fetchers; -
replica.fetch.response.max.bytes
; -
zookeeper.session.timeout.ms
= 30s; -
num.io.threads
:默认为8,KafkaRequestHandlerPool 的大小。
Kafka 相关资源的评估
集群评估
-
Broker 评估
-
每个 Broker 的 Partition 数不应该超过2k;
-
控制 partition 大小(不要超过25GB);
-
集群评估(Broker 的数量根据以下条件配置)
-
数据保留时间;
-
集群的流量大小;
-
集群扩容:
-
磁盘使用率应该在 60% 以下;
-
网络使用率应该在 75% 以下;
-
集群监控
-
保持负载均衡;
-
确保 topic 的 partition 均匀分布在所有 Broker 上;
-
确保集群的阶段没有耗尽磁盘或带宽。
Broker 监控
-
Partition 数:kafka.server:type=ReplicaManager,name=PartitionCount;
-
Leader 副本数:kafka.server:type=ReplicaManager,name=LeaderCount;
-
ISR 扩容/缩容率:kafka.server:type=ReplicaManager,name=IsrExpandsPerSec;
-
读写速率:Message in rate/Byte in rate/Byte out rate;
-
网络请求的平均空闲率:NetworkProcessorAvgIdlePercent;
-
请求处理平均空闲率:RequestHandlerAvgIdlePercent。
Topic 评估
-
partition 数
-
Partition 数应该至少与最大 consumer group 中 consumer 线程数一致;
-
对于使用频繁的 topic,应该设置更多的 partition;
-
控制 partition 的大小(25GB 左右);
-
考虑应用未来的增长(可以使用一种机制进行自动扩容);
-
使用带 key 的 topic;
-
partition 扩容:当 partition 的数据量超过一个阈值时应该自动扩容(实际上还应该考虑网络流量)。
合理地设置 partition
-
根据吞吐量的要求设置 partition 数:
-
假设 Producer 单 partition 的吞吐量为 P;
-
consumer 消费一个 partition 的吞吐量为 C;
-
而要求的吞吐量为 T;
-
那么 partition 数至少应该大于 T/P、T/c 的最大值;
-
更多的 partition,意味着:
-
更多的 fd;
-
可能增加 Unavailability(可能会增加不可用的时间);
-
可能增加端到端的延迟;
-
client 端将会使用更多的内存。
关于 Partition 的设置可以参考这篇文章 https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster ,这里简单讲述一下,Partition 的增加将会带来以下几个优点和缺点:
-
增加吞吐量:对于 consumer 来说,一个 partition 只能被一个 consumer 线程所消费,适当增加 partition 数,可以增加 consumer 的并发,进而增加系统的吞吐量;
-
需要更多的 fd:对于每一个 segment,在 broker 都会有一个对应的 index 和实际数据文件,而对于 Kafka Broker,它将会对于每个 segment 每个 index 和数据文件都会打开相应的 file handle(可以理解为 fd),因此,partition 越多,将会带来更多的 fd;
-
可能会增加数据不可用性(主要是指增加不可用时间):主要是指 broker 宕机的情况,越多的 partition 将会意味着越多的 partition 需要 leader 选举(leader 在宕机这台 broker 的 partition 需要重新选举),特别是如果刚好 controller 宕机,重新选举的 controller 将会首先读取所有 partition 的 metadata,然后才进行相应的 leader 选举,这将会带来更大不可用时间;
-
可能增加 End-to-end 延迟:一条消息只有其被同步到 isr 的所有 broker 上后,才能被消费,partition 越多,不同节点之间同步就越多,这可能会带来毫秒级甚至数十毫秒级的延迟;
-
Client 将会需要更多的内存:Producer 和 Consumer 都会按照 partition 去缓存数据,每个 partition 都会带来数十 KB 的消耗,partition 越多, Client 将会占用更多的内存。
Producer 的相关配置、性能调优及监控
Quotas
-
避免被恶意 Client 攻击,保证 SLA;
-
设置 produce 和 fetch 请求的字节速率阈值;
-
可以应用在 user、client-id、或者 user 和 client-id groups;
-
Broker 端的 metrics 监控:throttle-rate、byte-rate;
-
replica.fetch.response.max.bytes
:用于限制 replica 拉取请求的内存使用; -
进行数据迁移时限制贷款的使用,
kafka-reassign-partitions.sh -- -throttle option
。
Kafka Producer
-
使用 Java 版的 Client;
-
使用
kafka-producer-perf-test.sh
测试你的环境; -
设置内存、CPU、batch 压缩;
-
batch.size:该值设置越大,吞吐越大,但延迟也会越大;
-
linger.ms:表示 batch 的超时时间,该值越大,吞吐越大、但延迟也会越大;
-
max.in.flight.requests.per.connection
:默认为5,表示 client 在 blocking 之前向单个连接(broker)发送的未确认请求的最大数,超过1时,将会影响数据的顺序性; -
compression.type
:压缩设置,会提高吞吐量; -
acks
:数据 durability 的设置; -
避免大消息
-
会使用更多的内存;
-
降低 Broker 的处理速度;
性能调优
-
如果吞吐量小于网络带宽
-
增加线程;
-
提高 batch.size;
-
增加更多 producer 实例;
-
增加 partition 数;
-
设置 acks=-1 时,如果延迟增大:可以增大
num.replica.fetchers
(follower 同步数据的线程数)来调解; -
跨数据中心的传输:增加 socket 缓冲区设置以及 OS tcp 缓冲区设置。
Prodcuer 监控
-
batch-size-avg
-
compression-rate-avg
-
waiting-threads
-
buffer-available-bytes
-
record-queue-time-max
-
record-send-rate
-
records-per-request-avg
Kafka Consumer 配置、性能调优及监控
Kafka Consumer
-
使用
kafka-consumer-perf-test.sh
测试环境; -
吞吐量问题:
-
partition 数太少;
-
OS page cache:分配足够的内存来缓存数据;
-
应用的处理逻辑;
-
offset topic(
__consumer_offsets
) -
offsets.topic.replication.factor
:默认为3; -
offsets.retention.minutes
:默认为1440,即 1day;
– MonitorISR,topicsize; -
offset commit较慢:异步 commit 或 手动 commit。
Consumer 配置
-
fetch.min.bytes
、fetch.max.wait.ms
; -
max.poll.interval.ms
:调用poll()
之后延迟的最大时间,超过这个时间没有调用poll()
的话,就会认为这个 consumer 挂掉了,将会进行 rebalance; -
max.poll.records
:当调用poll()
之后返回最大的 record 数,默认为500; -
Consumer Rebalance
– check timeouts
– check processing times/logic
– GC Issues -
网络配置;
Consumer 监控
consumer 是否跟得上数据的发送速度。
-
Consumer Lag:consumer offset 与 the end of log(partition 可以消费的最大 offset) 的差值;
-
监控
-
metric 监控:records-lag-max;
-
通过
bin/kafka-consumer-groups.sh
查看; -
用于 consumer 监控的 LinkedIn’s Burrow;
-
减少 Lag
-
分析 consumer:是 GC 问题还是 Consumer hang 住了;
-
增加 Consumer 的线程;
-
增加分区数和 consumer 线程;
如何保证数据不丢
这个是常用的配置,
block.on.buffer.full
:默认设置为 false,当达到内存设置时,可能通过 block 停止接受新的 record 或者抛出一些错误,默认情况下,Producer 将不会抛出 BufferExhaustException,而是当达到 max.block.ms
这个时间后直接抛出 TimeoutException。设置为 true 的意义就是将 max.block.ms
设置为 Long.MAX_VALUE,未来版本中这个设置将被遗弃,推荐设置 max.block.ms
。
相关推荐
此外,文档中提供的百度网盘地址是学习资源的获取路径,其中包含的“自学全套免费网盘资料”可能包括了视频教程、书籍电子版、项目源码和面试题库等内容,对于自学Java的学习者而言具有很高的参考价值。 根据以上...
18. **中间件的理解**:对于Java后端开发者而言,中间件是支撑业务逻辑运行的重要组件,如Dubbo是分布式服务框架,MQ是消息队列系统,Redis是内存数据库,kafka是分布式流处理平台,zk是分布式协调服务。 19. **...
尚硅谷的Spring Boot全套视频课程旨在通过深入浅出的方式,帮助学习者掌握这个强大的框架。 首先,Spring Boot的核心特性包括: 1. **自动配置**:基于`@EnableAutoConfiguration`注解,Spring Boot会根据项目依赖...
内容概要:本文详细介绍了利用C++编程和Comsol软件进行锂电池内部枝晶生长过程的多物理场耦合仿真。首先探讨了枝晶生长对浓度场、电场、温度场以及应力场的敏感性,并展示了相应的数学模型和C++代码实现。接着讨论了采用元胞自动机(CA)和格子玻尔兹曼方法(LBM)来模拟枝晶的非均匀生长特性,特别是通过引入偏心正方算法改进了传统CA模型的方向局限性。此外,文中还涉及了如何将多种物理场(如浓度场、电场、温度场、应力场和流场)耦合在一起,形成完整的多物理场仿真系统。最后,作者分享了一些实用的经验和技术细节,比如参数调整技巧、避免常见错误的方法等。 适合人群:从事锂电池研究的专业人士,尤其是对电池安全性和性能优化感兴趣的科研工作者和技术开发者。 使用场景及目标:适用于希望深入了解锂电池内部枝晶生长机制的研究人员,旨在帮助他们构建更加精确的仿真模型,从而更好地理解和解决枝晶引起的电池安全隐患。 其他说明:文章不仅提供了理论分析,还包括具体的代码实例,便于读者动手实践。同时强调了多物理场耦合的重要性,指出这是提高仿真精度的关键因素之一。
# 基于STM32F10x微控制器的综合驱动库 ## 项目简介 本项目是一个基于STM32F10x系列微控制器的综合驱动库,旨在为开发者提供一套全面、易于使用的API,用于快速搭建和配置硬件资源,实现高效、稳定的系统功能。项目包含了STM32F10x系列微控制器的基本驱动和常用外设(如GPIO、SPI、Timer、RTC、ADC、CAN、DMA等)的驱动程序。 ## 项目的主要特性和功能 1. 丰富的外设驱动支持支持GPIO、SPI、Timer、RTC、ADC、CAN、DMA等外设的初始化、配置、读写操作和中断处理。 2. 易于使用的API接口提供统一的API接口,简化外设操作和配置,使开发者能够专注于应用程序逻辑开发。 3. 全面的时钟管理功能支持系统时钟、AHB时钟、APB时钟的生成和配置,以及时钟源的选择和配置。 4. 电源管理功能支持低功耗模式、电源检测和备份寄存器访问,帮助实现节能和延长电池寿命。
# 基于Python和TensorFlow的甲骨文识别系统 ## 项目简介 本项目是一个基于Python和TensorFlow的甲骨文识别系统,旨在利用深度学习技术,尤其是胶囊网络(Capsule Network)来识别甲骨文图像。项目包括数据集准备、模型构建、训练、测试以及评估等关键步骤。 ## 主要特性和功能 1. 数据准备项目提供了数据集的下载、预处理以及分割为训练集、验证集和测试集的功能。 2. 模型构建实现了基于胶囊网络的甲骨文识别模型,包括基本的CapsNet模型、分布式CapsNet模型以及支持多任务学习的CapsNet模型。 3. 训练与测试提供了训练模型、评估模型性能以及可视化训练过程的功能。 4. 性能评估通过测试集评估模型的识别准确率,并提供了测试结果的详细分析。 ## 安装使用步骤 1. 环境准备安装Python和TensorFlow,以及相关的依赖库。 2. 数据准备 下载MNIST或CIFAR数据集
# 基于C++的Arduino BLE设备交互库 ## 项目简介 本项目是一个用于与BLE(蓝牙低能耗)设备交互的Arduino库。它为使用Arduino平台的开发者提供了与BLE设备通信所需的功能,能让开发者更轻松地将BLE设备集成到自己的项目中。 ## 项目的主要特性和功能 1. 初始化BLE设备调用begin()方法,可初始化BLE设备并启动通信。 2. 扫描和连接设备利用scan()方法扫描附近的BLE设备,通过connect()方法连接特定设备。 3. 读取和写入数据使用read()和write()方法,实现从BLE设备读取数据或向其写入数据。 4. 处理事件通过setEventHandler()方法注册回调函数,处理BLE事件,如连接成功、断开连接等。 5. 控制广播和广告使用advertise()和stopAdvertise()方法,控制BLE设备的广播和广告功能。
内容概要:本文详细探讨了利用ANSYS Fluent对增材制造中激光熔覆同轴送粉技术的熔池演变进行模拟的方法。文中介绍了几个关键技术模块,包括高斯旋转体热源、VOF梯度计算、反冲压力和表面张力的UDF(用户自定义函数)实现。通过这些模块,可以精确模拟激光能量输入、熔池内的多相流行为以及各种物理现象如表面张力和反冲压力的作用。此外,文章展示了如何通过调整参数(如激光功率)来优化制造工艺,并提供了具体的代码示例,帮助读者理解和实现这些复杂的物理过程。 适合人群:从事增材制造领域的研究人员和技术人员,尤其是那些希望深入了解激光熔覆同轴送粉技术背后的物理机制并掌握相应模拟工具的人群。 使用场景及目标:适用于需要对增材制造过程中的熔池演变进行深入研究的情景,旨在提高制造质量和效率。具体目标包括但不限于:理解熔池内部的温度场和流场分布规律,评估不同参数对熔池形态的影响,预测可能出现的问题并提出解决方案。 其他说明:文章不仅提供了详细的理论背景介绍,还包括了大量的代码片段和实例解析,使读者能够在实践中更好地应用所学知识。同时,通过对实际案例的讨论,揭示了增材制造过程中的一些常见挑战及其应对策略。
内容概要:本文详细介绍了在COMSOL中构建三维激光切割过程中涉及的热流耦合模型的方法和技术要点。主要内容涵盖水平集物理场用于追踪材料界面变形、流体传热用于描述熔池流动和热传导的相互作用以及层流分析用于处理熔融金属流动。文中提供了具体的MATLAB代码片段,展示了如何设置材料属性、热源加载、熔融金属流动方程、求解器配置及后处理步骤。此外,还讨论了常见问题及其解决方案,如界面过渡区厚度的选择、热源加载的技术细节、表面张力系数的设置、求解器配置的技巧等。 适合人群:从事激光切割工艺研究、仿真建模的研究人员和工程师,尤其是熟悉COMSOL Multiphysics平台的用户。 使用场景及目标:适用于希望深入了解并优化激光切割过程中的热流耦合仿真的研究人员和工程师。主要目标是提高仿真精度,优化切割参数,改善切割质量和效率。 其他说明:文章不仅提供理论指导,还包括大量实用的操作建议和调试技巧,帮助用户更好地理解和应用COMSOL进行复杂物理现象的模拟。
# 基于PythonDjango和Vue的美多电商平台 ## 项目简介 本项目是一个基于PythonDjango和Vue的B2C电商平台,名为美多商城,专注于销售自营商品。系统前台具备商品列表展示、商品详情查看、商品搜索、购物车管理、订单支付、评论功能以及用户中心等核心业务功能系统后台涵盖商品管理、运营管理、用户管理和系统设置等系统管理功能。同时,项目新增了统一异常处理、状态码枚举类等设计,避免使用魔法值,提升了项目的可扩展性和可维护性。 ## 项目的主要特性和功能 ### 前台功能 1. 商品相关提供商品列表展示、商品详情查看以及商品搜索功能,方便用户查找心仪商品。 2. 购物车支持用户添加、管理商品,方便集中结算。 3. 订单支付集成阿里支付,支持订单创建、支付及支付结果处理。 4. 评论用户可对商品进行评价,分享购物体验。 5. 用户中心支持用户注册、登录、密码修改、邮箱验证、地址管理等操作。 ### 后台功能
目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛,目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛,目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛 目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛,目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛,目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛~ 目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛,目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛,目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛 目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛,目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛,目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛 目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛,目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛,目前最火的C/C++和Java蓝桥杯竞赛练习题,充分备战竞赛
# 基于Python和Nonebot框架的HoshinoBot ## 项目简介 HoshinoBot是一个基于Python和Nonebot框架的开源QQ机器人项目,专为公主连结Re:Dive(PCR)和舰队收藏(KanColle)玩家设计。它提供了丰富的功能,旨在增强玩家的游戏体验和社区互动。 ## 项目的主要特性和功能 转蛋模拟支持单抽、十连抽和抽一井功能,模拟游戏中的抽卡体验。 竞技场解法查询提供竞技场解法查询,支持按服务器过滤,并允许用户反馈点赞或点踩。 竞技场结算提醒自动提醒竞技场结算时间,帮助玩家及时参与。 公会战管理提供详细的公会战管理功能,包括成员管理、战斗记录等。 Rank推荐表搬运自动搬运和更新Rank推荐表,帮助玩家选择最佳角色。 常用网址速查提供常用游戏网址的快速查询,方便玩家访问。 官方推特转发自动转发官方推特消息,确保玩家不会错过任何重要更新。 官方四格推送定期推送官方四格漫画,增加玩家的娱乐性。
图书管理小项目完结(完善新增页面)
# 基于Arduino的超声波距离测量系统 ## 项目简介 本项目是一个基于Arduino平台的超声波距离测量系统。系统包含四个超声波传感器(SPS)模块,用于测量与前方不同方向物体的距离,并通过蜂鸣器(Buzz)模块根据距离范围给出不同的反应。 ## 项目的主要特性和功能 1. 超声波传感器(SPS)模块每个模块包括一个超声波传感器和一个蜂鸣器。传感器用于发送超声波并接收回波,通过计算超声波旅行时间来确定与物体的距离。 2. 蜂鸣器(Buzz)模块根据超声波传感器测量的距离,蜂鸣器会给出不同的反应,如延时发声。 3. 主控制器(Arduino)负责控制和管理所有传感器和蜂鸣器模块,通过串行通信接收和发送数据。 4. 任务管理通过主控制器(Arduino)的 loop() 函数持续执行传感器任务(Task),包括测距、数据处理和蜂鸣器反应。 ## 安装使用步骤 1. 硬件连接
题目:基于单片机的幼儿安全监控报警系统设计 主控:STM32F103C8T6 显示:OLED ESP32 红外对管 火焰传感器 烟雾传感器 按键 继电器+水泵 蜂鸣器+led小灯 电源 1.实时监控:系统能够实时监控幼儿的活动区域,了解幼儿的活动情况。 2.入侵检测:系统可以设置安全区域,当有陌生人或动物进入该区域时, 系统会立即发出警报。 3.紧急呼叫:幼儿在遇到紧急情况时,可以通过按下紧急呼叫按钮触发声光报警, 通知教师或监护人。 4.远程监控与通知:教师或监护人可以通过手机远程监控幼儿的安全状况 5.火灾报警:当检测到着火点且烟雾浓度高于阈值,启动声光报警并自动打开水泵抽水进行灭火
内容概要:该MATLAB函数 `robot_calc.m` 实现了一个12维机器人系统的动力学模型计算,主要用于模拟机器人的运动状态。它基于拉格朗日动力学方程,通过质量矩阵 `M`、科里奥利力/向心力矩阵 `N`、约束矩阵 `C` 和输入矩阵 `E` 描述机器人的运动方程。函数接收当前时间和状态向量作为输入,输出状态导数,包括速度和加速度。控制输入通过外部扭矩 `tau` 模拟,数值求解采用伪逆方法确保稳定性。核心步骤包括参数定义、矩阵计算、动力学方程求解和状态导数输出。; 适合人群:具备一定MATLAB编程基础和机器人动力学理论知识的研究人员、工程师和高校学生。; 使用场景及目标:①机器人控制仿真,测试控制算法(如PID、轨迹跟踪)的表现;②运动规划,模拟机器人在给定扭矩下的运动轨迹;③参数优化,通过调整物理参数优化机器人动态性能。; 其他说明:需要注意的是,当前扭矩 `tau` 是硬编码的,实际应用中应替换为控制器的输出。此外,代码中部分参数单位不一致,需确保单位统一。建议改进方面包括动态输入扭矩、添加可视化功能和参数化管理物理参数。
内容概要:本文介绍了一种创新的光伏数据分类预测方法,采用CPO(冠豪猪优化算法)、Transformer和LSTM三种技术相结合的方式。首先进行数据预处理,包括数据加载、标准化和构建数据迭代器。然后详细介绍了模型架构,包括Transformer编码器捕捉特征间的关系,LSTM处理时间序列模式,以及CPO用于优化关键参数如隐藏层节点数、学习率等。实验结果显示,该模型在处理突变数据方面表现出色,特别是在光伏功率预测和异常检测任务中,相比传统LSTM模型有显著提升。 适合人群:具有一定机器学习基础的研究人员和技术开发者,尤其是关注光伏预测和时序数据分析的人士。 使用场景及目标:适用于需要处理复杂时序数据的任务,如光伏功率预测、电力负荷预测、故障诊断等。主要目标是提高预测准确性,尤其是在面对突变数据时的表现。 其他说明:文中提供了详细的代码示例和优化技巧,如数据预处理、模型结构调整、早停机制等。此外,还给出了可视化工具和一些实用的避坑指南,帮助初学者更好地理解和应用这一模型。
内容概要:本文详细介绍了如何利用Matlab对传统人工势场法(APF)进行改进,以解决其在路径规划中存在的局部极小值和目标不可达问题。主要改进措施包括重构斥力函数,在靠近目标时使斥力随目标距离衰减,以及引入模拟退火算法用于跳出局部极小值。文中提供了详细的代码示例,展示了传统APF与改进版APF在不同障碍物布局下的表现对比,验证了改进算法的有效性和鲁棒性。 适合人群:具有一定编程基础并熟悉Matlab环境的研究人员、工程师和技术爱好者。 使用场景及目标:适用于需要进行路径规划的机器人导航系统或其他自动化设备,旨在提高路径规划的成功率和效率,特别是在复杂环境中。 其他说明:文章不仅提供了理论解释,还有具体的代码实现和测试案例,帮助读者更好地理解和应用改进后的APF算法。同时,附带的场力可视化工具使得势场分布更加直观易懂。
内容概要:本文介绍了一款用于将Simulink模型自动转换为PDF文档的脚本工具。该工具能够自动化生成文档,提取模型中各模块的注释并转化为PDF中的说明文字,整合来自Excel的数据并生成表格,分模块分层打印模型图片,最终生成结构清晰的PDF文档。通过递归遍历模型结构,确保文档的章节结构与模型层次保持一致。此外,还包括自动检测未注释模块等功能,极大提高了文档生成效率和准确性。 适合人群:从事Simulink模型开发和维护的工程师,尤其是那些需要频繁编写和更新模型文档的人员。 使用场景及目标:适用于需要快速生成高质量模型文档的场合,如项目交付、技术评审等。主要目标是提高文档编写效率,减少手动操作带来的错误,确保文档与模型的一致性。 其他说明:该工具采用MATLAB和Python混合开发,支持Windows和Linux平台,可通过持续集成(CI/CD)管道自动化运行,进一步提升工作效率。
# 基于Python和树莓派的智能语音闹钟 ## 项目简介 “RaspberryClock”是一个基于树莓派4B的智能语音闹钟项目,使用Python 3.8开发。该项目集成了时间显示、温湿度监测、天气查询、语音提醒以及与图灵机器人对话等功能,旨在为用户提供一个功能丰富且易于使用的智能闹钟解决方案。 ## 项目的主要特性和功能 1. 时间显示实时显示当前时间。 2. 温湿度监测通过DHT11温湿度传感器读取并显示环境温湿度数据。 3. 天气查询通过API查询并显示当前天气信息。 4. 语音提醒支持语音播放和录音功能,用户可以设置语音提醒。 5. 与图灵机器人对话支持语音输入并与图灵机器人进行对话。 6. 用户界面使用Qt库创建友好的用户界面,操作便捷。 ## 安装使用步骤 假设用户已经安装了树莓派和Python环境,以下是项目的安装和使用步骤 1. 下载项目将项目文件下载并解压到树莓派的指定目录。