欢迎关注我的公众号:石杉的架构笔记(ID:shishan100)程序员
周一至周五早8点半!精品技术文章准时送上!面试
精品学习资料获取通道,参见文末算法
一、到底什么是链接?数据库
二、为何每次发送请求都要创建链接?缓存
三、长链接模式下须要耗费大量资源性能优化
四、Kafka遇到的问题:应对大量客户端链接网络
五、Kafka的架构实践:Reactor多路复用架构
六、优化后的架构是如何支撑大量链接的并发
“ 这篇文章,给你们聊聊:若是你设计一个系统须要支撑百万用户链接,应该如何来设计其高并发请求处理架构?分布式
假如说如今你有一个系统,他须要链接不少不少的硬件设备,这些硬件设备都要跟你的系统来通讯。
那么,怎么跟你的系统通讯呢?
首先,他必定会跟你的系统创建链接,而后会基于那个链接发送请求给你的系统。
接着你的系统会返回响应给那个系统,最后是你们一块儿把链接给断开,释放掉网络资源。
因此咱们来看一下下面的那个图,感觉一下这个所谓的链接究竟是个什么概念。
可是你们看着上面的那个图,是否是感受有一个很大的问题。
什么问题呢?那就是为啥每次发送请求,都必需要创建一个链接,而后再断开一个链接?
要知道,网络链接的创建和链接涉及到屡次网络通讯,本质是一个比较耗费资源的过程。
因此说我们彻底不必每次发送请求都要创建一次链接,断开一次链接。
咱们彻底能够创建好一个链接,而后设备就不停的发送请求过来,系统就经过那个链接返回响应。
你们彻底能够屡次经过一个链接发送请求和返回响应,这就是所谓的长链接。
也就是说,若是你一个链接创建以后,而后发送请求,接着就断开,那这个链接维持的时间是很短的,这个就是所谓的短链接。
那若是一个设备跟你的系统创建好一个链接,而后接着就不停的经过这个链接发送请求接收响应,就能够避免不停的建立链接和断开链接的开销了。
你们看下面的图,体验一下这个过程。在图里面,两次链接之间,有不少次发送请求和接收响应的过程,这样就能够利用一个链接可是进行屡次通讯了。
可是如今问题又来了,长链接的模式确实是不错的,可是若是说每一个设备都要跟系统长期维持一个链接,那么对于系统来讲就须要搞一个线程,这个线程须要去维护一个设备的长链接,而后经过这个链接跟一个设备不停的通讯,接收人家发送过来的请求,返回响应给人家。
你们看下面的图,每一个设备都要跟系统维持一个链接,那么对于每一个设备的链接,系统都会有一个独立的线程来维护这个链接。
由于你必需要有一个线程不停的尝试从网络链接中读取请求,接着要处理请求,最后还要返回响应给设备。
那么这种模式有什么缺点呢?
缺点是很显而易见的,假如说此时你有上百万个设备要跟你的系统进行链接,假设你的系统作了集群部署一共有100个服务实例,难道每一个服务实例要维持1万个链接支撑跟1万个设备的通讯?
若是这样的话,每一个服务实例不就是要维持1万个线程来维持1万个链接了吗?你们以为这个事儿靠谱吗?
根据线上的生产经验,通常4核8G的标准服务用的虚拟机,本身开辟的工做线程在一两百个就会让CPU负载很高了,最佳的建议就是在几十个工做线程就差很少。
因此要是指望每一个服务实例来维持上万个线程,那几乎是不可能的,因此这种模式最大的问题就在于这里,无法支撑大量链接。
实际上,对于大名鼎鼎的消息系统Kafka来讲,他也是会面对一样的问题,由于他须要应对大量的客户端链接。
有不少生产者和消费者都要跟Kafka创建相似上面的长链接,而后基于一个链接,一直不停的通讯。
举个例子,好比生产者须要经过一个链接,不停的发送数据给Kafka。而后Kafka也要经过这个链接不停的返回响应给生产者。
消费者也须要经过一个链接不停的从Kafka获取数据,Kafka须要经过这个链接不停的返回数据给消费者。
你们看下面的图,感觉一下Kafka的生产现场。
那假如Kafka就简单的按照这个架构来处理,若是你的公司里有几万几十万个的生产者或者消费者的服务实例,难道Kafka集群就要为了几万几十万个链接来维护这么多的线程吗?
一样,这是不现实的,由于线程是昂贵的资源,不可能在集群里使用那么多的线程。
针对这个问题,大名鼎鼎的Kafka采用的架构策略是Reactor多路复用模型。
简单来讲,就是搞一个acceptor线程,基于底层操做系统的支持,实现链接请求监听。
若是有某个设备发送了创建链接的请求过来,那么那个线程就把这个创建好的链接交给processor线程。
每一个processor线程会被分配N多个链接,一个线程就能够负责维持N多个链接,他一样会基于底层操做系统的支持监听N多链接的请求。
若是某个链接发送了请求过来,那么这个processor线程就会把请求放到一个请求队列里去。
接着后台有一个线程池,这个线程池里有工做线程,会从请求队列里获取请求,处理请求,接着将请求对应的响应放到每一个processor线程对应的一个响应队列里去。
最后,processor线程会把本身的响应队列里的响应发送回给客户端。
说了这么多,仍是来一张图,你们看下面的图,就能够理解上述整个过程了。
那么上面优化后的那套架构,是如何支撑大量链接的呢?
其实很简单。这里最关键的一个因素,就是processor线程是一我的维持N个线程,基于底层操做系统的特殊机制的支持,一我的能够监听N个链接的请求。
这是极为关键的一个步骤,就仅此一个步骤就可让一个线程支持多个链接了,不须要一个链接一个线程来支持。
并且那个processor线程仅仅是接收请求和发送响应,全部的请求都会入队列排队,交给后台线程池来处理。
好比说按照100万链接来计算,若是有100台机器来处理,按照老的模式,每台机器须要维持1万个线程来处理1万个链接。
可是若是按照这种多路复用的模式,可能就好比10个processor + 40个线程的线程池,一共50个线程就能够上万链接。
在这种模式下,每台机器有限的线程数量能够抗住大量的链接。
所以实际上咱们在设计这种支撑大量链接的系统的时候,彻底能够参考这种架构,设计成多路复用的模式,用几十个线程处理成千上万个链接,最终实现百万链接的处理架构。
End
(封面,图源网络,侵权删除)
扫描下方二维码,备注:“资料”,获取更多“秘制” 精品学习资料
一大波微服务、分布式、高并发、高可用的原创系列文章正在路上
欢迎扫描下方二维码,持续关注:
石杉的架构笔记(id:shishan100)
十余年BAT架构经验倾囊相授
推荐阅读:
二、【双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问?
三、【性能优化之道】每秒上万并发下的Spring Cloud参数优化实战
六、大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问
七、【性能优化的秘密】Hadoop如何将TB级大文件的上传性能优化上百倍
九、【坑爹呀!】最终一致性分布式事务如何保障实际生产中99.99%高可用?
十一、【眼前一亮!】看Hadoop底层算法如何优雅的将大规模集群性能提高10倍以上?
1六、亿级流量系统架构之如何设计全链路99.99%高可用架构
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九、亿级流量系统架构之如何保证百亿流量下的数据一致性(下)?
40、互联网面试必杀:如何保证消息中间件全链路数据100%不丢失(1)
4一、互联网面试必杀:如何保证消息中间件全链路数据100%不丢失(2)
4三、高并发场景下,如何保证生产者投递到消息中间件的消息不丢失?
4五、从团队自研的百万并发中间件系统的内核设计看Java并发性能优化
4六、【非广告,纯干货】英语差的程序员如何才能无障碍阅读官方文档?
4七、若是20万用户同时访问一个热点缓存,如何优化你的缓存架构?
4八、【非广告,纯干货】中小公司的Java工程师应该如何逆袭冲进BAT?
50、【金三银四跳槽季】Java工程师如何在1个月内作好面试准备?
5一、【offer收割机必备】我简历上的Java项目都好low,怎么办?
5二、【offer去哪了】我一连面试了十个Java岗,通通石沉大海!
5三、高阶Java开发必备:分布式系统的惟一id生成算法你了解吗?
5四、支撑日活百万用户的高并发系统,应该如何设计其数据库架构?
5五、尴尬了!Spring Cloud微服务注册中心Eureka 2.x中止维护了咋办?