由《羊了个羊》想到的高并发架构之路

news/2024/4/28 3:27:35/文章来源:https://www.cnblogs.com/technology178/p/16717475.html

前言

    要说最近一段时间最火的话题是什么,那必定是《羊了个羊》,频频冲上微博热搜第一。因访问量骤增,大量玩家涌入进来,高并发流量导致游戏服务器被接连击穿。《羊了个羊》服务器几天内就出现了多次异常,无法登录游戏。

问题思考

    我想这其中多次崩溃的原因可能很多:可能是高并发流量导致服务器负载打满,引发宕机;可能是数据库查询量较大,出现性能瓶颈;也可能是高并发访问将缓存击穿;还有可能是受到ddos攻击......

    曾经我面试的时候就有面试官问道:“现在让你设计一个业务场景,客户端访问我们的业务服务端,从最初的业务规模很小,到后面业务规模业务很大,你应该如何设计并改进?”

    现在具有一定规模的业务场景必定都采用了高并发的架构。

    本文将以业务刚开始搭建到业务规模壮大为引子,详细讲一讲高并发架构是如何一步一步实现的,也很好的回答了上面的那道面试题。

高并发架构演进

1. 单机架构提供服务

业务初期,用户量很少,百来十个请求,一台服务器就可以部署应用和数据库
使用后端编程语言(python、go、php、java)开发一个应用程序,然后使用一个数据库(mysql、sqlserver)再存储业务数据。应用和数据库运行在同一台机器上面,开始对外提供服务。

2. 应用服务和数据库分离

用户开始增多,应用服务和数据库产生资源争抢,一台服务器使用起来够呛,于是将应用服务和数据库进行拆分,一台服务器专门跑应用程序,一台服务器专门跑数据库。

3. 增加缓存数据库

随着用户量进一步增多,每次访问都和数据库交互,会十分影响系统的响应速度,所以可以使用缓存技术。针对热点数据,直接从内存中取出来返回,加快响应速度。

4. 引入负载均衡

用户量还在进一步增多,单一应用服务器性能不足以支撑业务,系统开始变得卡顿。为了防止宕机导致业务不可用,这时需要增加多台应用服务器,形成集群,使用负载均衡进行负载(软件负载均衡nginx、haproxy),提高并发访问量。

5.数据库读写分离

用户数量的增长,数据量激增,数据库的读写压力就增大了。数据库开始出现瓶颈,读写变慢。但对于数据库来说,无法简单的应用集群来解决压力问题,因为数据会不一致,所以需要采用读写分离,写走主库,读走从库(事务中的读也要走主库)。

6.数据库拆表分库

业务数据量越来越大时,所有的业务都存储在单一的数据库中,即使单一的数据库已经做了读写分离,但是因为数据量庞大,依然无法满足系统性能的要求,这时就需要拆表分库。同一张表的数据拆分到多个数据库中(水平拆分),把单个数据库中的不同业务拆分到不同的数据库服务器中(垂直拆分)。

7. 使用硬件负载均衡

业务越来越火爆,用户量还在激增,最终软件负载均衡也扛不住了。那就采用硬件负载均衡(F5),将流量分发到不同的软件负载均衡上面,提高访问性能。

8. DNS轮询负载

当用户还在数几十万几百万的增长时,硬件防火墙也扛不住了。这时咱们再采用DNS轮询的方式,将访问域名解析到多个机房的IP上面,不同地区的用户访问到不同的IP上面。千万级到亿级的并发量都可以通过增加机房来解决。

9. 引入高防系统

随着业务的知名度越来越高,可能会受到外部的ddos攻击,导致正常的请求流量无法进入系统,用户访问失败。这时就需要引入高防系统,清洗异常流量。

10. 引入WAF应用防火墙

后来,业务系统经常受到SQL注入、XSS跨站、Webshell上传、CC攻击。这时需要引入WAF应用防火墙,有效识别Web业务流量的恶意特征,在对流量清洗和过滤后,将正常、安全的流量返回给服务器,从而保障系统的业务安全和数据安全。

