千万级流量冲击下,如何保证极致性能

1 简要介绍

随着互联网的快速发展,网络应用的流量规模不断攀升,特别是在电商大促、明星直播、重大赛事、头条热搜等热点事件中,秒级100w请求成为了常态。在这样的流量冲击下,如何确保系统稳定、高效地处理每一个请求,为用户提供极致的体验,成为了技术团队面临的重要挑战。本文将深入探讨在超高流量下如何保证系统的极致性能。

2 架构建设方案

在解决千万级流量下的流量冲击问题时,我们需要综合运用多种技术手段,从系统架构、负载均衡、并发控制、缓存策略、数据库优化、限流等多个方面入手。

2.1 系统架构优化

系统架构是支撑高并发的基础。在应对千万级流量时,我们需要采用分布式、微服务化的架构,将业务拆分成多个独立的服务,每个服务负责处理特定的业务逻辑。通过水平扩展和垂直扩展相结合的方式,提升系统的整体处理能力。微服务架构可以参考作者的这个系列的文章《微服务系列》以下是微服务架构简图:

image

2.2. 负载均衡技术

负载均衡是实现高并发的关键技术之一。通过负载均衡器,我们可以将请求分发到多个服务器上,实现请求的均衡处理。常见的负载均衡策略包括轮询、加权轮询、最少连接数等。在实际应用中,我们可以根据业务需求和服务器性能选择合适的负载均衡策略,来协调多实例服务对每个分片流量分配的需求。负载均衡可以参考作者的这篇文章《图解常用负载均衡策略》。以下是负载均衡器在架构中的位置和职能。

image

2.3 异步处理与并发控制

通过引入异步处理机制,我们可以将耗时操作放在后台执行,避免阻塞主线程,提高系统的响应速度。同时,合理的并发控制也是必不可少的,我们可以利用线程池、信号量等技术手段来控制并发量,避免系统过载。

2.3.1 异步处理

互联网场景中经常使用消息中间件进行 异步处理\削峰 等操作,来缓解系统的压力。

1. 异步处理: 

处理一项任务的时候,有3个步骤A、B、C,需要先完成A操作, 然后做B、C 操作。任务执行成功与否强依赖A的结果,但不依赖B、C 的结果。如果我们使用串行的执行方式,那处理任务的周期就会变长,系统的整体吞吐能力也会降低(在同一个系统中做异步其实也是比较大的开销),所以使用消息队列是比较好的办法。

登录操作就是典型的场景:A:执行登录并得到结果、B:记录登录日志、C:将用户信息和Token写入缓存。 执行完A就可以从登录页跳到首页了,B、C让服务慢慢去消化,不阻塞当前操作。

image

2. 削峰:

 将峰值期间的操作削减,比如A同学的整个操作流程包含12个步骤,后续的11个步骤是不需要强关注结果的数据,可以放在消息队列中。

2.3.2 并发控制

可以通过一些办法来进行并发控制,如无效请求过滤和加锁等,避免大量的请求把系统冲垮。

1. Web端/客户端的超预期请求过滤

大部分的用户是没有耐性的,当你的系统因为吞吐过载迟钝(响应延迟)的时候,用户可能会反复的点击按钮、刷新页面来重启发送请求。这样会对原本就瓶颈的系统造成更大的伤害。最好的办法就是服务端响应回来或超时之前,对用户的重复请求无效。如:限制用户在5秒之内只能提交一次请求,避免系统过载。

2. 系统入口处(如网关接入层)的超预期请求过滤

大部分操作是需要有幂等性保障的。同一个用户对一个服务批量且持续的请求必然是不正常的,要么是程序错误导致的循环请求,要么是攻击性行为。可以根据用户Id或者用户的登录Token来识别用户,避免单位时间内(比如1s)的过量调用(比如1000次),通过这种限制来达到控制无效流量的目的。

3. 加锁进行并发控制

  • 系统程序级别的锁(如ReentrantLock),保持线程池的安全性,避免系统计算量过载参考作者这篇:Java核心知识体系8:Java如何保证线程安全性

  • 缓存层上的分布式锁,进行流量的有效控制参考作者这篇:Redis系列13:分布式锁实现

  • 数据库锁,最底层存储的数据一致性、有效性保障参考作者这篇:数据库系列:InnoDB下实现高并发控制

这些都是实现并发控制的关键机制。通过使用锁,我们可以确保在并发环境中对共享资源的访问是同步的,从而避免数据不一致或其他并发过载的问题。

2.4 缓存策略

缓存是提升系统性能的重要手段。通过缓存热点数据,我们可以减少对数据库的访问次数,降低数据库的压力。同时,缓存还可以提高数据的访问速度,提升用户体验。在实际应用中,我们可以采用Redis等内存数据库作为缓存层,通过合理的缓存策略实现数据的快速访问。

