面对峰值响应冲击,解决高并发的三大策略

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

当前在互联网+的大潮下,众所周知淘宝、京东这些交易系统每天产生的数据量都是海量的,每天的交易并发也是惊人的,尤其是“双11”、“6.18”这些活动,对系统的峰值响应提出了非常高的要求,所以对系统架构也就有了很要的要求。

在写这篇博客的前2天,听说某系统在25人的用户量下就宕机了,实在让人震惊,所以捋了下互联网交易系统我们可以采取哪些技术来解决互联网平台下大数据量高并发的问题。

首先根据架构分层把不同技术进行了一些分类,如下图:

15389173004565d75662401

 

互联网技术架构分层策略图

接下来我会逐一解释各个技术的大概原理和思路,供大家参考和学习:

一、互联网层

1、负载均衡

负载均衡英文名称为Load Balance,意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

比如Nginx是一款可以通过反向代理实现负载均衡的服务器,把流量导向不同的服务器;现在的云平台都提供了负载均衡服务,不过需要单独付费,比如阿里的SLB。

2、内容分发网络(CDN)

内容分发网络基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。

通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。

其目的,是使用户可就近取得所需内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。这个不需要单独去实现,可以用现成的产品去做,比如: Akamai(好些,比较贵),Verizon EdgeCast(便宜些),ChinaCach;如果是云平台基本上都提供了这个服务,不过也需要付费的,比如阿里云基于自己的CDN加速提供了不同形式的加速;比如基于P2P技术的PCDN,增强防护DDoS、CC、Web应用攻击的SCDN以及全站加速。

二、Web服务器层

1、Session→Cookie

传统的B/S架构都是把用户会话放到Session里面,在在线用户量不高的情况下没啥问题,但是对于现在互联网采取了分布式或者微服务架构,就很难单独去维护Session了,因为Session会分布在不同的服务器上,会话的同步会面临着很大的问题。所以一种方式是把Session的维护拿到Cookie里去做,不依赖于某台或多台服务器,同时也减少了服务器的开销。当然,也可以利用内存缓存服务器来统一存储Session信息,有的内存缓存服务器还能把内存数据持久化到磁盘来提高可用性和可恢复性,就不会有同步问题了。

2、Static page

动态页面静态化,为什么又要把动态网页以静态网页的形式发布呢?一个很重要的原因就是搜索引擎;另一个重要原因就是提高程序性能。

很多大型网站,进去的时候看它页面很复杂,但是加载也没有耗费多长时间,原因在于先于用户获取资源或数据库数据,进而通过静态化处理,生成静态页面。所有人都访问这一个静态页面,而静态化处理的页面本身的访问速度要较动态页面快很多倍,因此程序性能会有大大的提升。使用场景是那些经常需要访问但是数据不经常更新的时候。这种情况就是时候将动态页面静态化了,比如淘宝的宝贝信息页面,页面动态部分可以用AJAX加载进来,比如月销多少笔。

3、Cache

缓存,Web服务层的缓存依赖于下面三个方面:

  • 浏览器端的缓存,比如CSS/JS等;
  • 在CDN这类技术当中做大量页面缓存来提高就近访问速度;
  • 自己搭建内存缓存服务器对频率访问比较高的页面进行缓存,比如首页等。

4、Gzip

利用浏览器能自动进行Gzip解压缩的原理对访问页面和资源(含图片、JavaScript、CSS等)进行Gzip压缩,减少文件大小,以此来提高网络加载速度。

5、One file

原理是把多个需要加载的内容合成一个文件,减少加载次数和网络连接时间,提高访问效率,比如把小图标集合合成一个大图片,把CSS/JavaScript 合成到一个文件里面。

6、Cluster

集群和传统的高性能计算机技术相比,计算机集群通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,它们可以被看作是一台计算机。

集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下,集群计算机比单个计算机(比如工作站或超级计算机)性能价格比要高得多,大多数集群采用主从式来管理集群节点,比如Websphere Cluster。

和常见的分布式的不同点在于:集群是同一个业务部署在多个服务器上;分布式是一个业务分拆成多个子业务,或者本身就是不同的业务,部署在不同的服务器上。

简单地说,分布式是以缩短单个任务的执行时间来提升效率,而集群则是通过提高单位时间内执行的任务数来提升效率。

三、应用服务器或者业务服务器层

1、Distributed/分布式|SC/服务中心|微服务|Decouple/解耦