上面讲解了高并发架构的演进之路,当然,根据实际业务情况,我们可能还需要引入Nosql数据库,时序数据库,消息队列,CDN等系统,甚至需要进行微服务的拆分,进一步强大健壮我们的业务系统。

参考文档

https://mp.weixin.qq.com/s/BABN6y2mYj2Cd-p0dlb6Ug

微信关注我,获取更多干货!

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

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

相关文章

【复习】maven

1.maven的概述 1.2 为什么需要maven 环境的构建 清理:删除上一次构建的结果,为下一次构建做好准备编译:Java源程序编译成*.class字节码文件测试:运行提前准备好的测试程序报告:针对刚才测试的结果生成一个全面的信息…

MQ 消息队列时如何确保消息不丢失

面试官在面试候选人时,如果发现候选人的简历中写了在项目中使用了 MQ 技术(如 Kafka、RabbitMQ、RocketMQ),基本都会抛出一个问题:在使用 MQ 的时候,怎么确保消息 100% 不丢失? 这个问题在实际工作中很常见,既能考察候选者对于 MQ 中间件技术的掌握程度,又能很好地区分…

大数据开发!Pandas转spark无痛指南!

💡 作者:韩信子ShowMeAI 📘 大数据技术◉技能提升系列:https://www.showmeai.tech/tutorials/84 📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40 📘 本文地址:https:/…

Runc 漏洞(CVE-2021-30465)离线修复

文章目录前言一、漏洞详情二、修复步骤2.1 下载离线包2.2 检查runc版本2.3 查看runc安装路径2.4 备份runc2.5 替换二进制文件2.6 检查版本前言 runC 是 Docker,Kubernetes 等依赖容器的应用程序的底层容器运行时。此次爆出的严重安全漏洞可使攻击者以 root 身份在主…

java并发编程学习六——乐观锁CAS

文章目录一、CAS原理1.1 无锁保护共享变量1.1.1 不安全模式实现1.1.2 有锁安全实现1.1.3 无锁安全实现1.2 cas工作方式1.3 CAS的效率和特点二、原子整数三、原子引用3.1 AtomicReference3.2 ABA问题3.3 AtomicMarkableReference四、原子累加器一、CAS原理 CAS全称CompareAndSe…

【C++学习】C++入门知识(上)

🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! 到这里,本喵的C语言学习暂时就告一段落了,开始C的学习了,同样的&a…

Ubuntu安装opencv4(c++)遇到的问题及解决方法

安装教程,参考 Ubuntu 18.04安装c版OpenCV4 问题1:opencv无法下载IPPICV的问题 ippicv_2020_lnx_intel64_20191018_general.tgz 解决办法:解决编译opencv时,卡在IPPICV: Download: ippicv_2020_lnx_intel64_20191018…

hive开启自动转化common join和map join 带来的问题

背景: 我们采用的hive版本是3.1.2属于较新版本,此版本下hive本身默认开启map join 相关配置 hive默认开启map join,涉及的配置如下: hive.auto.convert.jointrue错误分析 错误发生在我们使用曝光转化明细宽表和素材维表进行j…

Bunifu UI WinForms 6.0.1 Crack

现代强大的设计元素 无论您是设计简单的 UI 还是需要高级用户界面和用户体验控件和组件,Bunifu 框架都配备了实现任何现代设计所需的一切。 用户界面和用户体验 您可以设计的内容没有限制 画廊 通过 Bunifu Rating 从您的应用中获取反馈 画廊 使用 Bunifu 面板…

【初学者入门C语言】之while、do-while、break及continue语句(五)

个人主页:天寒雨落的博客_CSDN博客-python,c,安装教程领域博主 💬 刷题网站:一款立志于C语言的题库网站蓝桥杯ACM训练系统 - C语言网 (dotcpp.com) 特别标注:该博主将长期更新c语言内容,初学c语言的友友们&#xff0…

