面试官:消息中间件如何实现每秒几十万的高并发写入?【石杉的架构笔记】

欢迎关注我的公众号:石杉的架构笔记(ID:shishan100)程序员

周一至周五早8点半!精品技术文章准时送上!面试

精品学习资料获取通道,参见文末
算法

目录

一、页缓存技术 + 磁盘顺序写数据库

二、零拷贝技术缓存

三、最后的总结性能优化


这篇文章来聊一下Kafka的一些架构设计原理,这也是互联网公司面试时很是高频的技术考点。网络

Kafka是高吞吐低延迟的高并发、高性能的消息中间件,在大数据领域有极为普遍的运用。配置良好的Kafka集群甚至能够作到每秒几十万、上百万的超高并发写入。架构

那么Kafka究竟是如何作到这么高的吞吐量和性能的呢?这篇文章咱们来一点一点说一下。并发


一、页缓存技术 + 磁盘顺序写

首先Kafka每次接收到数据都会往磁盘上去写,以下图所示。分布式

那么在这里咱们不由有一个疑问了,若是把数据基于磁盘来存储,频繁的往磁盘文件里写数据,这个性能会不会不好?你们确定都以为磁盘写性能是极差的。

没错,要是真的跟上面那个图那么简单的话,那确实这个性能是比较差的。

可是实际上Kafka在这里有极为优秀和出色的设计,就是为了保证数据写入性能,首先Kafka是基于操做系统的页缓存来实现文件写入的。

操做系统自己有一层缓存,叫作page cache,是在内存里的缓存,咱们也能够称之为os cache,意思就是操做系统本身管理的缓存。

你在写入磁盘文件的时候,能够直接写入这个os cache里,也就是仅仅写入内存中,接下来由操做系统本身决定何时把os cache里的数据真的刷入磁盘文件中。

仅仅这一个步骤,就能够将磁盘文件写性能提高不少了,由于其实这里至关因而在写内存,不是在写磁盘,你们看下图。

接着另一个就是kafka写数据的时候,很是关键的一点,他是以磁盘顺序写的方式来写的。也就是说,仅仅将数据追加到文件的末尾,不是在文件的随机位置来修改数据。

普通的机械磁盘若是你要是随机写的话,确实性能极差,也就是随便找到文件的某个位置来写数据。

可是若是你是追加文件末尾按照顺序的方式来写数据的话,那么这种磁盘顺序写的性能基本上能够跟写内存的性能自己也是差很少的。

因此你们就知道了,上面那个图里,Kafka在写数据的时候,一方面基于了os层面的page cache来写数据,因此性能很高,本质就是在写内存罢了。

另一个,他是采用磁盘顺序写的方式,因此即便数据刷入磁盘的时候,性能也是极高的,也跟写内存是差很少的。

基于上面两点,kafka就实现了写入数据的超高性能。

那么你们想一想,假如说kafka写入一条数据要耗费1毫秒的时间,那么是否是每秒就是能够写入1000条数据?

可是假如kafka的性能极高,写入一条数据仅仅耗费0.01毫秒呢?那么每秒是否是就能够写入10万条数?

因此要保证每秒写入几万甚至几十万条数据的核心点,就是尽最大可能提高每条数据写入的性能,这样就能够在单位时间内写入更多的数据量,提高吞吐量。


二、零拷贝技术

说完了写入这块,再来谈谈消费这块。

你们应该都知道,从Kafka里咱们常常要消费数据,那么消费的时候实际上就是要从kafka的磁盘文件里读取某条数据而后发送给下游的消费者,以下图所示。

那么这里若是频繁的从磁盘读数据而后发给消费者,性能瓶颈在哪里呢?

假设要是kafka什么优化都不作,就是很简单的从磁盘读数据发送给下游的消费者,那么大概过程以下所示:

先看看要读的数据在不在os cache里,若是不在的话就从磁盘文件里读取数据后放入os cache。

接着从操做系统的os cache里拷贝数据到应用程序进程的缓存里,再从应用程序进程的缓存里拷贝数据到操做系统层面的Socket缓存里,最后从Socket缓存里提取数据后发送到网卡,最后发送出去给下游消费。

整个过程,以下图所示:

你们看上图,很明显能够看到有两次不必的拷贝吧!

一次是从操做系统的cache里拷贝到应用进程的缓存里,接着又从应用程序缓存里拷贝回操做系统的Socket缓存里。

并且为了进行这两次拷贝,中间还发生了好几回上下文切换,一下子是应用程序在执行,一下子上下文切换到操做系统来执行。

因此这种方式来读取数据是比较消耗性能的。

Kafka为了解决这个问题,在读数据的时候是引入零拷贝技术

也就是说,直接让操做系统的cache中的数据发送到网卡后传输给下游的消费者,中间跳过了两次拷贝数据的步骤,Socket缓存中仅仅会拷贝一个描述符过去,不会拷贝数据到Socket缓存。

你们看下图,体会一下这个精妙的过程:

经过零拷贝技术,就不须要把os cache里的数据拷贝到应用缓存,再从应用缓存拷贝到Socket缓存了,两次拷贝都省略了,因此叫作零拷贝。

对Socket缓存仅仅就是拷贝数据的描述符过去,而后数据就直接从os cache中发送到网卡上去了,这个过程大大的提高了数据消费时读取文件数据的性能。

并且你们会注意到,在从磁盘读数据的时候,会先看看os cache内存中是否有,若是有的话,其实读数据都是直接读内存的。

若是kafka集群通过良好的调优,你们会发现大量的数据都是直接写入os cache中,而后读数据的时候也是从os cache中读。

至关因而Kafka彻底基于内存提供数据的写和读了,因此这个总体性能会极其的高。

说个题外话