分布式系统是支持分布式处理的软件系统,是由通信网络互联的多处理机体系结构上执行任务的系统。简单来说,分布式处理就是多台相连的计算机各自承担同一工作任务的不同部分,在人的控制下同时运行,共同完成同一件工作任务。包括分布式操作系统、分布式程序设计语言及其编译系统、分布式文件系统、分布式数据库系统、分布式调度系统等。这常常伴随需要做负载均衡、熔断和限流等;还得考虑是全量计算还是增量计算等。

所以随着分布式的发展,微服务架构就变得越来越流行,它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持,围绕业务领域组件来创建应用,这些应用可独立地进行开发、管理和迭代。在分散的组件中使用云架构和平台式部署、管理和服务功能,使产品交付变得更加简单,所以业务的解耦和拆分的就变得越来越重要。

现在随着容器(Docker)的发展让分布式、微服务变得更加灵活和容易,也让现在支持大数据量高并发提供了很好的基础设施。

2、Cache

这一层的缓存主要是对高频数据进行缓存,比如对中间计算结果进行缓存,而且是基于内存缓存居多,比如Memcached和Redis,有的还提供缓存持久化,比如Redis。在分布式计算中经常要对批量数据进行缓存预读取以提高计算速度。

3、同步转异步/MQ

同步转异步的思路一方面不让进程或者线程阻塞在顺序执行里,从而加快程序的执行,就像Node.js用异步和Java用同步做相同计算测试,好多时候速度Node.js比Java还快,不信大家可以试试,像双11的抢购都是采用了异步机制。

另一方面不让用户一直等在那里,用户可以继续做别的事情,等异步执行完毕通知用户。这里面大量用到了消息队列(MQ),流行的产品很多,最早的WebsphereMQ,到现在的Kafka、RabbitMQ,有些甚至和流行的开源框架紧密集成,比如RabbitMQ和SpringBoot。

四、数据访问、文件访问、内部网络访问层

1、读写分离

因为在大数据量并发情况下,读的操作频率远远超过写操作,所以通过读写分离来提高读的速度,其思路是让主数据库(master)处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库(slave)处理SELECT查询操作,下面是淘宝最早的时候采用的读写分离策略:

1538917447019e4f1f8ac6c

 

读写分离示意图

2、DB Cluster

集群就不再做过多说明,数据库集群是利用至少两台或者多台数据库服务器,构成一个虚拟单一数据库逻辑映像,像单数据库系统那样,向客户端提供透明的数据服务。其目的还是为了增加数据吞吐量,提高数据库性能,满足大数据量下对数据的读写速度要求。

阿里云的RDS云数据库就继承了上述2大特征,外面看来是一个MySQL集群,提供统一的透明访问,而在内部就自动实现了读写分离,为高性能数据库存储提供了很大便利。

3、分布式存储(DAS/NAS/SAN)

三种分布式存储方案,大家可自行百度,各种介绍比较比较多,这里不再赘述,比如阿里的OSS存储也是一种分布式存储。

4、Cache

缓存无处不在,连CPU都有二级缓存,在数据访问这一层,可以根据你的数据需要充分利用缓存技术来提供读写速度,比如对要求不是特别实时的大数据进行预统计分析,然后缓存下来做报表等,这个时候直接从缓存里读取即可,提高统计速度。

5、NoSQL,Key/Value

NoSQL,泛指非关系型的数据库。随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其自身的特点(高可扩展性、分布式计算、低成本、架构的灵活性、半结构化数据,没有复杂的关系)得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。其数据库类型有列存储、文档存储、Key/Value存储、对象存储和图存储等。

6、Split/分割,Partition/分区

表分区是DB对于非常大的表进行优化的一种有效方法,是根据数据库定义不同的分区策略决定的,比如取模、时间和哈希等,是非常有效的一种手段,在很多情况下比表分割更有效。

比如,有一个代码表使用分区表把100万纪录分在10个分区中(ID每从1到10万为一个分区),那样写查询语句的时候,只要给出查询条件中所需要的代码,DB自动会定位到对应的分区进行查询,大大降低的查询时间。

而采用表分割那必须先根据查询的代码指定所要查询的表,才能找到相应的记录,是由DBA或架构师根据业务需要来定义如何分割的。表分割分为水平分割和垂直分割:

  • 水平分割:根据一列或多列数据的值把数据行放到两个独立的表中;
  • 垂直分割:把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。