Redis官方站点中,有对Redis性能做了比较详细的压测,可以参考官方这一篇 How fast is Redis?,在较高的配置基准下(比如 8C 16G +),在连接数为0~10000的时候,最高QPS可达到120000。Redis以超过60000个连接为基准,仍然能够在这些条件下维持50000个q/s,体现了超高的性能。下图中横轴是连接数,纵轴是QPS。

image

下面这张图为data size 与整体吞吐量之间的趋向关系:

image

缓存可以扩展阅读作者的这个系列的文章:★ Redis24篇集合

2.5 数据库优化

数据库是系统的核心组件之一,其性能直接影响到整个系统的性能。在应对高并发请求时,我们需要对数据库进行优化,包括优化SQL语句、建立合适的索引、分库分表、数据单元化设计等。通过数据库优化,我们可以提高数据的查询速度,减少数据库的负载,从而提升整个系统的性能。

image

数据库的优化可以扩展阅读作者这两篇文章:MySQL索引优化总结(综合版)、MySQL分库分表

2.6 流量限流

在流量高峰时段,我们可以通过限流技术来控制请求的速率,避免系统过载。限流的目标是在系统压力过大时拒绝部分请求,并且failover到固定的响应信息,保护系统的稳定性。以令牌桶原理(定速流入)为例,每秒钟只提供N个令牌,每个请求携带一个令牌标识前行,用完即限行。如下图:

image

限流熔断可以扩展阅读笔者的这篇文章:微服务治理之限流、熔断

3 业务场景说明

在实际业务中,高并发的场景多种多样。以电商平台为例,在大促期间,大量的用户会同时访问平台,进行商品浏览、下单、支付等操作。这些操作都会产生大量的并发请求,对系统的性能提出极高的要求。此外,社交应用、在线游戏等也面临着类似的挑战。

4 总结

在千万级流量下保证并发请求的极致性能是一个复杂而挑战性的问题。通过综合运用系统架构优化、负载均衡技术、缓存策略、数据库优化等多种技术手段,我们可以有效地提升系统的处理能力和响应速度。同时,我们还需要根据具体的业务场景和性能需求进行针对性的优化和调整,以实现最佳的性能表现。在未来的发展中,随着技术的不断进步和业务的不断扩展,我们还将面临更多的挑战和机遇。只有不断地学习和探索新的技术手段和方法,我们才能更好地应对这些挑战,为用户提供更加优质、高效的服务体验。

文章转载自:Hello-Brand

原文链接:https://www.cnblogs.com/wzh2010/p/18031212

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖某音号解封释放实名

##抖音账号封禁后如何解封呢 我相信,做过抖音,或者正在做抖音的朋友,都曾面临一种尴尬至极的局面,辛辛苦苦做起来的账号,或者刚刚准备好的账号,在一时之间,竟然被抖音官方封禁了! 实…

ubuntu下使用cmake编译opencv4.8.0+ffmpeg4.2.2+cuda11.1

1.源码下载 (1)下载ffmpeg4.2.2、opencv4.8.0源码,这里提供一个百度网盘地址: 链接:https://pan.baidu.com/s/1pBksr0_RtKL0cM6Gsf2MGA?pwdcyai 提取码:cyai (2)解压所有文件 例…

小而美的算法技巧:前缀和数组

小而美的算法技巧&#xff1a;前缀和数组 类似动态规划。 class NumArray {private int[] preSum;public NumArray(int[] nums) {preSumnew int[nums.length1];//preSum[0]的前缀和为0for(int i1;i<preSum.length;i){preSum[i]nums[i-1]preSum[i-1];//先计算累加和}}publi…

Git进阶使用(图文详解)

文章目录 Git概述Git基础指令Git进阶使用一、Git分支1.主干分支2.其他分支2.1创建分支2.2查看分支1. 查看本地分支2. 查看远程分支3. 查看本地和远程分支4. 显示分支的详细信息5. 查看已合并和未合并的分支 2.3切换分支1. 切换到已有的本地分支2. 创建并切换到新分支3. 切换到远…

毕业年薪20w起!25届最近5年南京信息工程大学自动化考研院校分析

南京信息工程大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近4年考研分数情况 四、近4年招生录取情况 五、最新一年分数段图表 六、历年真题PDF 七、初试大纲复试大纲 八、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、…

掌握WhoisAPI,提升域名管理的效率

在互联网时代&#xff0c;域名管理是网站运营中非常重要的一环。通过域名&#xff0c;我们能够轻松访问和识别不同的网站。然而&#xff0c;域名的注册和管理也是一项复杂的任务&#xff0c;特别是对于大规模拥有许多域名的企业来说。为了提升域名管理的效率&#xff0c;我们可…

边缘计算网关在智慧厕所远程监测与管理的应用

