如何打造一个高并发系统?

news2025/5/31 19:26:09

今天和大家聊聊作为一个后端开发,在实际工作中,我们如何打造一个高并发的系统?
如下图所示,大概有六个层面,我们结合具体的场景直播间签到去一一细说。

在这里插入图片描述

一、前端

1、打散请求即把用户的接口分散一点去请求后端,尽量不要集中在某一时刻
场景:比如直播间讲师发起了一个签到,用户去点击签到,调用签到请求接口。假设这个直播间的在线人数上百万,那么这个签到接口的请求可能会有近百万的QPS。毫无疑问,这会对后端服务造成瞬时、巨大的流量冲击。
解决措施:这种瞬时洪峰流量,我们就可以在前端对用户签到接口做打散处理。比如针对直播间的在线人数,当超过某个阈值时,做3秒内任一毫秒的分散请求。避免这些请求在大流量直播的直播间里,瞬间同时请求过来,冲垮后端服务。

2、防抖防重即在前端加上防止重复点击、重复请求后端的逻辑。比如点击签到按钮后,前端做一些类似3秒的防重复请求处理,避免用户多次点击请求到后端,这样可以减少大量无意义无效的请求。

3、服务降级:在高并发、系统压力较大或部分服务出现故障时,通过暂时减少或关闭某些功能,以保证系统的核心功能仍然能够正常运行,避免整个系统崩溃。
场景:比如在签到服务中,用户签到是核心接口,当签到服务受到流量冲击导致压力过大时,可以将除该接口外的其它功能在前端暂时屏蔽掉(可配置),这样用户就不会去请求对应的接口了,优先保证核心接口正常运行。

二、Nginx/网关

1、负载均衡:这个应该大家都比较熟悉,就是尽可能将请求均匀地打在各个服务器上,常见的有轮询策略、hash策略等,就不一一赘述了。

2、网关限流:一般我们C端的服务都会有一个统一的网关系统,实现比如用户信息获取、路由的分发、接口限流等功能。我们对于C端的接口,在上线前会经过接口压测,然后根据压测结果设置接口限流值。在高并发场景下,比如签到接口设置的是10WQPS,我们就会把在同一秒内超过10W的请求直接在网关层丢弃掉,避免将下游的签到服务打挂

三、业务层

1、同步返回:比如前端请求签到接口,我们后端会返回签到成功给前端,但实际是否成功还不确定,因为我们肯定不会实时同步去查询或者写入MySQL。毕竟我们的MySQL还是比较脆弱的,经不住上万QPS同时操作

2、异步处理:跟上面其实意思差不多,同步返回结果,但我们会将实际的数据使用中间件如kafka、RocketMQ、RabbitMQ、Redis等进行削峰,然后推送到下游,最后使用脚本去消费推送的数据进行实际的逻辑处理。

四、数据层

1、本地缓存:感兴趣的可以翻翻 我之前写的文章 。可以说本地缓存是服务器上读写性能都最高的介质了,因为本地缓存是直接操作该服务器本身的内存呀。只要内存够大,几十万、几百万的QPS都轻轻松松不在话下

2、Redis缓存:Redis缓存的性能仅此于本地缓存,一般抗10万以下的QPS用Redis就够了。Redis缓存实际上也是操作的Redis服务器的内存,只是Redis服务器和本地服务器还有网络连接。所以Redis性能会比本地缓存稍微差一点,一般同等配置可能都会差一到两个量级。

3、MySQL:这个大家应该都很熟系了,常用的分库分表、读写分离等等这时都排上用场了。

五、底层架构

1、K8s弹性伸缩在高峰期提前扩容、高峰期之后缩容。在流量突刺时快速扩容,在流量下落时缩容。k8s提供了多种灵活的弹性伸缩机制,可以根据不同场景和需求自动调整集群的资源使用,确保系统能够在负载波动时稳定运行。根据实际的应用场景,合理配置这些伸缩机制,能够有效提升系统的弹性和可用性。最重要的是,比之前使用CVM物理机,能极大地降低服务器成本

