惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
博客园 - Franky
J
Java Code Geeks
V
Visual Studio Blog
G
Google Developers Blog
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
博客园 - 司徒正美
The GitHub Blog
The GitHub Blog
腾讯CDC
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
博客园 - 【当耐特】
IT之家
IT之家
I
InfoQ
U
Unit 42
C
Check Point Blog
Martin Fowler
Martin Fowler

Mobility

从薅 token 到管 skill:我的 pks 工具落地实践 把笔记、微信读书、知乎装进 Obsidian:我基于llm-wiki知识中枢搭建实录 免费AI视频生成器:我如何用零成本做出带旁白字幕的多场景AI视频 Agnes免费模型真能白嫖视频?我改造了ViMax来试试 教你薅token(二):构建agent无关的skills管理工作流 教你薅token:构建agent无关的AI工作流 用 AI Agent 完成 Hexo 主题迁移:从 Next 到 Butterfly 的全自动化实践 Vercel封禁163邮箱后,我是怎么恢复博客的 用LLM管理安全开发规范:一次llm-wiki实践 Vaadin框架教程:Java工程师的前端开发秘籍 hexo多语言方案总结及最佳实践 知乎增强工具-评论时间精确到秒 怎么理解数据库的四个隔离级别 kubernetes是什么-实用向教程 怎么更科学的用知乎摸鱼 读书笔记《系统之美》,如何面对现实中的复杂问题 分布式系统设计中的通用方法 SSP,DSP,RTB,ADX都是什么? 讲讲互联网广告的概念与发展 从redolog,undolog到隔离级别,刨根问底,讲清楚事务和ACID java项目低学习成本使用kubernetes的实践经验 剧变中的2021-一个中年工程师的年终总结 kubernetes环境下做金丝雀发布的一种思路 prometheus教程: 一篇文章讲懂prometheus 实现一个简单的java版本高性能获取ip地址所属国家工具 iterm2配置ssh书签, 实现记住密码和自动登录 怎样做一个好的技术分享 云原生究竟是什么 读书笔记 稻盛和夫《干法》-思考应该怎样去工作 review的个人价值 户口?大厂?高薪?生活?聊聊应届程序员的职业选择
高并发解决方案很难吗?轻松聊清楚高并发设计
流沙 · 2022-03-29 · via Mobility

高请求并发就一定会有高并发问题吗?其实不是的。可以设想一下,假如我们的应用全是内存逻辑,无论请求量再大,其实我们简单的增加节点就可以解决问题,那么自然不存在所谓高并发问题。高并发问题之所以存在,是因为系统中存在一些单点瓶颈,这个瓶颈是无法靠粗暴扩容解决的,所以我们才需要找别的方案解决这个问题。

事实上,这个瓶颈,绝大多数情况下都是数据库。

对于90%以上的场景来说,高并发问题本质的难点就在于数据库能够承载的并发是有限的。而各种高并发技术方案的作用归根结底其实也都是去降低单库的连接数,

比如:

系统拆分:首先将不同业务的库分开,每个业务可以各自独享一个数据库;

缓存:使用缓存降低需要访问数据库的比例;

MQ等方式削峰:避免瞬时的数据库连接数过多;

分库、分表、读写分离:对同一业务的数据库做进一步的拆分,降低单库的访问量;

引入elastic search, clickhouse等其他存储:与上一条类似,将一些不适合mysql的业务拆分出来,进一步降低mysql的并发;

上面的思路,是提升应用的处理能力;不需要所有请求都去连数据库,那么自然就可以承载更高的并发了。

另一个方向的思路,是限流,这样做的主要意义有两个:保证处理能力内的这一部分请求能够被正常处理,而不是拖垮所有请求; 即使有问题,也将问题限制在一个很小的范围。

限流的方式很多,比如我们熟悉的漏桶、令牌桶等算法,这里就不再细说。

除此之外,还有各种我们所熟悉的“池子”,比如tomcat连接池、线程池等,包括应用里的mysql连接池,其实也是在限制能够被发出的最大请求数。

为了确定这些池子的状态,要做好监控,比如tomcat的活跃连接数、mysql的活跃连接数等等,快要满的时候就要看情况准备扩容了。

如何给这些池子设置更合理的参数,保证:机器的数据库的资源被充分利用;池子未满时,确定不会超过数据库的负载

这样理解下来,我们也就知道为什么大部分讲高并发处理思路的文章,关注焦点都在缓存、分库分表、连接池优化这些事情上了。

原文地址: https://lichuanyang.top/posts/11970/