7、BGP

边界网关协议,主要用于互联网AS(自治系统)之间的互联,BGP的最主要功能在于控制路由的传播和选择最好的路由。中国网通与中国电信都具有AS号(自治系统号),全国各大网络运营商多数都是通过BGP协议与自身的AS号来互联的。

使用此方案来实现双线路需要在CNNIC(中国互联网信息中心)申请IDC自己的IP地址段和AS号,然后通过BGP协议将此段IP地址广播到移动,网通、电信等其它的网络运营商,使用BGP协议互联后移动。网通与电信的所有骨干路由设备将会判断到IDC机房IP段的最佳路由,以保证移动、网通和电信用户的高速访问。现在不少的云平台都支持BGP。

五、总结

“缓存”、“异步”和“分”是互联网大数据量高并发下架构策略中用的最多的3种策略,从上面各个技术层面,“分”也是占据了大多数技术的核心思想,所以考虑的时候要多想想分哪里、如何分,另外很多业务场景还得想想怎么合。

顺便在此给大家推荐一个Java架构方面的交流学习群:698581634,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系,主要针对Java开发人员提升自己,突破瓶颈,相信你来学习,会有提升和收获。在这个群里会有你需要的内容  朋友们请抓紧时间加入进来吧。

转载于:https://my.oschina.net/u/3967312/blog/2223500

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hibernate mysql 主从_MYSQL主从复制和写分离

基础篇https://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19841.htmlhttps://edu.51cto.com/course/21197.htmlhttps://edu.51cto.com/course/19886.htmlhttps://edu.51cto.com/course/19887.htmlhttps://edu.51ct…

全新升级的AOP框架Dora.Interception[6]: 框架设计和实现原理

本系列前面的五篇文章主要介绍Dora.Interception的编程模式以及对它的扩展定制,现在我们来聊聊它的设计和实现原理。目录一、调用链抽象二、基于约定的拦截器定义三、基于调用上下文的依赖注入容器四、拦截器的提供五、调用链的构建六、方法拦截的实现原理七、依赖注…

完成登录与注册页面的前端

