精华内容
下载资源
问答
  • 高并发架构相关概念

    2018-10-14 23:42:18
    互联网时代,讲的并发、高并发,通常是指 并发访问。也就是在某个时间点,有多少个访问同时到来。 QPS(Queries per second): 每秒钟请求或者查询的数量,在互联网领域,指每秒响应请求数(指 HTTP 请求数)。 吞吐量...
    1. 互联网时代,讲的并发、高并发,通常是指 并发访问。也就是在某个时间点,有多少个访问同时到来。
    2. QPS(Queries per second): 每秒钟请求或者查询的数量,在互联网领域,指每秒响应请求数(指 HTTP 请求数)。
    3. 吞吐量(Throughput): 单位时间内处理的请求数量(通常由 QPS 与并发数决定)
    4. 响应时间(Response time): 从请求发出到响应花费的时间
    5. PV: 综合浏览量(Page View),即页面浏览量或者点击量,一个访客在24小时内访问的页面数量。
      同一个人浏览你的网站同一页面,只记作一次 PV
    6. UV: 独立访客(UniQue Visitor),即一定时间范围内相同访客多次访问网站,只计算为1个独立访客。
    7. 带宽(Bandwidth ): 计算带宽需关注两个指标,峰值流量和页面的平均大小。
      日网站带宽=PV/统计时间(换算到秒)* 平均页面大小(单位KB)* 8
      峰值一般是平均值的倍数,根据实际情况来定
    8. QPS 不等于 并发连接数
      QPS 是每秒 HTTP 请求数量,并发连接数 是系统同时处理的请求数量
    9. (总PV数*80%) / (6小时数*20%) = 峰值每秒请求数
      80% 的访问量集中在 20% 的时间
    10. 常用性能测试工具
      ab、wrk、http_load、Web Bench、Siege、Apache JMeter
      ab 全程是 apache benchmark,是 apache 官方推出的工具。创建多个并发访问线程,模拟多个访问者同时对某一 URL 地址进行访问。它的测试目标是基于 URL 的,因此,它既可以用来测试 apache 的负载压力,也可以测试 nginxlighthttptomcatIIS 等其它 Web 服务器的压力。
      ab 的使用
      模拟并发请求 100 次,总共请求 5000 次
      eg: ab -c 100 -n 500 http://xxx.com
    11. 解决方案
      (1) QPS 达到 100
      假设关系型数据库的每次请求在 0.01 秒完成
      假设单页面只有一个 SQL 查询,那么 100 QPS 意味着 1 秒钟完成 100 次请求,但是此时我们并不能保证数据库查询能完成 100
      方案:数据库缓存层、数据库的负载均衡
      (2) QPS 达到 800
      假设我们使用百兆带宽,意味着网站出口的实际带宽是 8M 左右
      假设每个页面只有 10K,在这个并发条件下,百兆带宽已经吃完
      方案:CDN 加速、负载均衡
      (3) QPS 达到 1000
      假设使用 Memcache 缓存数据库查询数据,每个页面对 Memcache 的请求远大于请求直接对 DB 的请求
      Memcache 的悲观并发数在 2W 左右,但有可能在之前内网带宽已经吃光,表现出不稳定
      方案:静态 HTML 缓存
      (4) QPS 达到 2000
      这个级别下,文件系统访问锁都成为了灾难
      方案:做业务分离,分布式存储
    12. 优化方式
      流量优化:防盗链处理
      前端优化:减少 HTTP 请求、添加异步请求、启用浏览器缓存和文件压缩、CDN 加速、建立独立图片服务器
      服务端优化:页面静态化、并发处理、队列处理
      数据库优化:数据库缓存、分库分表、分区操作、读写分离
      Web服务器优化:负载均衡

    以上资源均来自网络,只为记录~

    展开全文
  • 最近在视频学习Java中并发与高并发的一些相关课程。...这门课程基础知识主要是分几大块来讲解的:并发与高并发相关概念、CPU多级缓存,缓存一致性、Java内存模型JMM规定,抽象结构同步操作与规则、并发优...

    最近在视频学习Java中并发与高并发的一些相关课程。目前已经学完了这门课程的基础知识部分,为了加深对知识的印象和理解,所以想写篇文章来加深下,也希望能带给读者们一些帮助。因为本人的知识和能力有限,有些知识点理解的不到位,希望大家多多指点和提出建议。

    这门课程基础知识主要是分几大块来讲解的:并发与高并发相关概念、CPU多级缓存,缓存一致性、Java内存模型JMM规定,抽象结构同步操作与规则、并发优势和风险、并发模拟工具展示,以下我会对这几个点来进行阐述。

     

    并发

    说到并发可能好多人见词知意了,百度百科对其也有解释,但是要进行理解性的思考。所谓并发就是:同时拥有两个或多个线程,如果程序在单核处理器上运行,多个线程将交替地换入或者换出内存,这些线程是同时「 存在 」的,每个线程都处于执行过程中的某个状态,如果运行在多核处理器上,此时,程序中每个线程都将分配到一个处理器核上,因此可以同时运行。也就是说,并发就是多个线程操作相同的物理机中的资源,保证其线程安全,合理的利用资源。有了并发就会有「 高并发 」,可能很多人认为这两个是一种意思。但是其实是有区别的。

     

    高并发(High Concurrency)

    是现在互联网设计系统中需要考虑的一个重要因素之一,通常来说,就是通过严谨的设计来保证系统能够同时并行处理很多的请求。这就是大家常说的「 高并发 」。也就是说系统能够在某一时间段内提供很多请求,但是不会影响系统的性能。如果想设计出高可用和高性能的系统,就应该从很多的方面来考虑,例如应该从硬件、软件、编程语言的选择、网络方面的考虑、系统的整体架构、数据结构、算法的优化、数据库的优化等等多方面。这其中的每一点展开来说都要说很多的知识,就不一一展开来说。有兴趣的可以单独了解。

     

    CPU缓存一致性

    其实说实话,在学这门课程之前,我对计算机操作系统的一些底层实现逻辑是不关心的,其实这些就是基础,可能在你代码中不会涉及,但是你如果懂操作系统的一些原理,会帮助你写出更加高质量的代码。说到缓存一致性,就得先介绍计算机中的CPU和内存,因为在计算机中内存的计算效率和处理速度和CPU相比起来,差的不是一个量级,所以为了提高计算机的整体处理效率就在内存和CPU之前加了一层高级缓存(cache)用它来作为CPU和内存的一种缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了

    引入了一层高级缓存解决了处理性能上的问题,但是又引发了另一个问题。就是如何保证高级缓存、CPU寄存器(也是一种为了提高运算速度的东西)中的数据和主内存中的数据保持一致呢,这就是所谓的缓存一致性。在多核处理器的计算机当中,每个处理器有自己的高级缓存,而他们却公用一块主内存,也就是上图中的 Main Memory。在他们进行数据读写时,需要一种协议,目前作者了解到的协议大概有:MSI、MESI、MOSI及Dragon Protocol等。此外,为了能使CPU一直处在工作中,工作单元能被充分的利用,处理器可能会对输入代码进行乱序执行(Out-Of-Order Execution)优化。这和Java里面的指令冲排序(Instruction Recorder)相似。

     

    Java内存模型(JMM--Java Memory Model)

    Java的内存模型可以理解为:在特定的协议下,对特定的内存和高级缓存进行读写访问的过程抽象,不同操作系统有不同的内存模型也就是过程抽象。Java虚拟机(JVM)也有自己的内存模型,也就是Java内存模型了。因为Java内存模型屏蔽了各种硬件和操作系统的差异,也就形成了大家众所周知的「 一次编写,到处运行 」。

     

    Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。此处的变量与Java编程时所说的变量不一样,指包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,后者是线程私有的,不会被共享。

    Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存(可以与前面讲的处理器的高速缓存类比),线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成,线程、主内存和工作内存的交互关系如下图所示。

     

    如上图所示,可以看出来内存交互中有八步的操作:lock、Unlock、Read、 Load、 Use、 Assign、 Store、 Write其中Read和Load  Store和Write必必须按顺序执行,而没有保证必须是连续执行。另外还有Java内存模型的八项规则:

     

    • 不允许read和load、store和write操作之一单独出现
    • 不允许一个线程丢弃它的最近assign的操作,即变量在工作内存中改变了之后必须同步到主内存中。
    • 不允许一个线程无原因地(没有发生过任何assign操作)把数据从工作内存同步回主内存中。
    • 一个新的变量只能在主内存中诞生,不允许在工作内存中直接使用一个未被初始化(load或assign)的变量。即就是对一个变量实施use和store操作之前,必须先执行过了assign和load操作。
    • 一个变量在同一时刻只允许一条线程对其进行lock操作,lock和unlock必须成对出现
    • 如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值
    • 如果一个变量事先没有被lock操作锁定,则不允许对它执行unlock操作;也不允许去unlock一个被其他线程锁定的变量。
    • 对一个变量执行unlock操作之前,必须先把此变量同步到主内存中(执行store和write操作)。

     

    并发的优势和风险

    优势

    1.速度:同时处理多个请求,响应时间较快。复杂的业务操作可以拆分为多个线程去执行加快了速度。

    2.设计:程序在某些情况下,可以更简单更高效,选择性更多

    3.资源利用:CPU可以在空闲时可进行复用,例如在等磁盘和网络IO的时候,做一些其他的事情。

    风险

    1.安全性:多个线程执行相同的程序,可能会出现线程安全的问题,也就是与实际期望不符的结果

    2.活跃性:某个操作执行不下去,可能会发生死锁和饥饿等问题。

    3.性能:线程过多,CPU频繁切换,增加了调度时间。线程过多会消耗过多的内存。

     

     

    并发模拟工具展示

     

    许多情况下,并发的场景应该都是在线上,但是为了学习和模拟高并发和并发,我们应该模拟场景,所以就出现了市面上的一些比较热门的工具:Postman JMeter Apache Bench。其中JMeter是功能最全和最常用的。具体的操作方式可在网上自行查询。当然,也可以在代码层面来模拟并发和高并发可以运用线程池和J.U.C里的相关类。

     

    总结

    目前基础知识我能想到的能总结这么多,通过写这篇文章也加深了我对知识的储备,也能让我看到自己知识不足的地方,学习有输入就要输出,希望能帮到那些热爱技术和乐于分享的人吧。当然,我之后会继续分享我所学的。谢谢支持!

     

     

    大家扫描二维码关注我的公众号,或者在微信中搜索「 技院小王」!

     

    文章部分知识参考文章:https://blog.csdn.net/u011080472/article/details/51337422

    展开全文
  • 多线程高并发相关基础概念

    千次阅读 2018-10-10 02:07:46
    程序是静态的概念,windows下通常指exe文件,程序也可以说是编译后的文件(.jar、.war等);操作系统打开一共应用程序,实际上是新打开了一个进程。 进程: 进程是动态的概念,是程序运行时的状态。一个程序可以有多个...

    程序、进程、线程

    程序:
             程序是静态的概念,windows下通常指exe文件,程序也可以说是编译后的文件(.jar、.war等);操作系统打开一共应用程序,实际上是新打开了一个进程。

    进程:
             进程是动态的概念,是程序运行时的状态。一个程序可以有多个进程,进程之间互不影响彼此隔离。

    线程:
             线程是进程里的一个基本任务,每个线程都有自己的功能,线程是CPU分配与调度的基本单位(即:CPU分配调度是面向于线程的;线程抢占CPU时间片)。


    并发与并行

    一台计算机可能有多个CPU。

    并发:
            多个线程抢占同一个CPU的时间片。

    并行:
             不同CPU同时执行不同的线程。

    而实际上,并行的同时往往带着并发:

    注:线程的调度单位是线程。

    注:单核(单CPU)多线程时,只存在并发;多核(多CPU)多线程时,并发与并行往往同时存在。

    注:一般的,我们所说的并发,指的是并发与并行。

    注:多线程抢占CPU时间片时,优先级越高的线程,抢占到CPU时间片的概率就越大。可以通过xxx.setPriority(x)来设
           置线程xxx的优先级x,其中x的范围是[1,10]之间的整数。1,优先级最低,10,优先级最高。优先级越高,抢
           占到CPU时间片的可能性越大(注意:优先级高只是抢占到的可能性高而已,优先级高的也并不一定能抢占到)


    同步与异步

    异步、同步可参考AJAX原理。给出两张图一看便知。

    同步:

    异步:


    临界区

    临界区用来表示一种公共资源与共享数据,可以被多个线程使用。

    注:同一时间只能有一个线程访问临界区,其余线程必须等待。


    死锁、饥饿、活锁

    死锁:
             多个线程彼此竞争相同的资源,而又不愿彼此礼让,进而出现死锁。

    注:死锁是在多线程情况下最严重的问题,在多线程对公共资源(文件、数据等)进行操作时,彼此不释放自己的资源,而
           试图去操作其他线程的资源,而形成交叉引用,就会产生死锁。

    说明死锁(示例):
           线程A需要对象x和对象y的锁,而线程B需要对象y和对象x的锁,假设线程A在获得对象x的锁时线程B获得y的锁;此时,线程A和B就同时进入的阻塞状态,等待对方线程释放自己需要对象的锁,即:此时,线程A和线程B进入死锁状态。

    解决(避免)死锁的建议:

          ◎尽量减少公共资源的引用,用完马上释放。

          ◎减少synchronized等的使用,采用副本的方式代替。

          ◎引用公共资源时,多个线程都按照用一个顺序进行引用。

    饥饿:
            某些线程在与其他线程进行CPU时间片抢占时,(由于线程优先级等问题)总是没有抢到CPU时间片,那么就会使这些线程处于饥饿状态。

    活锁:
           与死锁相反,多个线程彼此过度礼让,都不去抢占资源,进而形成线程阻塞。

    严重程度(由高到低): 死锁 -> 饥饿 -> 活锁


    线程安全

            在拥有共享数据的多条线程并发执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。

    线程安全的三大特性:

            原子性:一个操作要么全部执行,且执行过程中不会被任何因素打断;要么都不执行。

            可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其余线程能够立即“看到”修改后的值。

            有序性:如果在本线程内观察,所有的操作都是有序的;如果在一个线程观察另一个线程,所有操作都是无序的。

    注:这里对有序性进行一下说明,假设现有(按语句从上到下的顺序)语句1,语句2,语句3,语句4;其中语句3的执行依赖
           于语句2;那么CPU进行重排序后,可能会排为2/3/1/4或2/3/4/1/或1/2/3/4或4/2/3/1或1/4/2/3或4/1/2/3;但是
           绝不可能把语句3排在语句2前,因为语句3的执行以来于语句2。在Java中我们可以使用关键字volatile来防止CPU
           重排序,其实我们在编写代码时并不需要主动的使用该关键字,因为JVM默认使用了该关键字来防止CPU重排序。


    Java内存模型

    注:JVM Memory是在我们真实的内存中开辟出的一块儿空间。

    注:堆是相对稳定的、静态的存储。

    注:上图只是简单说明(没列出程序计数器、本地方法栈等),在后面的JVM学习中,会再详细介绍Java内存模型。

    注:方法区与堆的关系较复杂,可认为其处于堆中,具体的在后面的JVM学习中,会再详细介绍。


    后台线程(守护线程、服务线程)

            假设当前有用户线程(非守护线程)A和守护线程B,当A线程先运行完时(包括结束A进程的操作所花费的时间运行完),B线程无论是否运行完,都会消亡。如果B先运行完,则对A不会有任何影响。

    注:守护线程一般都不会比用户线程提前结束。

    注:可通过线程对象的.setDaemon(true)方法,来将该线程设置为守护线程。

    注:如果有多个用户线程,那么当所有的用户线程都结束后,守护线程才会结束(如果守护线程不提前结束的话)。


    线程的五种状态

         ◎新生

         ◎就绪

         ◎运行

         ◎阻塞

         ◎消亡

    注:有时也可以说四种状态:新生、可运行(就绪 + 运行)、阻塞、消亡。

    给出关系图:

    线程的部分方法(更多请查阅手册):

           xxx.join();方法:其中xxx为线程名。当执行到此语句时,其它线程暂时阻塞,只有等此线程所有的都运行完后,其余线程才恢复可运行状态。

           xxx.sleep(x);方法:其中xxx为线程名,x为毫秒数。当执行到此语句时,此线程会阻塞x毫秒,然后再恢复可运行状态。

           xxx.yield();方法:其中xxx为线程名。当前线程主动交出正在运行的资源(即:主动让自己的抢占到的可能性降低了),但是并不阻塞,可以继续抢占。


    笔者将本人多线程一栏中博客涉及到的所有代码示例(Lock分开放在一个专门的项目、synchronized的代码附在该文章末尾),放在GIT上了(链接见本文末),这里先给出一个所涉及内容图:

     

    声明:本文是学习笔记,主要学习自以下视频

    ^_^ 学习视频
                 《Java多线程与并发实战视频课程》,齐毅 

    ^_^ 参考笔记
                 《程序员成长笔记(一)》,笔者JustryDeng

    ^_^ 多线程一栏所有测试示例代码,托管链接
     
                  https://github.com/JustryDeng/PublicRepository

    ^_^ 如有不当之处,欢迎指正

    ^_^ 本文已经被收录进《程序员成长笔记(三)》,笔者JustryDeng

    展开全文
  • 高并发概念

    千次阅读 2018-06-28 08:57:43
    高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200...

    一、什么是高并发

    高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求


    高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPSQuery Per Second),并发用户数等。


    响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。

    吞吐量:单位时间内处理的请求数量。

    QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。

    并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。

     

    二、如何提升系统的并发能力

    互联网分布式架构设计,提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out

    垂直扩展:提升单机处理能力。垂直扩展的方式又有两种:

    1)增强单机硬件性能,例如:增加CPU核数如32核,升级更好的网卡如万兆,升级更好的硬盘如SSD,扩充硬盘容量如2T,扩充系统内存如128G

    2)提升单机架构性能,例如:使用Cache来减少IO次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间;


    在互联网业务发展非常迅猛的早期,如果预算不是问题,强烈建议使用“增强单机硬件性能”的方式提升系统并发能力,因为这个阶段,公司的战略往往是发展业务抢时间,而“增强单机硬件性能”往往是最快的方法。

     

    不管是提升单机硬件性能,还是提升单机架构性能,都有一个致命的不足:单机性能总是有极限的。所以互联网分布式架构设计高并发终极解决方案还是水平扩展


    水平扩展:只要增加服务器数量,就能线性扩充系统性能。水平扩展对系统架构设计是有要求的,如何在架构各层进行可水平扩展的设计,以及互联网公司架构各层常见的水平扩展实践,是本文重点讨论的内容。

     

    三、常见的互联网分层架构


    常见互联网分布式架构如上,分为:

    1客户端层:典型调用方是浏览器browser或者手机应用APP

    2反向代理层:系统入口,反向代理

    3站点应用层:实现核心应用逻辑,返回html或者json

    4服务层:如果实现了服务化,就有这一层

    5数据-缓存层:缓存加速访问存储

    6数据-数据库层:数据库固化数据存储

    整个系统各层次的水平扩展,又分别是如何实施的呢?

     

    四、分层水平扩展架构实践

    反向代理层的水平扩展


    反向代理层的水平扩展,是通过“DNS轮询”实现的:dns-server对于一个域名配置了多个解析ip,每次DNS解析请求来访问dns-server,会轮询返回这些ip

    nginx成为瓶颈的时候,只要增加服务器数量,新增nginx服务的部署,增加一个外网ip,就能扩展反向代理层的性能,做到理论上的无限高并发。

     

    站点层的水平扩展


    站点层的水平扩展,是通过“nginx”实现的。通过修改nginx.conf,可以设置多个web后端。

    web后端成为瓶颈的时候,只要增加服务器数量,新增web服务的部署,在nginx配置中配置上新的web后端,就能扩展站点层的性能,做到理论上的无限高并发。

     

    服务层的水平扩展


    服务层的水平扩展,是通过“服务连接池”实现的。

    站点层通过RPC-client调用下游的服务层RPC-server时,RPC-client中的连接池会建立与下游服务多个连接,当服务成为瓶颈的时候,只要增加服务器数量,新增服务部署,在RPC-client处建立新的下游服务连接,就能扩展服务层性能,做到理论上的无限高并发。如果需要优雅的进行服务层自动扩容,这里可能需要配置中心里服务自动发现功能的支持。

     

    数据层的水平扩展

    在数据量很大的情况下,数据层(缓存,数据库)涉及数据的水平扩展,将原本存储在一台服务器上的数据(缓存,数据库)水平拆分到不同服务器上去,以达到扩充系统性能的目的。

     

    互联网数据层常见的水平拆分方式有这么几种,以数据库为例:

    按照范围水平拆分


    每一个数据服务,存储一定范围的数据,上图为例:

    user0库,存储uid范围1-1kw

    user1库,存储uid范围1kw-2kw

    这个方案的好处是:

    1)规则简单,service只需判断一下uid范围就能路由到对应的存储服务;

    2)数据均衡性较好;

    3)比较容易扩展,可以随时加一个uid[2kw,3kw]的数据服务;

    不足是:

    (1)      请求的负载不一定均衡,一般来说,新注册的用户会比老用户更活跃,大range的服务请求压力会更大;

     

    按照哈希水平拆分


    每一个数据库,存储某个keyhash后的部分数据,上图为例:

    user0库,存储偶数uid数据

    user1库,存储奇数uid数据

    这个方案的好处是:

    1)规则简单,service只需对uid进行hash能路由到对应的存储服务;

    2)数据均衡性较好;

    3)请求均匀性较好;

    不足是:

    1)不容易扩展,扩展一个数据服务,hash方法改变时候,可能需要进行数据迁移;

     

    这里需要注意的是,通过水平拆分来扩充系统性能,与主从同步读写分离来扩充数据库性能的方式有本质的不同。

    通过水平拆分扩展数据库性能:

    1)每个服务器上存储的数据量是总量的1/n,所以单机的性能也会有提升;

    2n个服务器上的数据没有交集,那个服务器上数据的并集是数据的全集;

    3)数据水平拆分到了n个服务器上,理论上读性能扩充了n倍,写性能也扩充了n倍(其实远不止n倍,因为单机的数据量变为了原来的1/n);

    通过主从同步读写分离扩展数据库性能:

    1)每个服务器上存储的数据量是和总量相同;

    2n个服务器上的数据都一样,都是全集;

    3)理论上读性能扩充了n倍,写仍然是单点,写性能不变;

     

    缓存层的水平拆分和数据库层的水平拆分类似,也是以范围拆分和哈希拆分的方式居多,就不再展开。

     

    五、总结

    高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求

    提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)。前者垂直扩展可以通过提升单机硬件性能,或者提升单机架构性能,来提高并发性,但单机性能总是有极限的,互联网分布式架构设计高并发终极解决方案还是后者:水平扩展

    互联网分层架构中,各层次水平扩展的实践又有所不同:

    1)反向代理层可以通过“DNS轮询”的方式来进行水平扩展;

    2)站点层可以通过nginx来进行水平扩展;

    3)服务层可以通过服务连接池来进行水平扩展;

    4)数据库可以按照数据范围,或者数据哈希的方式来进行水平扩展;

    各层实施水平扩展后,能够通过增加服务器数量的方式来提升系统的性能,做到理论上的性能无限。

    展开全文
  • 高并发系统概念思想

    2018-08-30 09:23:24
    什么是高并发 高并发(High Concurrency)是互联网分布式系统架构...高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。 响应时...
  • 高并发,是指运用设计手段让系统能够处理更多的用户并发请求,也就是承担更大的流量。一般衡量并发大小的指标有qps,tps。高并发系统设计的三大目标高性能、高可用、可扩展性能反应了系统的使用体验,通常以响应时间...
  • Linux高并发概念

    2021-01-15 16:53:41
    1.2 高并发相关指标 响应时间(Response Time) 系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间 吞吐量(Throughput) 单位时间内处理的请求数量 每秒查询率QPS...
  • 井发 在互联网时代,所讲的 井发、井发,通常是指井发访问。也就是在某个时间点,有多少 个访问同时到来。通常如果一个系统的日PV在干万以上,有可能是一个井发的系统. 井发的问题,我们具体该关心什么? ...
  • 7.QPS 不等于并发连接数。系统同时处理的请求数量。 (总PV数 * 80% ) / (6小时秒数 * 20%) = 峰值每秒   压力测试: ab apach benchmark  用法: 模拟并发请求100次,总共5000次 。  ab -c 100 -n 500 -c...
  • 什么是高并发高并发(High Concurrency)是互联网分布式系统...高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。响应时间:系统对...
  • JMM(java内存模型),由于并发程序要比串行程序复杂很多,其中一个重要原因是并发程序中数据访问一致性和安全性将会受到严重挑战。如何保证一个线程可以看到正确的数据呢?这个问题看起来很白痴。对于串行程序来说,...
  • 进程&线程的相关定义 进程的定义 from 百度百科 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是...
  • php高并发

    2018-11-20 14:49:00
    <?... * User: weisheng * Date: 2018/3/26 * Time: 20:14 */ .../* * 高并发相关概念 * 1.并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在...
  • 高并发理解及一些概念

    千次阅读 2018-10-20 15:50:35
    高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它...高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。
  • java高并发系列 - 第4天:JMM相关的一些概念 原创:路人甲Java路人甲Java7月9日 java高并发系列第4篇文章 JMM(java内存模型),由于并发程序要比串行程序复杂很多,其中一个重要原因是并发程序中数据访问一致性和...
  • 特别感谢:慕课网jimin老师的《Java并发...高并发相关基础知识 高并发相关基础知识 0、工具 1、基础概念 2、CPU多级缓存 3、缓存一致性(MESI Modify|Exclusive|Share|Invalid) 4、乱序执行优化 5、JAVA 内存模...
  • 并发程序比串行程序复杂的多,其中很重要的一个原因就是并发程序中数据访问的一致性和安全性问题。如何保证在一个线程可以看到正确的数据?这在串行程序中就不是问题,但是在并发程序中,这却成了最重要的一个问题。...
  • java高并发系列第4篇文章JMM(java内存模型),由于并发程序要比串行程序复杂很多,其中一个重要原因是并发程序中数据访问一致性和安全性将会受到严重挑战。如何保证一个线程可以看到正确的数据呢?这个问题看起来很...
  • 多线程与高并发——基本概念 1. 何为进程?何为线程? 进程是程序的一次执行过程,是系统运行程序的基本单位,是动态的。 线程是一个比进程更小的执行单位(也叫轻量级进程)。一个进程在其执行的过程中可以产生...
  • 相关的重要概念 (1)同步(synchronous)和异步( asynchronous)、阻塞(blocking)和非阻塞(non-blocking) 关于这个可以看同步、异步和阻塞、非阻塞的区别与理解,这里有较为详细的解释。 对于同步和异步,举个栗子,...
  • JMM(java内存模型),由于并发程序要比串行程序复杂很多,其中一个重要的原因是并发程序中数据访问 一致性 和 安全性 将会受到严重挑战。如何保证一个线程可以看到正确的数据呢? 这个问题看起来很白痴。对于串行...
  • JMM(java内存模型),由于并发程序要比串行程序复杂很多,其中一个重要原因是并发程序中数据访问一致性和安全性将会受到严重挑战。如何保证一个线程可以看到正确的数据呢?这个问题看起来很白痴。对于串行程序来说,...
  • 参考书籍:《实战JAVA高并发程序设计》本文仅用于自己参考 一、概念 同步(Synchronous)和异步(Asynchronous) 并发(Concurrency)和并行(Parallelism) 临界区 临界区用来表示一种公共资源或者说是共享数据...
  • 想借着这个机会把Java相关的东西再捡一些起来,顺便回顾一下并行、并发等一些知识。线程在计算机世界里,当我们探讨并行的时候,实际上是指一系列的任务在计算机中同时运行。对计算机来说,每一个任务就是一个进程.....
  • 1、简述计算机操作系统中的“中断”的作用? 中断是指在计算机执行期间...当遇到IO操作时或一个进程运行时间过长或被更的优先级的进程替代时出现中断。有利于合理利用有限的系统资源,提高程序运行效率。 2...
  • 1、简述计算机操作系统中的“中断”的作用?...当遇到IO操作时或一个进程运行时间过长或被更的优先级的进程替代时出现中断。有利于合理利用有限的系统资源,提高程序运行效率。2、简述计算机内存中的“内核态”...
  • JMM(java内存模型),由于并发程序要比串行程序复杂很多,其中一个重要原因是并发程序中数据访问一致性和安全性将会受到严重挑战。如何保证一个线程可以看到正确的数据呢?这个问题看起来很白痴。对于串行程序来说,...
  • 事务的并发 事务的并发是指在某一时间段内,多个事务同时存取相同的数据库数据。 并发操作时由于不能隔离而产生的问题: ①丢失修改 ②读入”脏“数据 ③不可重复读 并发调度 一组并发事务当中的一些重要的操作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,307
精华内容 522
关键字:

高并发相关概念