一个运营的系统在正式上线后将会遇到各种层级的高并发请求,因此我们必须对此做出相应的策略和技术解决方案,首先我们需要认清系统的高并发由3个层面导致:

1. 传输层
大量用户对系统请求后,将会造成网络带宽和Web服务器的I/O瓶颈。

2. 计算层
接收大量用户请求进行计算,将会造成业务服务器和业务支撑服务器的瓶颈。

3. 存储层
传输层和计算层将会产生大量的数据,数据量暴增,将会导致数据库和储存上的瓶颈。

针对以上将会造成的系统高并发瓶颈,我们需要采用不同的技术手段解决。

从总体上来看
1.首先需要解决网络带宽和Web请求的高并发,需要合理的加大服务器和带宽的投入,并且需要充分的利用系统中软件、硬件的缓存机制,将能缓存的内容都进行缓存存储,减少计算层和存储层的压力。

2.其次需要对业务服务器和业务支撑服务器进行合理的分层,并且采用并行计算和分布式算法对大量计算进行处理,并且在开发的过程中需要采用JavaSDK中并发包(Concurrency)进行编码实现。

3.存储层需要采用分布式文件服务器和列式的存储服务器进行构建,支撑海量数据的存放和读取,并且还要对关系型数据进行深层次的配置参数优化。

4.我们还需要清楚的认识到,将来根据系统运行的状态以及平台中不同的业务场景循序渐进的进行调整和优化。

   对于大型系统来说,采用的技术是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求。在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:将会使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。
   但是除了这几个方面,还没法根本解决面临的高负载和高并发问题,所以需要将计算和负载的压力分载到每个计算机上,使用不同的服务器集群机组进行分布式和并行计算,面对所产生的压力,下面这张图清晰的描述了,我们对系统中不同的计算瓶颈采用的不同解决手段,如图所示:
 
以下描述是针对不同层面产生的计算压力所采用的计算策略,清单如下:
传输层
    网络链路出口进行压力分载,通过CDN让用户访问最近的数据缓存。
    针对电信、网通 不同的访问用户访问请求,对应用户访问请求进行服务器带宽的智能切换。
    对用户的请求进行压力分载,并且实现多种负载均衡的策略,也可以选择使用HA-Proxy实现。
4. HA-Proxy
   针对Web服务器进行方向代理,通过HA-Proxy将用户的请求分发到不同的Web服务器上。
    在Web服务器上采用的一种策略,专门针对某个用户需要不断频繁的轮询访问。
    将用户的会话进行集中处理,存放在中央式的缓存服务器当中,减少服务器之间的会话通信
 
计算层
   采用最经典的分布式算法对海量数据进行处理,将计算进行分载。
2. BSP
    BSP(Bulk Synchronous Parallel-大型同步模型)算法是基于MPI算法的基础进行演化,运用在系统中并行计算的部分。
3. Result Cache
    将计算的一部分结果进行缓存,缓解对存储层读取的请求。
4. Scatter/Gather
    中间通过一个服务器进行中转,将大量的请求分发给内部的服务器进行计算,类似前端的web反向代理。
 
存储层
1. 读写分离
    由于系统的读大于写的频率,数据库架构采用了1主/多从,双主多从的策略,所以我们将会将读和写进行分离,并且将大量的读请求分散给多台不同的(Slave)服务器。
2. 分区策略
    系统采用不同的时间段作为分区的主要策略,提高对数据的读写性能。
3. Sharding
    一台数据库将很快无法满足大量并发,需要使用库表散列,将数据库中的数据进行分散存储。
4. Column-Based

使用在海量数据中的查询功能,采用列模式的存储方式将可以有效的提高系统查询效率。