2、微服务架构:微服务架构通过将单一应用拆分成多个独立的服务,使得每个服务可以独立扩展和维护,从而提高系统的可扩展性和维护性。例如直播间红包是一个服务、直播间签到是一个服务、直播间抽奖又是另一个服务…。这些服务通常是在单独的服务去维护,尽量做到互相隔离,互不影响

六、日志监控和告警

假如现网服务出现了问题,我们如何快速地感知呢?那当然是在各个关键服务都增加日志记录,然后增加监控告警,触发某个阈值时就告警。尽量在用户感知到问题前,我们去发现到并解决。

以上,就是我们在设计高并发系统时,需要考虑的一些问题和一些解决方案。当然,这里只是讲了大的宏观架构层面,落地到具体的业务场景中,还需要结合实际情况去思考一些细节和方案,去解决实际的性能瓶颈点,这是一件非常有意思的事,希望大家都能从解决问题中收获快乐

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

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

相关文章

acm培训 part 1(学习总结)

第一部分的重点为语法糖,时空复杂度,stl容器等等,下面就简单介绍一下这些部分。 1. 语法糖 1.1 定义 语法糖是由英国计算机科学家彼得约翰兰达提出的一个术语,指的是编程语言中添加的某种语法,这种语法对语言的功能…

【ComfyUI】python调用生图API,实现批量出图

官方给的示例: https://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyU…

【2024年华为OD机试】(B卷,100分)- 非严格递增连续数字序列 (JavaScriptJava PythonC/C++)

一、问题描述 题目描述 给定一个仅包含大小写字母和数字的字符串,要求找出其中最长的非严格递增连续数字序列的长度。非严格递增连续数字序列指的是序列中的数字从左到右依次递增或保持不变,例如 12234 就是一个非严格递增连续数字序列。 输入描述 输…

C# OpenCV机器视觉:红外体温检测

在一个骄阳似火的夏日,全球却被一场突如其来的疫情阴霾笼罩。阿强所在的小镇,平日里熙熙攘攘的街道变得冷冷清清,人们戴着口罩,行色匆匆,眼神中满是对病毒的恐惧。阿强作为镇上小有名气的科技达人,看着这一…

Android Audio音频系统

一、Audio音频架构简介 二、Android Audio系统框架 三、Audio架构以及各层的代码分布图 四、音频框架在Android系统中的进一步细化 五、创建声卡和注册声卡 六、Android Audio系统的结构 七、Audio音频原理介绍 八、Audio音频策略制定与策略执行的调用流程 九、Android…

配电自动化系统“三区四层”数字化架构

目录 一、“三区四层”数字化架构的特点和优势 二、“三区四层”数字化架构面临的挑战 三、针对“三区四层” 数字化架构在实际应用中面临挑战的措施 配电自动化系统 “三区四层” 数字化架构是一种用于规范和指导配电自动化系统建设与运行的体系结构,对保障电力…

编程界“华山论剑”:PHP与Go,谁主沉浮?

在编程的广阔天地里,选择一门合适的编程语言就如同为一场冒险挑选趁手的武器,至关重要却又常常令人纠结。当我们面对 PHP 与 Go 这两种备受瞩目的编程语言时,这种纠结愈发明显:PHP,作为 Web 开发领域的老牌劲旅&#x…

element tbas增加下拉框

