【高并发】- 生产级系统搭建 - 3

news2025/2/21 10:38:04

前言

    本章讲解高并发系统动静分离方案设计、热点数据处理、管控等思想。

1. 动静分离方案设计

    动静分离实质,将静态页面与动态页面(或者静态数据与动态数据)解耦分离,用不同系统承载对应流量。这样可以提升整个服务的访问性能和可维护性能。

1.1 什么是静态数据

静态数据是指页面中几乎不怎么变化的数据(即不依据用户的Cookie、基本信息、地域、时间等各种属性来生成的数据),例如:

  • CSS和JavaScript文件中的静态数据。

  • 活动页中的HTML静态文件。

  • 图片等相关资源文件。

  • 其他与用户信息无关的静态数据。

对于这些分离出来的静态数据,可以进行缓存。在缓存之后,访问这些静态数据的效率就高了,系统运行速度也更快了。可以使用代理服务器进行静态数据的缓存,如:浏览器本地缓存(包括App端、PC端)、CDN、Nginx、Squid、Varnish等,如下图:

1.2 什么是动态数据

动态数据是指根据当前用户属性动态生成的数据。

处理动态数据主要体现在技术架构上,一般采取如下技术方案:

  • 清晰的分层架构。

  • 服务架构。

  • 缓存架构。

1.3 如何实施动静分离架构

实施动静分离架构可以采用“分而治之”的办法,即将动态数据和静态数据解耦,分别使用各自的架构系统来承载对应的流量:

  • 对于静态数据,建议缩短用户请求路径,因为路径越短,访问速度就越快。另外,应尽可能地将静态数据缓存起来。

  • 对于动态数据,一般用户端需要和服务端进行交互才能获取,所以,请求路径越长,访问速度就越慢。

(ps:获取静态数据和获取动态数据的【域名】不同)

1.4 使用“页面静态化”技术实现动静分离架构

访问静态数据的速度很快,而访问动态数据的速度较慢。那么是否可提前生成好需要的动态获取的数据,然后使用静态页面加速技术来访问这些数据呢?如果可以这样,那访问动态数据的速度就变快了。

(1)页面静态化 技术

页面静态化技术是指:直接缓存HTTP连接,而不仅是缓存数据。代理服务器根据请求的URL直接返回HTTP对应的响应头及响应消息体,流程简洁且高效。

例如,在获取商品详情页数据时,可以提前将该商品详情页的动态数据生成好,然后使用静态页面加速技术访问这些数据。如此,系统的整体性能将得到显著提升,且会大大提升用户体验。

(2)页面静态化 技术适用场景

    页面静态化技术能加速对动态数据的获取,那它是不是在所有场景都适用呢?其实不然,如果使用不当,则不仅不会使系统性能得到提升,反而会使系统性能下降。

    因为页面静态化技术需要将动态数据提前生成,所以,页面静态化技术适用于【动态数据总量不是很大,生成的静态页面数量不多】的业务场景。例如

  • 在“秒杀”活动中,如果“秒杀”商品数量有限,则可以生成数量有限的“秒杀”商品静态网页。

  • 在二手车业务中,如果二手车库存量不是很大,则可以提前生成二手车的静态网页。

又比如,大型播客之类的网站就不适合使用“页面静态化”技术,因为其中的文章数量是以【亿】为单位的,生成这种体量的静态网页后访问速度会变得特别慢。

2 热点数据处理

场景:

(1)大型电商网站(淘宝、京东等)的商品访问量都是以【亿】为单位的,每天都有【千万】级别的商品被上亿用户访问,其中部分商品被很大一部分流量访问和下单,即这部分商品是【热点商品】

(热点商品的典型场景是“秒杀”业务场景。在“秒杀”业务中,热点商品在极短的时间内【1s ~ 2s】被大量用户访问,系统将面对流量洪峰的挑战)

(2)微博每天都会产生巨大流量的微博条目,比如突然某位明星宣布“和某某正式结婚”,这条微博在发出后会被“千万”级别的“粉丝”查看和转发,这条微博可以被定义为“热点微博”。

2.1 什么是热点数据?

    在上面两个场景中,“热点商品”和“热点微博”均为热点数据。在一定时间内被大量用户访问的数据就是热点数据。热点数据又被分为“静态热点数据”和“动态热点数据”。

  • 静态热点数据:可以被提前预知的数据。例如,商家事先决定好了在哪一天要进行“秒杀”活动,或者系统通过历史数据预测出哪个商品容易成为“热点数据”。

  • 动态热点数据:不能被提前预知的数据。例如,大明星宣布的大消息,或者淘宝、京东等平台突然做广告导致的“热点数据”。

