对于高并发的一些思考

夜宵时的思考

刚刚排错了一个小时,终于搞定了,奖励自己一碗泡面,在等微波炉前等待的时候想了挺多事的。

并发似乎是所有程序员的噩梦,也是所有程序员的“粮食”,如果计算机不支持并发,世界上的Error Log应该能少一半,同时程序员的”魔力“也少了三分。

所谓的秒杀系统,其实是一种泛指,代表着多并发,高可用系统。为什么说至今没有一个类似Spring一样的框架,能在并发领域脱颖而出呢,因为每个领域,各个场景的情况不一样,每个解决并发的方案,脱离了实际,就没了价值。

面熟了,我依旧在思考,如果有可能的话,我会怎么去实现一个高并发的方案呢。

以我最近在写的“秒杀”系统为例,一群人,同一时间,抢一个东西。我能怎么去优化呢?

从数据库入手:减少数据库操作

数据库在哪?磁盘。CPU的速度和磁盘的速度差几倍?差不多就像马云的赚钱速度和我的赚钱速度的差距吧。因此,必须减少对数据库的访问,能少则少。

还有另一个原因,如果每多一次对数据库的操作,则高并发导致的数据不一致的风险也高了一分。(脏读,幻读等)如何解决这个问题?缓存呗,加锁呗。这个是老生常谈了,对于缓存的思考,后面再讲。

数据库也要划分:订单DB,支付DB。尽量不要在一台DB上布置多个表对象。

此外,还有一个概率,是我上数据库课的时候,想到的一个方案:

可不可以设两台机器,上面的数据库是同一个(双点),一台负责读,一台负责写?这样既解决了备份问题,有解决了IO切换问题。

从用户入手:增加答题环节

这个解决方案有点缺德,同时也必不可少,除了能拦截刷单机器人,还能把激增的用户量分流了,就像大坝一样,一下子拦住了大水,再慢慢放出去。但是,不能把题目设置太偏僻(如早期的12306)。

我今天写“秒杀”功能的代码时,每次写到SQL语句,我都在想,这有必要吗?

还真没必要!复现一下,当我写完“购买”功能后,正常思路是什么?查询库存?这就对数据库一次操作了。高级点的做法是把“库存数据”放在缓存当中,每次购买时查询。

再高级点的做法是防患于未然,当我在对用户“分流”时,我只放等于库存数的请求,然后关闭接口。后面的人也不用查询数据库和缓存了,你们来晚了。

从系统入手:系统分级

这里的系统指的是根据功能划分的系统,在“秒杀”系统中,什么系统的等级最高?支付系统,然后是优惠券系统等。我们可以吧支付功能系统的等级设置为最高,在资源不够时,优先给等级高的系统分配。不要让不重要的系统拖慢了高等级系统,这个做法带来的弊害还被人“津津乐道”,就是去年双十一的时候,无法更改收货地址。(退款系统也无法运行)

而且,不要让高等级系统去依赖低等级系统,这样就自相矛盾了。

说明这个做法在业内已经是一个标准了,其实解决高并发,就是取舍。

从数据入手:提前布局

还是双十一为例:你是不是会在双十一前一个月就开始物色你的猎物?

然后加入购物车。对了,通过类似购物车的系统,后台能知道有哪些东西是“热点数据”,然后对他们进行“优化”与”隔离“。

优化能理解,但是隔离是什么意思?

我们不能因为小部分商品的带来的请求而拖垮了大部分商品,因此最好对热销商品隔离,美女们抢你们的五折化妆品,不要打扰到我抢一折咖啡。

还有优惠卷等,这些其实都是可以提前计算的,没必要浪费并发时的计算资源,大多数人都是在购物车计算完最终价格,然后掐着时间点击购买。

因此,优惠券系统在双十一的时候,并没有造成多大的性能损失。反而变成了一个数学难题。

从缓存入手:集群与划分

在高并发的世界里,缓存就是金钱。集群就是军队。

像库存这样的重要数据,完全值得划分出一块缓存集群专门供他使用。

像支付系统这样大佬,也完全值得划分一块集群给他。

缓存集群有什么好处?便于维护,好打理,好定制。可以根据要处理的数据的特点,去定制和维护,比如处理库存数据的缓存,完全可以不支持范围查找。通过对商品的唯一ID进行HASH,直接定位到桶上。

再高层面点,对“缓存”进行hash。把每台机器当初一个桶,然后建造一个大型的hashMap。HashMap的检索速度,大家有目共睹。

从队列下手:服务排队

这里的服务,指的是库存服务,订单服务这种,我们可以在应用层进行排队,插队,比如库存服务优先。

暂时写到这吧,有点晚了。

原文地址:https://www.cnblogs.com/Jun10ng/p/12393180.html

时间: 2024-10-24 08:38:29

对于高并发的一些思考的相关文章

【转】腾讯高级工程师:一道面试题引发的高并发性能调试思考

https://dbaplus.cn/news-21-625-1.html 这样打破沙锅问到底的精神十分可贵!注意其中用到的工具 4月份的时候看到一道面试题,据说是腾讯校招面试官提的:在多线程和高并发环境下,如果有一个平均运行一百万次才出现一次的bug,你如何调试这个bug?(知乎原贴地址如下:https://www.zhihu.com/question/43416744) 遗憾的是知乎很多答案在抨击这道题本身的正确性,虽然我不是这次的面试官,但我认为这是一道非常好的面试题.当然,只是道加分题,

