新闻动态

高并发秒杀系统:开发高并发秒杀系统总结

发布日期:2021-01-04 13:01 | 文章来源:YINGSOO

  【温馨提醒】文章内容仅供参考,海外服务器租用\托管方案,请咨询YINGSOO客服,24小时免费电话400-630-3752

  【热门主机】韩国物理服务器vps韩国多ip服务器

  【热搜问题】韩国云主机推荐吗

高并发秒杀系统

  大家也许开发过高并发的系统或者秒杀程序,但肯定都有接触过,像电商平台的秒杀、抢购等活动,还有12306春运抢票。

  特点:时间短流量多,需要注意外挂。所以要单独提出秒杀系统。

  技术特点:瞬时高并发,多层次分布式处理,人机交互对抗

  一、系统环境搭建

  (1)技术选型

  linux+nginx+php+mysql+redis (开源、免费)

  cdn(分布式缓存),智能dns(多线路接入选择)

  负载均衡LVs,大型web集群(分流节点,达到高效稳定)

  (2)开发准备

  工具:eclipse for php 或 phpstorm 或 editplus、sublime

  部署环境:XAmpp / brew / yum

  代码管理:git /sVn

  (3)mysql封装

  pdo组件、常用增删改查

  利用开源代码 db、crud代码库

  (4)Redis封装

  (数据缓存,需要配置器)

  pHp客户端: phpredis /predis

  封装基本的redis资源连接和命令

  (5)debug封装

  定制日志和调试日志。学会调试事半功倍。

  二、系统设计

  (1)基本功能和流程

  后台:活动管理/商品管理/订单管理/日志管理

  前台:商品展示/秒杀/购物车/我的订单

  安全:验证码/问答

  (2)项目流程

  秒杀——>问答验证——>库存验证——>生成订单——>

  (3)数据库设计

  活动信息表,商品信息表,订单信息表,问答信息表,日志记录表

  (4)交互和页面设计

  后台:基本管理,列表增删改

  前台:商品展示,抢购,我的订单,购物车,登陆

  安全:防攻击,防作弊,防机器人。

  三、「开发」高并发秒杀系统总结:

  活动周期短,瞬间流量大(高并发),技术在这种情况下,会发生和要做的事。

  第一:高并发

  技术要做的事,一方面优化程序,让程序性能最优,单次请求时间能从50ms优化到25ms,那就可以在一秒钟内成功响应翻倍的请求了。

  另一方面就是增加服务器,用更大的集群来处理用户请求,设计好一个可靠且灵活扩充的分布式方案就更加重要了。

  第二:时间短

  火热的秒杀活动,真的是一秒钟以内就会把商品抢购一空,而大部分用户的感受是,提交订单的过程却要等待好几秒、甚至十几秒,更糟糕的当然是请求报错。

  那么一个好的秒杀体验,当然希望尽可能减少用户等待时间,准确的提示用户当前是否还有商品库存。而这些,也是需要有优秀的程序设计来保证的。

  第三:系统容量预估

  系统设计的时候,都需要有一个容量预估,那就是要提前计算好,我们设计的系统,要承载多大的数量级。

  假如线上前端服务器规格是8核16g内存的服务器,而提交订单的处理程序耗时100ms,那么可以简单计算一下:

每秒可以处理的订单请求数=1000ms/100ms*8=80qps

  上面这个结果,对于秒杀系统来说,肯定是非常不理想的。

  如果能[荷兰服务器]将处理程序耗时优化后,降低到10ms,那么就可以达到800qps。

  如果我们可以把程序继续优化,能快速区分开有库存和无库存处理,那么无库存时处理就有可能做到1ms甚至更低的耗时。这样无库存时就能有更好的性能,上万的qps也是可以达到的。

  上面的预估,都是针对单机,那么简单的增加前端服务器,是不是就能有更好的并发处理量呢?

  肯定没这么简单,因为数据库、缓存系统甚至机房网络带宽都会成为瓶颈。

  于是就要有一个更好的分布式方案。

  第四:好的分布式方案

  一个好的分布式方案,首先当然是稳定可靠,不要出乱子,然后就是方便扩充,最好的效果当然是增加一台服务器,并发处理量可以1:1线性增长。

  比如:单机qps是1k,那么10台服务器可以做到1w,100台可以做到10w每秒。

  要做到这样的线性增长效果,就要杜绝出现瓶颈,否则还是会代价太大。

  拒绝假的分布式尤其重要,比如:前端服务器是可以独立存在的,但是都依赖集中的一个数据库或者缓存系统,那最后,一定是集中的那个数据库或者缓存系统受不了,同样无法做到一个好的分布式。

  第五:关注系统的瓶颈

  大家先有几个基本的共识,系统的处理速度