2.1 如何发现热点数据?

    静态热点数据的发现比较容易,因为,要么是可以事先定义的热点数据,要么是可以通过历史数据预测出的热点数据。之后,将发现的热点数据写入缓存。

    动态热点数据的发现很难。但是如果能实时地发现动态热点数据,则对于促进商品的销售将起到很大的作用,同时对于系统也可以起到很好的保护作用。

发现动态热点数据的建议:

(1)使用日志收集组件(如Flume组件),实时地收集各个中间件及服务的日志,例如对代理层Nginx和后端服务层日志的实时收集。

(2)将实时收集到的日志信息发送到消息中间件Kafka中。

(3)构建一套流式计算系统,实时地从Kafka中 “消费” 日志信息。

(4)流式计算系统对日志信息进行实时流式计算,得到热点数据。

(ps:发现动态热点数据,只要能达到近实时发现【一般为2~3s】即可。)

2.3 如何处理热点数据

    发现热点数据后的一般做法是:优化、限制和隔离。

(1)热点数据的优化。

直接将发现的热点数据写入分布式缓存,并且根据业务情况对其设置缓存过期时间。

(2)热点数据的限制。

热点数据限制是一种保护系统的机制,目的是不让热点数据抢占其他请求的资源。

(例如,使用线程池隔离技术,将每个热点数据的处理过程放在独立的线程池内,这样可以避免大流量的冲击而影响其他请求使用及其资源。)

(3)热点数据的隔离。

热点数据的隔离也是一种保护机制,不能因为数据访问量过大而造成整个业务的崩溃。

(例如,针对“秒杀”场景,可以先将“秒杀”业务和其他主线业务隔离开,防止他们互相影响;然后,将“秒杀”应用独立部署,且使用独立的域名;最后,“秒杀”系统使用独立的数据库进行存储。)

3. 大流量的高效管控

    在“秒杀”场景中,海量的用户会带来瞬时的流量洪峰。瞬时的流量洪峰会带来严重的服务端读/写性能问题、数据库锁,以及服务器资源占用等问题。

3.1 流量分层

    请求路径越短,则访问速度肯定越快。但是,业务特性决定了不能永远将数据放在静态缓存中。

    对于瞬时流量洪峰采用倒三角的分层级逐层控制方式,共分为CDN、反向代理(Nginx)、后端服务及DB四个层级。

在部分“秒杀”业务场景中,用户的浏览器也可以进行一级数据缓存:浏览器是最接近用户的,对于时效很长且体积不大的静态数据,可以将其放入浏览器本地缓存中。

3.2 流量分层控制

(1)CDN层流量控制

    由动静分离技术可以想到:应提前生成尽可能多的数据,然后将其放入CDN节点缓存中(因为CDN层在物理架构上离用户比较近)。

    所以,如果绝大部分的流量都在这一层获取数据,那么到达后端的流量就会减少很多。

(2)反向代理层流量控制

    在动静分离方案中,可以通过“页面静态化”技术可以加速动态数据的获取,即提前将动态数据生成好,然后对齐进行静态化处理。

    所以,这里就可以依据“页面静态化”技术,通过后端服务Job的方式定时提前生成好前端需要的静态数据,然后,将其发送到内容分发服务上,内容分发服务会将这些静态数据分发给所有的反向代理服务器。

在“秒杀”业务中,活动详情页上有一个倒计时的模块,用户可以看到当前“秒杀”活动还剩多久时间开始。这种逻辑简单的功能可以使用Nginx来实现:利用nginx-lua插件,使用Lua脚本获取当前Nginx服务器的时间来计算倒计时。另外,商品库存数据也可以通过Nginx直接访问分布式缓存来获取。

    在“秒杀”业务中,可能会有人利用“秒杀器”进行不公平竞争,且有可能存在竞争对手恶意刷请求的情况。如果存在这种情况,那本次活动就是有风险的,万一被恶意流量独占了库存,则会导致正常用户不能抢购商品,也可能这种恶意请求会对后端系统造成严重冲击,甚至造成后端系统瘫痪。

    对于这种恶意请求,最好有一套机制能提前感知,并将恶意请求提前封存。可以在Nginx层中控制;也可以在Nginx中配置用户的访问频率(例如每分钟最多只能访问10次);还可以使用Lua脚本编写一些简单业务逻辑的接口,例如,通过调用接口直接封掉指定IP地址或UserAgent。

