【生产实践总结】支撑百万链接的系统应该如何设计其高并发架构?【石杉的架构笔记】

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

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

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

目录

一、到底什么是链接?数据库

二、为何每次发送请求都要创建链接?缓存

三、长链接模式下须要耗费大量资源性能优化

四、Kafka遇到的问题:应对大量客户端链接网络

五、Kafka的架构实践:Reactor多路复用架构

六、优化后的架构是如何支撑大量链接的并发


“ 这篇文章,给你们聊聊:若是你设计一个系统须要支撑百万用户链接,应该如何来设计其高并发请求处理架构?分布式


(1)到底什么是链接?

假如说如今你有一个系统,他须要链接不少不少的硬件设备,这些硬件设备都要跟你的系统来通讯。

那么,怎么跟你的系统通讯呢?

首先,他必定会跟你的系统创建链接,而后会基于那个链接发送请求给你的系统。

接着你的系统会返回响应给那个系统,最后是你们一块儿把链接给断开,释放掉网络资源。

因此咱们来看一下下面的那个图,感觉一下这个所谓的链接究竟是个什么概念。



(2)为何每次发送请求都要创建链接?


可是你们看着上面的那个图,是否是感受有一个很大的问题。

什么问题呢?那就是为啥每次发送请求,都必需要创建一个链接,而后再断开一个链接?

要知道,网络链接的创建和链接涉及到屡次网络通讯,本质是一个比较耗费资源的过程。

因此说我们彻底不必每次发送请求都要创建一次链接,断开一次链接。

咱们彻底能够创建好一个链接,而后设备就不停的发送请求过来,系统就经过那个链接返回响应。

你们彻底能够屡次经过一个链接发送请求和返回响应,这就是所谓的长链接。

也就是说,若是你一个链接创建以后,而后发送请求,接着就断开,那这个链接维持的时间是很短的,这个就是所谓的短链接。

那若是一个设备跟你的系统创建好一个链接,而后接着就不停的经过这个链接发送请求接收响应,就能够避免不停的建立链接和断开链接的开销了。

你们看下面的图,体验一下这个过程。在图里面,两次链接之间,有不少次发送请求和接收响应的过程,这样就能够利用一个链接可是进行屡次通讯了。



(3)长链接模式下须要耗费大量线程资源

可是如今问题又来了,长链接的模式确实是不错的,可是若是说每一个设备都要跟系统长期维持一个链接,那么对于系统来讲就须要搞一个线程,这个线程须要去维护一个设备的长链接,而后经过这个链接跟一个设备不停的通讯,接收人家发送过来的请求,返回响应给人家。

你们看下面的图,每一个设备都要跟系统维持一个链接,那么对于每一个设备的链接,系统都会有一个独立的线程来维护这个链接。

由于你必需要有一个线程不停的尝试从网络链接中读取请求,接着要处理请求,最后还要返回响应给设备。


那么这种模式有什么缺点呢?

缺点是很显而易见的,假如说此时你有上百万个设备要跟你的系统进行链接,假设你的系统作了集群部署一共有100个服务实例,难道每一个服务实例要维持1万个链接支撑跟1万个设备的通讯?

若是这样的话,每一个服务实例不就是要维持1万个线程来维持1万个链接了吗?你们以为这个事儿靠谱吗?

根据线上的生产经验,通常4核8G的标准服务用的虚拟机,本身开辟的工做线程在一两百个就会让CPU负载很高了,最佳的建议就是在几十个工做线程就差很少。

因此要是指望每一个服务实例来维持上万个线程,那几乎是不可能的,因此这种模式最大的问题就在于这里,无法支撑大量链接。


(4)Kafka遇到的问题:应对大量客户端链接


实际上,对于大名鼎鼎的消息系统Kafka来讲,他也是会面对一样的问题,由于他须要应对大量的客户端链接。

有不少生产者和消费者都要跟Kafka创建相似上面的长链接,而后基于一个链接,一直不停的通讯。

举个例子,好比生产者须要经过一个链接,不停的发送数据给Kafka。而后Kafka也要经过这个链接不停的返回响应给生产者。

消费者也须要经过一个链接不停的从Kafka获取数据,Kafka须要经过这个链接不停的返回数据给消费者。

你们看下面的图,感觉一下Kafka的生产现场。


那假如Kafka就简单的按照这个架构来处理,若是你的公司里有几万几十万个的生产者或者消费者的服务实例,难道Kafka集群就要为了几万几十万个链接来维护这么多的线程吗?

一样,这是不现实的,由于线程是昂贵的资源,不可能在集群里使用那么多的线程。


(5)Kafka的架构实践:Reactor多路复用


针对这个问题,大名鼎鼎的Kafka采用的架构策略是Reactor多路复用模型。

简单来讲,就是搞一个acceptor线程,基于底层操做系统的支持,实现链接请求监听。

若是有某个设备发送了创建链接的请求过来,那么那个线程就把这个创建好的链接交给processor线程。

每一个processor线程会被分配N多个链接,一个线程就能够负责维持N多个链接,他一样会基于底层操做系统的支持监听N多链接的请求。

若是某个链接发送了请求过来,那么这个processor线程就会把请求放到一个请求队列里去。

接着后台有一个线程池,这个线程池里有工做线程,会从请求队列里获取请求,处理请求,接着将请求对应的响应放到每一个processor线程对应的一个响应队列里去。

最后,processor线程会把本身的响应队列里的响应发送回给客户端。

说了这么多,仍是来一张图,你们看下面的图,就能够理解上述整个过程了。



(6)优化后的架构是如何支撑大量链接的?


那么上面优化后的那套架构,是如何支撑大量链接的呢?

其实很简单。这里最关键的一个因素,就是processor线程是一我的维持N个线程,基于底层操做系统的特殊机制的支持,一我的能够监听N个链接的请求。

这是极为关键的一个步骤,就仅此一个步骤就可让一个线程支持多个链接了,不须要一个链接一个线程来支持。

并且那个processor线程仅仅是接收请求和发送响应,全部的请求都会入队列排队,交给后台线程池来处理。

好比说按照100万链接来计算,若是有100台机器来处理,按照老的模式,每台机器须要维持1万个线程来处理1万个链接。

可是若是按照这种多路复用的模式,可能就好比10个processor + 40个线程的线程池,一共50个线程就能够上万链接。

在这种模式下,每台机器有限的线程数量能够抗住大量的链接。

所以实际上咱们在设计这种支撑大量链接的系统的时候,彻底能够参考这种架构,设计成多路复用的模式,用几十个线程处理成千上万个链接,最终实现百万链接的处理架构。


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微服务注册中心架构?

5七、面试官:消息中间件如何实现每秒几十万的高并发写入?

5八、【非广告,纯干货】三四十岁的大龄程序员,应该如何保持本身的职场竞争力?

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