程序内数据读写 > redis > mysql > 磁盘 单机网络请求 > 局域网内请求 > 跨机房请求

  我们优化程序的时候,尽量用最快的方式,尽量用最简短的逻辑。

  用redis替代mysql来保存订单处理中依赖的数据,用程序中的提交的数据代替从redis中二次获取数据,比如:商品库存信息,用户订单信息。

  逻辑处理中,把速度快且提前中断的逻辑放在最前面,比如:验证登录,验证问答。

  我们做分布式方案的时候,尽量把资源调用放在最近的地方。

  前端服务器依赖的数据尽量就在局域网内,如果能在单机都有读的redis服务当然[ddos防御方案]更好,程序维护数据响应会复杂些。

  不要出现跨机房网络请求,不要出现跨机房网络请求,不要出现跨机房网络请求,重要的事情说三遍。

  第六:什么语言更适合这类系统

  课程中用的是pHp语言,开发这类系统也是没问题的。

  当然,像是用golang, ngx_lua可能在高并发和性能方面会更有优势。

  如果使用java、.net当然也是可以的,作为一个系统,语言只是工具,更好的设计和优化,才能达到最终想要的效果。

  有了上面的基本概念,我们接下来再来看看,具体运行时,会出现什么状况。

  四、下面是一些具体的问题:

  问题1:库存超卖

  只有10个库存,但是一秒钟有1k个订单,怎么能不超卖呢?

  核心思想就是保证库存递减是原子性操作,10--返回9,9--返回8,8--返回7。

  而不能是读取出来库存10,10-1=9再更新回去。因为这个读取和更新是并发执行的,很可能就会有1k个订单都成功了,而库存实际只有10。

  那么,怎么保证原子性操作呢?

  1. 数据库:

  1. updateproductsetleft_numleft_num=left_num-1whereleft_num>0;

  这里用到的是left_num=left_num-1,如果left_num>0才能执行成功,数据库查询、更新的时候有用到锁,是可以保证更新操作的原子性的。

  数据库性能较差,不建议使用。

  2. 分布式锁

  用redis来做一个分布式锁,reids->setnx(lock, 1) 设置一个锁,程序执行完成再del这个锁。

  锁定的过程,不利于并发执行,大家都在等待锁解开,不建议使用。

  3. 消息队列

  将订单请求全部放入消息队列,然后另外一个后台程序一个个处理队列中的订单请求。

  并发不受影响,但是用户等待的时间较长,进入队列的订单也会很多,体验上并不好,也不建议使用。

  4. redis递减

  通过 redis->incrby(product, -1) 得到递减之后的库存数。

  性能方面很好,同时体验上也很好,在pHp秒杀课程中,优化后就是用的这种方法,而没有使用上述其他方法,大家应该也能对比了解啦。

  问题2:集群怎么来规划

  前端服务器因为没有相互间关联,集群的数量不受影响。

  redis的性能可以达到每秒几万次响应,所以一个集群的规模,也就是redis服务可以承载的数量。

  比如:一台前端服务器是1~2k的qps(有库存时),那么10台+1台redis就可以是一个独立的集群,可以支撑1~2w每秒订单量。

  10个上述的集群就可以做到一秒钟处理10w~20w的有效订单。

  如果秒杀活动的库存量在1w以内,预计参与的人数在百万左右,那么有一个集群也就可以搞定。

  如果秒杀参与的人数超过千万,那么就要用到不止一个集群了。

  问题3:多个集群的数据怎么保持一致性

  不要做多集群的数据同步,而是用散列,每个集群的数据是独立存在的。

  假设,有10个商品,每个商品有1w库存,规划用10个集群,那么每个集群有10个商品,每个商品是1k库存。

  每个集群只需要负责把自己的库存卖掉即可,至于说,会不会有用户知道有10个集群,然后每个集群都去抢。

  这种情况就不要用程序来处理了,利用运营规则,活动结束后汇总订单的时候再去处理就好了。

  如果担心散列的不合理,比如:某个集群用户访问量特别少,那么可以引入一个中控服务,来监控各个集群的库存,然后再做平衡。

  问题4:机器人抢购怎么办:

  没什么太好的办法,类似ddos攻击,只能是让自身更强大才是王道。

  运营策略上,可以严格控制用户注册,必须登录,提交订单的时候引入图像验证码,问答,交互式验证等。

  本公司在全球超过120个国家部署数据中心,提供海外全球多个国家服务器租用,所有服务器均可根据需求配置大带宽大流量,美国g口独享大带宽服务器,从此告别网络拥堵;

  

  私服行业如何选到适合的香港服务器

  香港服务器可以选择国际线路、国际带宽。在访问速度上快速,延迟低,稳定性好,性价比也比较高。这也是为什么更多的私服站长选用香港服务器的原因,新建站的私服游戏站长在选用香港服[香港抗链接攻击服务器详细租用流程]务器时应该怎么选择呢?

  1、选择合适的硬件配置。香港服务器大多都是物理服务器,相当于云主机来说,物理主机的CPU双核性能是超过虚拟机的双核。刚建站游戏用户没有多少的小私服,不低于双核I3、4G的配置是可以的;如果游戏后续在运行中玩家用户数量增加的话,也可以根据玩家数量的多少,以及游戏界面后续升级的状况重新选择CPU性能以及带宽更大的服务器。

  2、正规机房。与大陆机房一致,香港地区的机房也是有好坏之分的,在选择时应尽量选择正规的机房,这样无论是在服务器的质量上还是使用的稳定性上都是有保障的。

  3、售后保障。在租用服务器时,应尽量选择正规的IDC运营商,这样在后续的售后保障和服务跟进上也会更好一些。一般情况下,找正规的服务商租用时,都是可以包技术售后的。但是目前也仍然有站长因为找非正规的服务商租用服务器,别人收[传奇打金服务器]钱后不管售后问题的。所以在售后服务保障上的问题大家要多注意一些。

  以上就是关于如何挑选香港服务器的注意事项了,如果大家对于私服服务器的配置上有疑惑,欢迎联系本公司售前客服咨询,客服会根据您的私服游戏情况为您推荐适合的服务器配置哦。

  YINGSOO官网:https://www.yingsoo.com

  热门文章:【中秋活动】【电信APP服务器】【服务器海外】【境外服务器租用】【香港百兆服务器托管】【对比台湾VPS】【虚拟主机可以干什么】【办公软件服务器】【新加坡云服务器可以上油管吗】【视频流服务器并发】【oa系统服务器】【香港空间套餐】【高防集群服务器优势是什么】【服务器租用价格一些常见的问题】【海外vps租用】【服务器国外租用】【阿里云腾讯云】【服务器托管有什么优势】【免费vps使用】【美国网站空间】【韩国服务器推荐】【内存服务器租用】【香港云服务器1韩国主机】【电商直播系统】【免备案云】【集群磁盘故障】【香港主机网站制作】【高配大带宽服务器有什么好处

  快人一步!!YINGSOO台湾主机购买延迟低至35ms!

  台湾主机购买,Hinet机房合作,五星贴心服务,免备案高品质台湾主机购买,延迟低至40ms.YINGSOO新版云控制台上线,台湾主机购买钜惠来袭,注册送优惠码,年付8.3折!

  https://www.yingsoo.com/products/cloud-tw.html

  香港主机哪里好,就选YINGSOO,用了都说好

  9年香港主机哪里好业务运营经验,连续3年香港主机哪里好业务名列前茅.香港宽频,HKT机房核心合作伙伴,1200家企业客户共同选择,24小时在线服务

  https://www.yingsoo.com/products/cloud-hk.html

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部