kafka 八年后端攻城狮的感悟

88 阅读2分钟

最近复习kafka,看国内一些八股文章和培训视频,确实应对面试没问题,头头是道。但是结合实际测试,会发现还是有些不一致。也有些问题是自己思考得来,然后测试、看源码有所感悟。以下列举几点:

1. kafka发送消息时,不是立刻发送,而是将消息缓存起来,达到一定数量才发送 (错误观点,八股文常提到)

linger.ms:控制 Producer 等待 Producer Batch 满的时间。默认值为 0 毫秒。

linger.ms为0,那么消息默认都是立刻发送,并不会缓存。实测也是会立刻发送。当然如果linger.ms配置大于0,就会有缓存效果。

2.消费者是并发消费还是轮询消费?

image.png 代码应该是这里,轮询消费。kafka为了提升性能,减少io,默认会批量拉500条消息下来,这500条再在本地轮询消费。我们知道kafka在单分区可以保证消息顺序性,也可以推测出消费者也是需要轮询消费才能保证顺序性。spring kafka默认是batch方式提交,也就是处理完500条消息后手动提交。

那么,手动提交会不会有消息乱序问题?

很明显,轮询消费的话,不存在乱序问题。

3.replication.factor和min.insync.replicas区别

这两个参数是<<kafka权威指南>>中保证broker不丢失数据的两个参数。

min.insync.replicas:最少同步副本
replication.factor:主题的复制系数(副本数量)。复制系数N需要至少 N 个broker,也就是说我们会有 N 个数据副本,并且它们会占用 N 倍的磁盘空间。

default.replication.factor和min.insync.replicas的区别 default.replication.factor是指分区的总的副本个数,min.insync.replicas是指ISR列表中最少的在线副本的个数(含leader),当在线的副本个数小于min.insync.replicas时,生产者发送消息会失败。default.replication.factor=3,min.insync.replicas=2 表示消息总共有3个副本,当在线的副本大于或者等于2时,生产者可以继续发送消息,能够容忍1个备份不可用,否则不能发送消息。

如有问题,欢迎各位大佬指正哈~~ 也欢迎各位大佬多多交流!