当前位置: 首页 > 科技观察

互联网架构的“高并发”是如何实现的?

时间:2023-03-13 14:53:30 科技观察

最近有很多小伙伴询问消息的“高并发”,而公众号不支持历史文章检索,所以重新优化发布。希望大家有所收获。什么是高并发?高并发是互联网分布式系统架构设计必须考虑的因素之一。通常是指保证系统可以同时并行处理很多请求的设计。高并发相关的常见指标有哪些?响应时间(ResponseTime)吞吐量(Throughput)每秒查询率QPS(QueryPerSecond)并发用户数什么是响应时间?系统响应请求的时间。例如:系统处理一个HTTP请求需要200ms,这200ms就是系统的响应时间。什么是吞吐量?每单位时间处理的请求数。什么是QPS?每秒响应请求数。在互联网领域,这个指标和吞吐量的区别不是那么明显。并发用户数是多少?指同时正常使用系统功能的用户数。例如:在即时通讯系统中,同时在线量在一定程度上代表了系统的并发用户数。如何提高系统的并发能力?互联网分布式架构设计提高并发能力的方法论途径主要有两种:垂直扩展(ScaleUp)水平扩展(ScaleOut)什么是垂直扩展?纵向扩展是指提升单机处理能力,纵向扩展有两种方式:提升单机硬件的性能,例如:增加CPU核心数如32核,升级更好的网卡如10G、升级更好的SSD等硬盘,扩充2T等硬盘容量,扩充128G等系统内存;提高单机架构的性能,例如:使用Cache减少IO次数,使用异步增加单个服务的吞吐量,使用无锁数据结构减少响应时间;,如果预算不是问题的话,强烈推荐使用“增强单机硬件性能”的方法来提升系统的并发能力,因为现阶段公司的策略往往是抢时间做业务开发,而“增强单机硬件的性能”往往是最快的方法。垂直扩张的瓶颈是什么?无论是提升单机硬件的性能,还是单机架构的性能,都存在一个致命的缺陷:单机性能始终是有极限的。如何突破单机的极限?互联网分布式架构设计,高并发***方案或水平扩展。什么是横向扩展?只要增加服务器数量,系统性能就可以线性扩展。常见的互联网分层架构呢?每一层应该如何实现和横向扩展?常见的互联网分布式架构如上,分为:客户端层:典型的调用者是浏览器浏览器或移动应用APP;反向代理层:系统入口,反向代理;站点应用层:实现核心应用逻辑,返回html或json;服务层:如果实现了服务,就有这一层;数据缓存层:缓存加速对存储的访问;data-数据库层:数据库固化数据存储;为了让整个系统支持水平扩展,每一层都必须支持水平扩展。反向代理层如何横向扩展?反向代理层的横向扩展是通过“DNS轮询”实现的:dns-server为一个域名配置多个解析ip,每次DNS解析请求访问dns-server,都会轮询返回这些ip。当nginx成为瓶颈时,只要增加服务器数量,增加nginx服务的部署,增加一个外网ip,就可以扩展反向代理层的性能,达到理论最高并发。站点层如何水平扩展?站点层的水平扩展是通过“nginx”实现的。通过修改nginx.conf,可以设置多个web后端。画外音:以nginx为例,可能是LVS或F5等反向代理。当web后端成为瓶颈时,只要增加服务器数量,增加部署新的web服务,在nginx配置中配置新的web后端,就可以扩展site层的性能,从而实现理论上的最大并发。服务层如何横向扩展?服务层的水平扩展是通过“服务连接池”实现的。当站点层通过RPC-client调用下游服务层RPC-server时,RPC-client中的连接池会与下游服务建立多个连接。当服务成为瓶颈时,只需增加服务器数量并添加新的服务部署即可。通过在RPC-client建立新的下游服务连接,可以扩展服务层的性能,达到理论上的最高并发。画外音:如果需要优雅地自动扩展服务层,可能需要配置中心自动服务发现功能的支持。数据层如何横向扩展?在数据量大的情况下,数据层(缓存、数据库)涉及到数据的水平扩展,将原本存放在一台服务器上的数据(缓存、数据库)水平拆分到不同的服务器上,以此来实现扩展系统性能的目的。互联网数据层中常见的水平分割方式有几种。以数据库为例:1.将各个数据服务按照范围水平拆分,存储一定范围的数据。上图举例:user0库,存储uid范围1-1kwuser1库,存储uid范围1kw-2kw这种方案的优点是:规则简单,服务只需要判断服务就可以路由到对应的存储服务液体范围;数据平衡更好;更容易扩展,随时可以添加一个uid[2kw,3kw]数据服务;缺点是:请求负载不一定均衡,一般来说,新注册用户会比老用户更活跃,大范围的服务请求压力会更大;2.根据hashlevel拆分各个数据库,存储一定keyvaluehash后的部分数据。上图是一个例子:user0库存储偶数uid数据user1库存储奇数uid数据。哈希可以路由到相应的存储服务;数据平衡更好;请求统一性更好;缺点是:不易扩展,扩展一个数据服务,当hash方法发生变化时,可能需要进行数据迁移;通过水平拆分扩展系统性能和通过主从同步读写分离扩展数据库性能的本质区别是什么?画外音:不要混淆这两种解决方案。通过水平拆分扩展数据库性能:每台服务器存储的数据量是总量的1/n,因此单机性能也会得到提升;n台服务器上的数据不重叠,那台服务器上数据的并集就是完整的数据集;数据水平拆分到n台服务器,理论上读性能扩展n倍,写性能也扩展n倍(实际上远不止n倍,因为单机的数据量变成了原件的1/n);通过主从同步读写分离扩展数据库性能:每台服务器存储的数据量与总量相同;n台服务器上的数据都是一样的,都是完整的集合;理论上读性能提升了n倍,写性能还是单点,写性能不变;缓存层的水平拆分与数据库层的水平拆分类似,多为range拆分和hash拆分,不再展开。总结高并发(HighConcurrency)是互联网分布式系统架构设计必须考虑的因素之一。通常是指保证系统可以同时并行处理很多请求的设计。提高系统并发能力的方法主要有两种:纵向扩展(ScaleUp)横向扩展(ScaleOut)前者纵向扩展可以通过提高单机硬件性能或提高单机架构性能来提高并发性,但是单机的性能总是有限的。归根结底,高并发的互联网分布式架构设计的最佳解决方案是后者:横向扩展。在互联网分层架构中,每一层水平扩展的做法都不同:反向代理层可以通过“DNS轮询”进行水平扩展;site层可以通过nginx进行横向扩展;服务层可以通过服务连接池进行水平扩展;数据库可以根据数据范围或数据哈希进行水平扩展;每层横向扩展后,可以通过增加服务器数量来提升系统性能,达到理论性能***。想法比结论更重要。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文