随着智慧城市建设的不断深入&#xff0c;城市公共设施的智慧化管理成为了提升城市品质和居民生活质量的关键建设。公厕作为城市基础设施的重要组成部分&#xff0c;其管理效率和卫生状况直接影响着市民的日常生活体验。在公厕设施建设背景下&#xff0c;边缘计算网关技术的应用…

ansible离线安装docker

docker简介&#xff1a; Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者打包他们的应用以及应用的运行环境到一个可移植的容器中。这个容器可以在任何支持Docker的机器上运行&#xff0c;确保了应用在不同环境中的一致性。 网上有很多在线ansible安装docker的&…

Base64编码方式的介绍及其编码解码

一、Base64是什么 Base64是一种用于将二进制数据编码为ASCII字符的编码方式&#xff0c;主要目的是为了能够在文本环境中传输和存储二进制数据。这种编码方式广泛应用于电子邮件、HTTP协议和其他需要传输或存储二进制数据的地方。 二、发明Base64编码的原因 Base64编码的发明解…

猫狗识别(超详细版)(py代码)

猫狗识别&#xff08;一&#xff09; 二、视频识别 用OpenCV和Tkinter构建的视频识别猫狗的应用程序。它允许用户从文件对话框中选择一个视频文件&#xff0c;然后在Tkinter窗口中播放视频&#xff0c;并使用Haar级联分类器实时检测视频中的猫和狗。 1.导入所需的库&#xff…

QT--DAY1

不使用图形化界面实现一个登陆界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//设置窗口标题this->setWindowTitle("登录界面");//设置窗口大小this->resize(535,410);//固定窗口大小this->setFixedSize(535,410)…

北京多商入驻app开发项目的主要优势及功能

多商入驻app开发项目的定义 随着电子支付技术的不断成熟&#xff0c;全国各地的消费者通过网络在线上购物的频率越来越高&#xff0c;为此&#xff0c;多商入驻app开发项目应用而生。各商家也纷纷开始申请入驻商城平台&#xff0c;开设自己的店铺。 图片来源&#xff1a;unspl…

MAVEN-SNAPSHOT和RELEASE

一、快照版本SNAPSHOT和发布版本RELEASE区别 快照版本SNAPSHOT和发布版本RELEASE区别-CSDN博客 在使⽤maven过程中&#xff0c;我们在开发阶段经常性的会有很多公共库处于不稳定状态&#xff0c;随时需要修改并发布&#xff0c;可能⼀天就要发布⼀次&#xff0c;遇到bug时&am…

网络编程(三)UDP TFTP协议

文章目录 一、 UDP&#xff08;一&#xff09;概述&#xff08;二&#xff09;流程 二、收发函数&#xff08;一&#xff09;recvfrom&#xff08;二&#xff09;sendto 三、实现一个简单的udp服务端和客户端四、实现tftp客户端协议 一、 UDP &#xff08;一&#xff09;概述 …

vue 中多个表单元素控一个校验规则

1. 场景一 <el-form-itemlabel"确认时长方式"prop"preSubResourceDurationDay" ><div class"confirmDurationDay">最晚使用日期前<el-input-numberv-model"form.preSubResourceDurationDay":precision"0"cla…

为什么需要负样本

假如我们只有正样本&#xff0c;模型在最开始训练的时候都是错误的&#xff0c;随着模型的迭代&#xff0c;准确率逐渐从0到1&#xff0c;最终将所有的样本都判别成正样本&#xff0c;也就是都在线的上方。 但真实的场景中有正有负&#xff0c;例如我们要做一个猫狗分类器&…

jsp 实验20

三、源代码以及执行结果截图&#xff1a; NewFile.jsp <% page import "java.io.*" %> <% page contentType"text/html" %> <% page pageEncoding "utf-8" %> <jsp:useBean id"english" class "web.Engli…

nginx配置https协议(测试环境)

第一步申请证书 首先申请证书这一步&#xff0c;晚上有很多种方式实现&#xff0c;可以自己用算法实现&#xff0c;也可以找在线生成的网站&#xff0c;我这里使用了在线网站 https://www.toolhelper.cn/SSL/SSLGenerate 第二步将证书放到对应的目录下 这里我们主要用cert.pe…

基于JSP技术的大学生校园兼职系统

开头语 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;可以通过文末的联系方式找到我。 开发语言 JSP 数据库 MySQL 技术 JSP JavaBeans 工具 MyEclipse、Tomcat、Navicat 系统展示 首页 学生登录界面 招聘信息界面 论坛中心界面 摘…

028、工具_Pipeline

Redis客户端执行一条命令分为如下四个过程: 1)发送命令 2)命令排队 3)命令执行 4)返回结果 其中1)+4)称为Round Trip Time(RTT,往返时间)。 Pipeline(它能将一组Redis命令进 行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端,图3-…