完成登录与注册页面的HTMLCSSJS,其中的输入项检查包括: 用户名6-12位 首字母不能是数字 只能包含字母和数字 密码6-12位 注册页两次密码是否一致 JS: function fnLogin() {var uSer document.getElementById("user");var pAss do…

WPF效果第二百零一篇之实现合并单元格

早一段时间又一次出差青海省西宁市;回来又是总结又是各种琐事,也没顾得上去分享点东西;大周末的就在家分享一下,这二天再次基于ListBox实现的合并单元格的效果:1、ListBox嵌套ListBox的前台布局:<ListBox ItemsSource"{Binding LCPListData}" x:Name"Manufac…

ASP.NET Core中使用EasyCaching作为缓存抽象层

简介做后端开发&#xff0c;缓存应该是天天在用&#xff0c;很多时候我们的做法是写个帮助类&#xff0c;然后用到的时候调用一下。这种只适合简单层次的应用&#xff1b;一旦涉及到接口实现调整之类的&#xff0c;这种强耦合的做法很不合适。有些其他的功能又要去重复造轮子。…

visual studio开启多核编译方法

先按http://blog.csdn.net/acaiwlj/article/details/50240625的方法进行了VS多线程的启动。 原本以为按以下步骤设置就OK了&#xff0c;但是编译中无意间发些了一个warning&#xff1a;“/Gm”与多处理不兼容&#xff1b;忽略 /MP 开关&#xff01;&#xff01;&#xff01;&am…

聊聊storm nimbus的LeaderElector

为什么80%的码农都做不了架构师&#xff1f;>>> 序 本文主要研究一下storm nimbus的LeaderElector Nimbus org/apache/storm/daemon/nimbus/Nimbus.java public static void main(String[] args) throws Exception {Utils.setupDefaultUncaughtExceptionHandler();…

如果我去深圳,你会见我吗

▲图/ 深圳夜景初次见易小姐&#xff0c;还是21年的春节回老家的时候。想来20年因为疫情没有回家&#xff0c;家母几次三番电话里头表达的思念以及建议一些不靠谱的回家计划&#xff0c;着实有些不忍&#xff0c;确实有似“儿行千里母担忧”之理&#xff0c;索性拿着年假和加班…

开源轻量的 .NET 监控工具 - 看门狗

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具或组件&#xff0c;希望对您有用&#xff01;简介WatchDog 是一个使用 C# 开发的开源的轻量监控工具&#xff0c;它可以记录和查看 ASP.Net Core Web 和 WebApi 的实时消息、事件、…

BZOJ 3231: [Sdoi2008]递归数列 (JZYZOJ 1353) 矩阵快速幂

http://www.lydsy.com/JudgeOnline/problem.php?id3231和斐波那契一个道理在最后加一个求和即可1 #include<cstdio>2 #include<cstring>3 #include<iostream>4 //using namespace std;5 const int maxn10010;6 const double eps1e-8;7 long long modn;8 lon…

马斯克的火箭上天了,SpaceX开源项目也登上了热榜!

python知识手册SpaceX于美国东部时间5月30日下午3&#xff1a;22分将两位美国宇航员送往国际空间站&#xff0c;虽然这只是Demo任务&#xff0c;但SpaceX已经以其卓越工程优势、低廉的发射成本赢得了全球航天产业的信赖。同时也是除美俄中这些航天国家队以外&#xff0c;唯一独…

机器视觉Halcon教程(1.介绍)

前言本期教程主要教大家如何使用Halcon机器视觉&#xff0c;通过使用Halcon, 我们可以实现一些机器视觉的应用开发。例如: OCR识别、视觉定位、缺陷检测等内容。什么是halcon&#xff1f;简单来说, Halcon就是一款应用于机器视觉的软件&#xff0c;它提供了一套开发工具&#x…

网络时间的那些事及 ntpq 详解

2019独角兽企业重金招聘Python工程师标准>>> GMT (Greenwich Mean Time)格林威治时间 UTC (Coordinated Universal Time) 协调世界时 IAT (International Atomic Time),TAI 国际原子时 CST (Chinese Standard Time), 北京时间Gentoo&#xff08;也许其他发行版也是&…

【前端芝士树】Javascript的原型与原型链

【前端芝士树】Javascript的原型、原型链以及继承机制 前端的面试中经常会遇到这个问题&#xff0c;自己也是一直似懂非懂&#xff0c;趁这个机会整理一下0. 为什么会出现原型和原型链的概念 1994年&#xff0c;网景公司&#xff08;Netscape&#xff09;发布了Navigator浏览器…

C# 反射之Activator用法举例

概述程序运行时&#xff0c;通过反射可以得到其它程序集或者自己程序集代码的各种信息&#xff0c;包括类、函数、变量等来实例化它们&#xff0c;执行它们&#xff0c;操作它们&#xff0c;实际上就是获取程序在内存中的映像&#xff0c;然后基于这个映像进行各种操作。Activa…

MyBatis批量插入

转载于:https://blog.51cto.com/12701034/1929672

狐狸文│区块链发展的正路

&#xff08;图片出自网络&#xff0c;版权归原作者所有&#xff09;最近看了一本书&#xff1a;《美国增长的起落》。这本书是大部头&#xff0c;但看起来很过瘾。通过对这本书的阅读&#xff0c;我更新了自己对区块链发展的理解。这一年&#xff0c;“区块链”很热&#xff0…

Qt之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)

简述 QBoxLayout可以在水平方向或垂直方向上排列控件&#xff0c;由QHBoxLayout、QVBoxLayout所继承。 QHBoxLayout&#xff1a;水平布局&#xff0c;在水平方向上排列控件&#xff0c;即&#xff1a;左右排列。 QVBoxLayout&#xff1a;垂直布局&#xff0c;在垂直方向上排列控…

Optaplanner终于支持多线程并行运行 - Multithreaded incremental solving

Optaplanner 7.9.0.Final之前&#xff0c;启动引擎开始对一个Problem进行规划的时候&#xff0c;只能是单线程进行的。也就是说&#xff0c;当引擎对每一个possible solution进行分数计算的过程中&#xff0c;细化到每个步骤(Caculation)&#xff0c;都只能排队在同一个线程中依…

python棋盘格_干货必看 | Python的turtle库之经典棋盘格

国际棋盘格是一个由9横9纵的线组成的格子正方形&#xff0c;用Python的turtle库进行绘制的时候&#xff0c;先做9横9纵的线&#xff0c;再填上灰色小正方形&#xff0c;这就可以完成一个棋盘格了&#xff0c;下面是具体的操作步骤。(一)整体代码1、import turtleimport turtle2…