使用Tabs 标签页的label插槽,嵌入Dropdown 下拉菜单,实现Tabs 标签页增加下拉切换功能 Tabs 标签页 tab-click"事件"(这个事件当中到拥有下拉框的tab里时,可以存一下Dropdown 第一个菜单的id,实现点击到拥有…

AIGC视频生成模型:ByteDance的PixelDance模型

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍ByteDance的视频生成模型PixelDance,论文于2023年11月发布,模型上线于2024年9月,同时期上线的模型还有Seaweed&…

mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看数据库,删除数据库,使用数据库;

SQL通用语法 SQL语句分类 DDL data definition language : 用来创建数据库,创建表,创建表中的字段,创建索引。因此成为 数据定义语言 DML data manipulation language 有了数据库和表以及字段后,那么我们就需要给这个表中 添加数…

Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用

QTableView 是QT的一个强大的表视图部件,可以与模型结合使用以显示和编辑数据。QSqlQueryModel、QSqlTableModel 都是用于与 SQL 数据库交互的模型,将二者与QTableView结合使用可以轻松地展示和编辑数据库的数据。 QSqlQueryModel的简单应用 import sys from PySid…

C语言文件操作:标准库与系统调用实践

目录 1、C语言标准库文件操作 1.1.题目要求: 1.2.函数讲解: fopen 函数原型 参数 常用的打开模式 返回值 fwrite函数 函数原型 参数 返回值 注意事项 fseek函数 函数原型 参数 返回值 fread函数 函数原型 参数 返回值 fclose 函数…

【2024年华为OD机试】 (C卷,100分)- 多段线数据压缩(JavaScriptJava PythonC/C++)

一、问题描述 问题描述 给定一个多线段的坐标列表,每个坐标由行号和列号表示。多线段的走向只能是水平、竖直或斜向45度。输入数据包含冗余的坐标点,要求输出最简化的坐标列表,仅保留起点、拐点和终点。 输入描述 输入数据为多线段的坐标…

状态模式——C++实现

目录 1. 状态模式简介 2. 代码示例 3. 单例状态对象 4. 状态模式与策略模式的辨析 1. 状态模式简介 状态模式是一种行为型模式。 状态模式的定义:状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 通俗的说就是一个对象…

数据库SQLite和SCADA DIAView应用教程

课程简介 此系列课程大纲主要包含七个课时。主要使用到的开发工具有:SQLite studio 和 SCADA DIAView。详细的可成内容大概如下: 1、SQLite 可视化管理工具SQLite Studio :打开数据库和查询数据;查看视频 2、创建6个变量&#x…

java开发,IDEA转战VSCODE配置(mac)

一、基本java开发环境配置 前提:已经安装了jdk、maven、vscode,且配置了环境变量 1、安装java相关的插件 2、安装spring相关的插件 3、vscode配置maven环境 打开 VsCode -> 首选项 -> 设置,也可以在setting.json文件中直接编辑&…

python爬虫的学习流程(1-前提准备)

这里主要记录一下我的python爬虫初级的学习的流程 1.python爬虫入门实战课 什么是爬虫?众说纷纭,我们引用维基百科上对网络爬虫的介绍: 网络爬虫(英语:Web crawler),也叫网络蜘蛛(…

数据结构初阶之双向链表的介绍与双向链表的实现

一、概念与结构 带头双向循环链表 next :指向下一个结点(后继结点) prev :指向前一个结点(前驱结点) 二、实现双向链表 项目创建的时候,要创建一个头文件(.h)List.h …

CICD集合(六):Jenkins配置Editable Email Notification

CICD集合(六):Jenkins配置Editable Email Notification 1、系统配置 1.1、Jenkins Location 1.2、邮件通知 1、SMTP服务器:imap.exmail.qq.com (因qq企业邮箱) 2、邮箱后缀:@xxx.com 3、勾选:使用SMTP认证 用户名:

Golang 中除了加锁还有哪些安全读写共享变量的方式?

Golang 中除了加锁还有哪些安全读写共享变量的方式? 在 Golang 中,除了使用 Mutex 锁来保护共享变量外,还可以通过 Channel 和 原子性操作 来实现安全读写共享变量。 1. 使用 Channel 原理 Channel 是 Golang 中用于 Goroutine 之间通信的…