(可以利用大数据的日志收集组件:如Flume,从Nginx上采集日志,将采集到的日志写入存储系统:如HBase中,然后风控平台对存储系统中的日志进行风险分析。对于有风险的请求,风控平台可以直接调用Nginx中的Lua风控接口对其进行封停处理,例如禁止某个IP地址或将请求的UserAgent封停。)

(3)后端服务层流量控制

对于服务层的流量控制,有以下几点建议:

  • 在程序开发上,代码独立,不要与其他平台项目合在一起。

  • 在部署时,应用独立部署,分散流量,避免不合适的流量影响主体业务。

  • 使用独立域名,或者按照一定的URL规则在反向代理层进行路由。

  • 做好系统保护和限流,进一步减少不必要的流量。

(当【达到系统中的请求书数】明显大于【系统能够处理的最大请求数】时,可以直接拒绝多余的请求,直接返回“秒杀”活动结束的信息)

(4)数据库层流量控制

写数据库的流量就是真正下单成功的流量,即需要扣减库存的动作,有如下建议:

  • 如果不是临时活动,则建议使用独立的数据库作为“秒杀”活动的数据库。

  • 将数据库配置成读写分离。

  • 尝试去除行锁。

    章节拆分比较细,是为了让大家看的过程中,能够尽可能把内容接收进去,下章节讲解高并发系统的扣减库存的相关方案介绍。

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

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

相关文章

MySql性能优化(五)优化细节

优化细节 当使用数据库列进行查询的时候尽量不要使用表达式,把计算结果放到业务层而不是数据层尽量使用主键索引,而不是其他索引,因此主键索引不会触发回表查询使用前缀索引 有的时候需要索引很长的字符串,这会让索引变的大且慢&…

Ethercat系列(1)COE非周期性数据通信

Ethercat主站通过读写邮箱数据SM通道实现非周期性数据通信。邮箱数据定义邮箱数据单元结构邮箱数据头各字段含义如下表非周期性邮箱数据通信EtherCAT协议中非周期性数据通信称为邮箱数据通信,它可以双向进行---主站到从站和从站到主站。它支持全双工,两个…

存储介质还是存储载体,这不是个问题

在档案领域中,“介质”和“载体”到底有什么区别?能不能混用?这个问题曾经困扰了笔者10几年,直到最近才发觉原来根本不是一个问题。我们先来看两句话: 1、磁盘、光盘、固态硬盘等常见数据存储载体的寿命无法满足电子档…

RabbitMQ快速入门和使用

文章目录1. 基础理论1.1. 同步调用与异步调用1.2. RabbitMQ 安装与运行1.2.1. 常见消息模型2. 基本消息队列的应用2.1. 消息发送流程2.2. 消息接收流程3. SpringAMQP的基础理论与应用(想快速应用看这里)3.1. 基础理论3.2. 【案例一】实现HelloWorld中的基础消息队列功能3.3. 【…

Neo4j数据库模糊查询