关于高并发的一些思考

1.什么是高并发? 高并发是解决大数据量业务的一种思路,源于现实的生产生活中的问题. 举一个现实生活中的例子:去银行办业务,银行里段时间来了100个人办理业务,但是只有一个窗口来办理,平均一个人办完业务需要5分钟,100个人需要500分钟. 当出现类似问题的时候,我们应该怎样去解决呢? (1)提高单个窗口办理业务的效率,比如提高柜台营业员的业务水平,之前5分钟能够办理1个人, 现在可以办理2个人,提高单人处理效率,那么100个人办完需要250分钟: (2)当单个人的处理效率达到最大时,应该如何继

高并发秒杀系统--课程总结与思考

[高并发秒杀系统的开发流程及技术要点] DAO层 1.数据库设计和实现,手写DDL 2.Mybatis理解和使用技巧,主配置,XML中SQL的编写 3.Mybatis与Spring的整合,包扫描,DAO实现,别名识别 Servcie层 4.业务接口的设计和封装,使用者角度设计接口 5.SpringIOC配置技巧,注解+XML 6.Spring声明式是事务使用和理解 Web层 7.Restful接口运用 8.SpringMVC的使用技巧 9.前端交互分析过程 10.Bootstrap和JS的使用,

多 “维” 优化——前端高并发策略的更深层思考

作者:徐嘉伟,腾讯web前端开发 高级工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest 导读 一项指标的变好,总少不了相应优化策略的实施.优化并不是简单的一蹴而就,而是个不断迭代与推翻的过程.更深层的优化方案,往往是在某种思维策略之下,对问题场景和基本策略优缺的深刻理解后做出的当下最优的权衡结果.本文笔者从前端高并发优化这一具体点出发,逐步向大家阐述笔者在优化的"术"之上思维层面的一些思考.希望能给各位带来共鸣和感悟. 背景: 之所以会以前端高并发这

对mysql的高并发优化配置的一些思考

对mysql的高并发优化配置的一些思考 mysql的高并发优化配置方案很多,但是适应你自己的就变得很少了,我们对数据库的优化,无非就是为了应对mysql的高并发情况罢了.随着大数据的时代的到来和网络用户的增多,很多企业中,可能每天应对的数量达百万,千万,甚至上亿的pv量,这样的量已经是超过普通配置的mysql所承受的量,所以应对日益增长的pv量,我们需要对mysql做出相应的对策,进一步优化mysql,达到我们所预期的效果,预防因为高并发所引起的mysql宕机,通过调试优化mysql,我们便可以

高并发高可靠性系统思考1

CPU不是瓶颈,网络才是: 墨菲定律:任何事情都没表面看起来那么简单:会出错的总会出错: 可靠性: 集群:无状态集群:有状态集群,很难处理,尽量剥离出状态部分做集中式部署,其他做无状态部署: mater/slave,极端情况下快速切换,恢复系统的可用性,软件层面和硬件层面: 数据:raid磁盘阵列,双写(同步,可靠性高,影响效率:异步,可靠性低): 跨机房,跨网络(电信,移动),跨交换机部署: 限流/流量切换:超过系统预估负载能力时,可选择直接将部分请求丢弃,来保证部分用户的适用,一般在硬件或h

高并发思考和解决办法

系统高并发操作会出现系统访问性能问题,死锁,数据不同步等一系列问题.用电商系统来说,高并发下,会出现访问的订单状态不一致的情况.那么可以考虑对此问题做集群处理. 客户端2亿访问量就是高并发业务场景,会出现相应的问题. 现在考虑组成集群 经过负载后 压力平摊到多个节点,分担单实例的压力(多实例+负载),如图: 应用组成了集群,但是连接的还是一个存储,这个时候,所有的实例如果在储存上还是一个库,瓶颈就在存储这一边了,在mysql下,可以考虑住数据库集群,主从配置,读写分离. 这样就储存的压力也分开了

思考如何做一个普通网站和高并发的网站

写写总结一下,分别用C#和Java如何构建一个普通网站和一个高并发.安全的网站. 构建一个普通网站的checklist:.net mvc:mvc+EF+mysqljava:主流仍然使用ssh2?纯前端如node.js的优势和缺点如何? 注意事项:基本架构,前端框架,数据库事务 脚本构建一个高并发的网站:基本架构上的调整:缓存的加入(如memcached等),多线程的使用,需不需要做成分布式结构(web service等),图片等静态资源的CDN网络:数据库表之间字段关联的设计,字段冗余的合理使用

php高并发秒杀系统的搭建总结思考(一)

秒杀系统大致分为三大块.客户端,服务器,后台管理.秒杀系统具有大流量高并发的特点. 对于web前端的处理,一般是页面静态化+CDN分布式缓存. 因为静态页面的处理速度是最快的.假设单台服务器nginx,1秒内可以处理的静态页面请求是1w,处理php程序可能是500每秒.这样在效率上就差很多.原因是php属于动态语言,服务器需要解释运行,这当中可能大量的I/O操作,加载扩展等.这就导致处理的时间比较长. 所以对于秒杀产品,一般都是在活动快要开始时,上线静态页面. 原文地址:https://blog