大家好,欢迎来到IT知识分享网。
kafka作为主流的中间件相必大家都已经很熟了吧。kafka以其超强的性能吸引了一众的粉丝,称霸中间件领域。现在我们就来分析一下王者神器kafka有何与众不同吧
下边这是kafka的一个架构图,
1.kafka的主要开发语言是java和scala,在java圈比较流行。为啥就做kafka,因为当时作者正在看一个叫做kafka的作者写的书,所以就起了这个名字,这个也真是一桩佳话。
kafka是顺序写入,速度和内存速度相当,使用的是顺序i/o
再说下写磁盘的一个好处 1.顺序写磁盘速度>随机写内存 2.第二个是顺序写入jvm的gc效率比较低,内存占用比较大。 3.顺序写入系统启动后,磁盘缓存仍然可用
如果磁盘写满怎么办,不用担心,kafka有着很完备的策略
1.删除基于时间2.而是基于partition的大小
另外一点,kafka利用了mmap(Memory Mapped Files),主要是利用了现代操作系统分页存储来利用内存提高I/O效率,因为kafka的不是实时的写入。完成映射之后你对物理内存的操作会被同步到硬盘上(操作系统在适当的时候)。使用这种方式可以获取很大的I/O提升,省去了用户空间到内核空间复制的开销(调用文件的read会把数据先放到内核空间的内存中,然后再复制到用户空间的内存中。)
读取的做的优化
1.使用sendfile进行zero copy
1、基于sendfile实现Zero Copy调用read函数,文件数据被copy到内核缓冲区
2、read函数返回,文件数据从内核缓冲区copy到用户缓冲区
3、write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区。
4、数据从socket缓冲区copy到相关协议引擎。
进行一次优化之后
1、sendfile系统调用,文件数据被copy至内核缓冲区
2、再从内核缓冲区copy至内核中socket相关的缓冲区
3、最后再socket相关的缓冲区copy到协议引擎
2、批量压缩
批量压缩使得一次性发送的文件数量比较巨大
Kafka速度的秘诀在于,它把所有的消息都变成一个批量的文件,并且进行合理的批量压缩,减少网络IO损耗,通过mmap提高I/O速度,写入数据的时候由于单个Partion是末尾添加所以速度最优;读取数据的时候配合sendfile直接暴力输出。
DMA(Direct Memory Access,直接存储器访问)
kafka重复消费问题?
1、丢包问题:消息推送服务,每天早上,手机上各终端都会给用户推送消息,这时候流量剧增,可能会出现kafka发送数据过快,导致服务器网卡爆满,或者磁盘处于繁忙状态,可能会出现丢包现象。
解决方案:首先对kafka进行限速, 其次启用重试机制,重试间隔时间设置长一些,最后Kafka设置acks=all,即需要相应的所有处于ISR的分区都确认收到该消息后,才算发送成功。
检测方法:使用重放机制,查看问题所在。
2.重复消费最常见的原因:re-balance问题,通常会遇到消费的数据,处理很耗时,导致超过了Kafka的session timeout时间(0.10.x版本默认是30秒),那么就会re-balance重平衡,此时有一定几率offset没提交,会导致重平衡后重复消费。
消息重复消费和消息丢包的解决办法
保证不丢失消息:生产者(ack=all 代表至少成功发送一次) 重试机制
消费者 (offset手动提交,业务逻辑成功处理后,提交offset)
保证不重复消费:落表(主键或者唯一索引的方式,避免重复数据)
业务逻辑处理(选择唯一主键存储到Redis或者mongdb中,先查询是否存在,若存在则不处理;若不存在,先插入Redis或Mongdb,再进行业务逻辑处理)
顺序性:多个producer往topic发送数据可以是无序的,消息存储在broker里面是有序的,但是多个consuemr之间是获取消息是无序的。(kafka只能保证一个pratition里面的消息是顺序的:只有一个poartition,和一个consumer时,消息是有序的)
partition与group以及consumer数量的对应关系以及匹配关系
一个topic 可以配置几个partition,produce发送的消息分发到不同的partition中,consumer接受数据的时候是按照group来接受,kafka确保每个partition只能同一个group中的同一个consumer消费,如果想要重复消费,那么需要其他的组来消费。Zookeerper中保存这每个topic下的每个partition在每个group中消费的offset 。
一个partition下面只有一个分组(group):
同一消息,只会被该gruop,消费不会被重复消费;
一个partition下面多个分组时:
同一消息会被多个分组消费
kafka可能出现的问题?
1.rebalance问题
1、分区个数的增加
2、对Topic的订阅发生变化
3、消费组成员的加入或离开(这个是我们最常遇到)
如何解决
(1)未能及时发送心跳而Rebalance
session.timeout.ms 一次session的连接超时时间
heartbeat.interval.ms 心跳时间,一般为超时时间的1/3,Consumer在被判定为死亡之前,能够发送至少 3 轮的心跳请求
(2)Consumer消费超时而Rebalance
max.poll.interval.ms 每隔多长时间去拉取消息
max.poll.records 一次从拉取出来的数据条数
rebalance的流程
重平衡的完整流程需要消费者端和协调者组件共同参与才能完成。我们先从消费者的视角来审视一下重平衡的流程。
在消费者端,重平衡分为两个步骤:分别是加入组和等待领导消费者(Leader Consumer)分配方案。这两个步骤分别对应两类特定的请求:JoinGroup 请求和 SyncGroup 请求。
要学会处理 rebalance 问题,我们需要先搞清楚 kafaka 消费者配置的四个参数:
session.timeout.ms 设置了超时时间
heartbeat.interval.ms 心跳时间间隔
max.poll.interval.ms 每次消费的处理时间
max.poll.records 每次消费的消息数
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/45324.html