1、Neo4j单个查询条件模糊查询1.1使用 ~’.模糊匹配对象.’ 进行表示1.1.1 查询节点MATCH(n:Author) WHERE n.name ~.*梦.* RETURN n1.1.2 查询关系MATCH p({title:锆石U-Pb和Lu-Hf同位素研究内蒙乌努格吐山斑岩型铜钼矿岩浆岩特征})-[r:has_illustration]->(i:Illustration…

Python应用开发——制作bin文件

Python应用开发——制作bin文件 目录Python应用开发——制作bin文件前言1 环境搭建2 代码编写与测试结束语前言 什么是bin? bin是二进制文件,其用途依系统或应用而定。一种文件格式binary的缩写。一个后缀名为".bin"的文件,只是表…

无代码配置态势感知分析应用,预判你的预判

森林发生火势灾情时,应急管理中心快速做出部署,实时监测并分析演变趋势大型交通事故发生,应急指挥中对前端人员、车辆的远程调度线路规划实时监测无人机对电站电厂的运维工作公安警务对嫌疑人、嫌疑车辆等目标的跟踪侦查……以上这些&#xf…

Acwing---基础算法(一)

文章目录 快速排序归并排序整数二分浮点数二分一、快速排序 #include<iostream>using namespace std;const int N 1e6 10;int n; int q[N];void quick_sort(int q[], int l, int r) {//此时区间只有一个数或者没有数不需要排序了if (l > r) return;int x q[l], i…

【QCA】【实例】高通DTS中添加BLSP设备节点的基本配置

文章目录0. env1. 简介2. 需求及资料2.1 需求2.2 资料3. DTS实际配置及简述0. env IPQ601x SPF11.5cs 1. 简介 BLSP(BAM Low-Speed Peripheral) 不同chip有不止一组的BLSP&#xff0c;每个BLSP又有多个端口供使用。 每个端口功能可以复用为&#xff1a;SPI 或者 I2CUART 2. 需求…

计算机网络知识详解之:TCP连接原理详解

网络知识详解之&#xff1a;TCP连接原理详解 文章目录网络知识详解之&#xff1a;TCP连接原理详解TCP连接三次握手一、准备工作二、一次握手三、二次握手四、三次握手为什么TCP客户端最后还要发送一次确认呢&#xff1f;为什么要3次握手?握手中的SYN超时重试TCP协议缺陷四次挥…

HECS 安装mqtt

下载(hecs &#xff0c;centos8的样子&#xff0c;对mosquitto 版本高了安装不了)wget https://mosquitto.org/files/source/mosquitto-1.5.9.tar.gztar -zxvf mosquitto-1.5.9.tar.gz安装前置工具yum install gcc-cyum install cmakeyum install openssl-devel编译cd mosquitt…

Vue项目启动后跳转到制定路由页面

前言 今天把自己的项目布局完成了&#xff0c;但是想在项目启动的时候默认跳转到登录页面。 这其实需要借助路由实现跳转 开始编写之前&#xff0c;大家可以看下我的布局&#xff1a; 安装并使用路由 关于如何安装并使用路由&#xff0c;可以参考&#xff1a;Vue安装并使用路…

LeetCode_单周赛_330

6337. 统计桌面上的不同数字 代码 后面出现的数字都是小于 n 的。 n 1 时&#xff0c;答案是 1。 n > 1时&#xff1a; 第一天&#xff0c;n % (n - 1) 1&#xff0c;n - 1会被加入第二天&#xff0c;(n - 1) % (n - 2) 1&#xff0c;n - 2 被加入 递推&#xff0c;一…

Java 8 Optional 介绍

1. 前言 空指针确实会产生很多问题&#xff0c;我们经常遇到空的引用&#xff0c;然后又想从这个空的引用上去获取其他的值&#xff0c;接着理所当然的碰到了 NullPointException。这是你可能会想&#xff0c;这报错很好处理&#xff0c;然后你看了眼报错行数&#xff0c;对比了…

聚合函数学习

文章目录聚合函数介绍理解类型语法AVG和SUMMIN和MAX函数COUNT函数GROUP BY基本使用使用多个列分组GROUP BY中使用WITH ROLLUPHAVING基本使用WHERE和HAVING的对比SELECT执行顺序查询结构SELECT执行顺序SQL 的执行原理聚合函数介绍 理解 聚合&#xff08;或聚集、分组&#xff…

java集合类-Map

Map-增强的Map集合 Map用于保存具有映射关系的数据&#xff0c;因此Map集合里保存着两组值&#xff0c;一组值用于保存Map里的key&#xff0c;另外一组值用于保存Map里的value&#xff0c;key和value都可以是任何引用类型的数据。Map的key不允许重复&#xff0c;即同一个Map对象…

【Linux】TCP三次握手,四次挥手原理

今天在书中找到了比较详细的解释&#xff0c;记录一下 三次握手 在可以使用TCP链路之前&#xff0c;必须在客户端和主机之间显式建立连接。如上所述&#xff0c;在主动&#xff08;active&#xff09;和被动&#xff08;passive&#xff09;连接的建立方式是有区别的。 内核…

生鲜巨变:每日优鲜、叮咚买菜、盒马“分道扬镳”?

此前&#xff0c;在疫情影响下&#xff0c;人们出门购物频次减少&#xff0c;传统买菜模式也受到了一定的冲击。在此背景下&#xff0c;既能够解决人们买菜难题又能够减少人与人接触的生鲜电商&#xff0c;赢得了众多消费者的青睐。而随着大量用户涌入其中&#xff0c;整个生鲜…

【GD32F427开发板试用】硬件IIC读取SHT40温湿度传感器

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;烟花易冷 介绍 很荣幸又能再次的参加技术社区的开发板试用活动&#xff0c;此次参加用的是GD32F427系列的芯片&#xff0c;该芯片相较于GDF31…

OpenPPL PPQ量化:原理与实践

目录 量化原理 为什么需要量化&#xff1f; 量化粒度 框架综述 算子划分 量化中的图融合操作 量化实践&#xff1a;以pytorch mobilenet v2 模型为例 源码阅读 torch模型和onnx量化过程中的区别 后记 量化原理 为什么需要量化&#xff1f; 1、减少内存带宽和存储空…