javascript: 复制对象时的深拷贝及浅拷贝(chrome 105.0.5195.125)

一,js代码<html> <head><meta charset="utf-8"/><title>测试</title> </head> <body><button onclick="assign()">无效:变量直接赋值</button><br/><br/><br/><button oncli…

Android 资源文件存放位置 Drawable 与 Mipmap 区别

Drawable Drawable 文件夹存储 bitmap 文件(png, jpeg, gif)、9-patch 文件 和 xml 文件&#xff0c;这些文件用于描述包含多种状态 (normal, pressed, focused) 的可绘制形状或可绘制对象。 android 的 drawable 文件一共可以有&#xff1a; drawable-ldpi (低密度) drawable-…

如何根治 Script Error.

作者&#xff1a;卢峰&#xff08;清锐&#xff09; 本文简要介绍了 Script Error 问题的来龙去脉&#xff0c;但也不局限于 Script Error&#xff0c;对于通用的系统性问题&#xff0c;应该找到系统性解决方案&#xff0c;进而治标治本。 Script Error 原因与当前解法 受浏览…

第一个spring项目

第一个spring项目 1、maven依赖导入 <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.22</version> </dependency> <dependency><groupId>junit</gro…

计算机毕设源码网站基于SpringBoot的阳光线上交友系统

&#x1f345;文末获取联系&#x1f345; 目录 一、项目介绍 二、开题报告 三、截图 四、源码获取 一、项目介绍 基于SpringBoot的阳光线上交友系统-计算机毕设java毕业设计项目源码-可定制-IT实战课堂_哔哩哔哩_bilibili项目资料网址: http://www.itszkt.com毕业设计…

Python 内存管理的工作原理你了解吗?

Python 为开发者提供了许多便利&#xff0c;其中最大的便利之一是其几乎无忧的内存管理。开发者无需手动为 Python 中的对象和数据结构分配、跟踪和释放内存。运行时会为你完成所有这些工作&#xff0c;因此你可以专注于解决实际问题&#xff0c;而不是争论机器级细节。 尽管如…

唯杰地图之前端CAD图GIS数据访问权限配置

前言 数字经济时代,数据要素的价值日益凸显,与之相应的,数据安全问题也越来越受到重视。唯杰地图 VJMAP为CAD图或自定义地图格式WebGIS可视化显示开发提供的一站式解决方案,支持的格式如常用的AutoCAD的DWG格式文件、GeoJSON等常用GIS文件格式,它使用WebGL矢量图块和栅格瓦…

一文清晰讲明白DDD(领域驱动设计)的知识点

什么是DDD DDD&#xff08;领域驱动设计&#xff09;是一种处理高度复杂领域的设计思想&#xff0c;是一种架构设计方法论&#xff0c;是一种设计模式。以高内聚低耦合为目的&#xff0c;把一个复杂的软件应用系统中各个部分进行一个很好的拆解和封装&#xff0c;对软件系统进…

运算放大器积分电路上并联的电阻什么作用

学过模电的同学对运放积分电路应该都不会陌生&#xff0c;基本电路如下图中所示 积分电路主要是用来进行波形变换&#xff0c;放大电路失调的消除&#xff0c;以及反馈控制中的积分补偿。 常用积分电路将方波变幻成三角波&#xff0c;或者正弦波变成余弦波&#xff0c;今天我们…

拍照识别花草软件有哪些?识别植物花草的软件哪个准?

不知道有没有小伙伴和我一样&#xff0c;好奇心比较旺盛&#xff0c;遇到问题都喜欢打破砂锅问到底。就连平时在路上遇到一些好看的花花草草时&#xff0c;我都想知道它是什么。但是花草这些就比较特殊&#xff0c;想了解它的身份&#xff0c;光靠描述可行不通。借助识别工具来…