,下回有机会给你们说一下Elasticsearch的架构原理,其实ES底层也是大量基于os cache实现了海量数据的高性能检索的,跟Kafka原理相似。


三、最后的总结

经过这篇文章对kafka底层的页缓存技术的使用,磁盘顺序写的思路,以及零拷贝技术的运用,你们应该就明白Kafka每台机器在底层对数据进行写和读的时候采起的是什么样的思路,为何他的性能能够那么高,作到每秒几十万的吞吐量。

这种设计思想对咱们平时本身设计中间件的架构,或者是出去面试的时候,都有很大的帮助。


End

(封面图源网络,侵权删除)

扫描下方二维码,备注:“资料”,获取更多“秘制” 精品学习资料

一大波微服务、分布式、高并发、高可用的原创系列文章正在路上

欢迎扫描下方二维码,持续关注:

石杉的架构笔记(id:shishan100)

十余年BAT架构经验倾囊相授

推荐阅读:

一、拜托!面试请不要再问我Spring Cloud底层原理

二、【双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问?

三、【性能优化之道】每秒上万并发下的Spring Cloud参数优化实战

四、微服务架构如何保障双11狂欢下的99.99%高可用

五、兄弟,用大白话告诉你小白都能听懂的Hadoop架构原理

六、大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问

七、【性能优化的秘密】Hadoop如何将TB级大文件的上传性能优化上百倍

八、拜托,面试请不要再问我TCC分布式事务的实现原理!

九、【坑爹呀!】最终一致性分布式事务如何保障实际生产中99.99%高可用?

十、拜托,面试请不要再问我Redis分布式锁的实现原理!

十一、【眼前一亮!】看Hadoop底层算法如何优雅的将大规模集群性能提高10倍以上?

十二、亿级流量系统架构之如何支撑百亿级数据的存储与计算

1三、亿级流量系统架构之如何设计高容错分布式计算系统

1四、亿级流量系统架构之如何设计承载百亿流量的高性能架构

1五、亿级流量系统架构之如何设计每秒十万查询的高并发架构

1六、亿级流量系统架构之如何设计全链路99.99%高可用架构

1七、七张图完全讲清楚ZooKeeper分布式锁的实现原理

1八、大白话聊聊Java并发面试问题之volatile究竟是什么?

1九、大白话聊聊Java并发面试问题之Java 8如何优化CAS性能?

20、大白话聊聊Java并发面试问题之谈谈你对AQS的理解?

2一、大白话聊聊Java并发面试问题之公平锁与非公平锁是啥?

2二、大白话聊聊Java并发面试问题之微服务注册中心的读写锁优化

2三、互联网公司的面试官是如何360°无死角考察候选人的?(上篇)

2四、互联网公司面试官是如何360°无死角考察候选人的?(下篇)

2五、Java进阶面试系列之一:哥们,大家的系统架构中为何要引入消息中间件?

2六、【Java进阶面试系列之二】:哥们,那你说说系统架构引入消息中间件有什么缺点?

2七、【行走的Offer收割机】记一位朋友斩获BAT技术专家Offer的面试经历

2八、【Java进阶面试系列之三】哥们,消息中间件在大家项目里是如何落地的?

2九、【Java进阶面试系列之四】扎心!线上服务宕机时,如何保证数据100%不丢失?

30、一次JVM FullGC的背后,竟隐藏着惊心动魄的线上生产事故!

3一、【高并发优化实践】10倍请求压力来袭,你的系统会被击垮吗?

3二、【Java进阶面试系列之五】消息中间件集群崩溃,如何保证百万生产数据不丢失?

3三、亿级流量系统架构之如何在上万并发场景下设计可扩展架构(上)?

3四、亿级流量系统架构之如何在上万并发场景下设计可扩展架构(中)?

3五、亿级流量系统架构之如何在上万并发场景下设计可扩展架构(下)?

3六、亿级流量架构第二弹:你的系统真的无懈可击吗?

3七、亿级流量系统架构之如何保证百亿流量下的数据一致性(上)

3八、亿级流量系统架构之如何保证百亿流量下的数据一致性(中)?

3九、亿级流量系统架构之如何保证百亿流量下的数据一致性(下)?

40、互联网面试必杀:如何保证消息中间件全链路数据100%不丢失(1)

4一、互联网面试必杀:如何保证消息中间件全链路数据100%不丢失(2

4二、面试大杀器:消息中间件如何实现消费吞吐量的百倍优化?

4三、高并发场景下,如何保证生产者投递到消息中间件的消息不丢失?

4四、兄弟,用大白话给你讲小白都能看懂的分布式系统容错架构

4五、从团队自研的百万并发中间件系统的内核设计看Java并发性能优化

4六、【非广告,纯干货】英语差的程序员如何才能无障碍阅读官方文档?

4七、若是20万用户同时访问一个热点缓存,如何优化你的缓存架构?

4八、【非广告,纯干货】中小公司的Java工程师应该如何逆袭冲进BAT?

4九、拜托,面试请不要再问我分布式搜索引擎的架构原理!

50、【金三银四跳槽季】Java工程师如何在1个月内作好面试准备?

5一、【offer收割机必备】我简历上的Java项目都好low,怎么办?

5二、【offer去哪了】我一连面试了十个Java岗,通通石沉大海!

5三、高阶Java开发必备:分布式系统的惟一id生成算法你了解吗?

5四、支撑日活百万用户的高并发系统,应该如何设计其数据库架构?

5五、尴尬了!Spring Cloud微服务注册中心Eureka 2.x中止维护了咋办?

5六、【Java高阶必备】如何优化Spring Cloud微服务注册中心架构?

做者:石杉的架构笔记 连接:https://juejin.im/post/5c6a9f25518825787e69e70a 来源:掘金 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
相关文章
相关标签/搜索