高并发的常见策略--大型web项目的更多相关文章

  1. Microsoft Orleans构建高并发、分布式的大型应用程序框架

    Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...

  2. Java高并发的常见应对方案

    Java高并发的常见应对方案 一.关于并发我们说的高并发是什么? 在互联网时代,高并发,通常是指,在某个时间点,有很多个访问同时到来. 高并发,通常关心的系统指标与业务指标? QPS:每秒钟查询量,广 ...

  3. Azure Traffic Manager(二) 基于权重与基于优先级的路由策略为我们的Web项目提供负载均衡

    一,引言 上一片文章我们使用 Azure Traffic Manager 分发用户请求,同时演示了两种路由策略,“Performance”,“Geographic”的两种方式,今天我们继续讲解 Tra ...

  4. 大型web项目构建之负载均衡

    日常开发和学习中经常会听到或者会看到“负载均衡”这个词汇,但是对于很多初级每天只面对增删改代码的开发人员来说,这个词汇好像离我们很遥远又很接近,很多人多多少少都有点一知半解 我结合以前在开发中遇到的场 ...

  5. 面试题:Nginx 是如何实现高并发?常见的优化手段有哪些?

    面试题: Nginx 是如何实现并发的?为什么 Nginx 不使用多线程?Nginx常见的优化手段有哪些?502错误可能原因有哪些? 面试官心理分析 主要是看应聘人员的对NGINX的基本原理是否熟悉, ...

  6. Netty 100万级到亿级流量 高并发 仿微信 IM后台 开源项目实战

    目录 写在前面 亿级流量IM的应用场景 十万级 单体IM 系统 高并发分布式IM系统架构 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -10[ 博客园 总入口 ] 写在前面 ​ 大家好 ...

  7. java并发系列 - 第29天:高并发中常见的限流方式

    这是java高并发系列第29篇. 环境:jdk1.8. 本文内容 介绍常见的限流算法 通过控制最大并发数来进行限流 通过漏桶算法来进行限流 通过令牌桶算法来进行限流 限流工具类RateLimiter ...

  8. 高并发&高可用系统的常见应对策略 秒杀等-(阿里)

    对于一个需要处理高并发的系统而言,可以从多个层面去解决这个问题. 1.数据库系统:数据库系统可以采取集群策略以保证某台数据库服务器的宕机不会影响整个系统,并且通过负载均衡策略来降低每一台数据库服务器的 ...

  9. 大型Java Web项目的架构和部署问题

    一位ID是jackson1225的网友在javaeye询问了一个大型Web系统的架构和部署选型问题,希望能提高现有的基于Java的Web应用的服务能力.由于架构模式和部署调优一直是Java社区的热门话 ...

随机推荐

  1. java oop

    /** 多层嵌套内部类, 调用时要层层往下调用 格式: 外部类.内部类1.内部类2 对象名 = new 外部类().new 内部类1().new 内部类2(); 对象名.属性/方法名(); */ cl ...

  2. memcached全面剖析--2

    理解memcached的内存存储 下面是<memcached全面剖析>的第二部分. 发表日:2008/7/9 作者:前坂徹(Toru Maesaka) 原文链接:http://gihyo. ...

  3. [CSS]white-space 属性详解

    实例 规定段落中的文本不进行换行: p { white-space: nowrap } 可能的值 值 描述 normal 默认.空白会被浏览器忽略. pre 空白会被浏览器保留.其行为方式类似 HTM ...

  4. web2py--------------用web2py写 django的例子 --------建立一个投票应用(2)

    建立模型 我们在models下及那里polls.py 文件内容如下 # -*- coding: utf-8 -*- pollsdb=DAL(uri='sqlite://polls.db') polls ...

  5. python基础学习(二)--函数

    return返回值: python函数都有返回值,函数体内无return,默认返回值None, 函数参数: 1.普通参数 严格按照顺序,将实际参数赋值给形式参数,一一对应. 例: def send(x ...

  6. 如何让listview列表为空时显示提示

    先在布局文件中声明一个TextView,再设置listview.setEmptyView(TextView).这样当listview中的数据为空时就会列表的位置就会显示textviw中的提示.

  7. Android 绘制计时器

    用小米的手机,发现其实还可以,无意间点开小米的计时器,发现界面非常好看和实用.于是自己仿照着写一个,由于技术不好,代码整体结构上可能有点乱,但主要的实现功能和掌握知识点. Android中绘制采用ca ...

  8. Sql狗血的Bit类型赋值与取值

    Bit 数据类型在 SQL Server 数据库中以存储 1.0 进行存储. 往数据库中添加,修改 bit 类型的字段时,只能用 0 或者 1. 关于修改 Bit 类型的字段 1.若使用 SQL 语句 ...

  9. push 栈顶sp=sp-2 可以把立着的栈,向左侧倒下,那么形态就和反汇编时,内存的形态是一样的。小偏移的字节在前, 大的偏移字节在后

    push  栈顶sp=sp-2 可以把立着的栈,向左侧倒下,那么形态就和反汇编时,内存的形态是一样的.小偏移的字节在前, 大的偏移字节在后. 1 2 3 4 5 1 2 3 4 5

  10. HTML控件ID和NAME属性的区别,以及如何在asp.net页面的.CS文件中获得.ASPX页面中HTML控件的值

    在html中:name指的是用户名称,ID指的是用户注册是系统自动分配给用户的一个序列号. name是用来提交数据的,提供给表单用,可以重复: id则针对文档操作时候用,不能重复.如:document ...