chainhou 2014-05-18 21:09
浏览 640
已采纳

限量秒杀等高并发活动的正确性如何保证?

近几年,各大电商甚至各个运营商,都经常搞一些秒杀活动、抢红包等。比如某月的11号10点,某品牌手机“1元秒杀”,限量100部。
此时,必然在10点前后,网站的并发量会相当大。为了应对网站的高并发,我们可以使用应用服务器集群,负载均衡器会将请求分发到各个应用服务器,这样各个应用服务器的流量就会小很多。但由于集群时同一个应用部署在多个应用服务器上,此时,对于这个100部的限量,该如何保证不会卖多呢?
单节点的时候,我们可以在应用内部使用锁和计数器来保证,可以使用类似于JDK内部的CountDownLatch这些并发组件,我们可以在应用内部使用锁和计数器来保证,但在集群环境下,这个应用内的计数器就没有意义了。应用被分发到各个服务器,此时为了保证这个数据的正常,一般常用的手段有哪些呢?
比如我们可以让所有的Server访问同一个数据库,这样来限制,但此时数据库就会成为瓶颈。为了解决瓶颈问题而采用数据库集群的话,各个数据库之间如何保证数据的同步的呢?
另外,如果使用Redis等分布式缓存,这样的话,为了解决单点问题也必然会有多个分布式缓存存在。此时多个缓存节点间的数据如何保证?

没有从事过互联网应用的开发,不知道这类需求该怎么实现,请论坛内有相关经验的朋友指点。谢谢。

  • 写回答

3条回答 默认 最新

  • 犀利的蛙 2014-05-18 22:43
    关注

    1.秒杀活动,一般做得简单点,大家访问的都是同样的界面,页面全部进行缓存,秒杀按钮一般等到时间到了,才点亮,才生成URL,防止提前通过URL 访问。

    2.秒杀一般请求数特别多,在秒杀开始之前,URL 不开放,页面有缓存,无论用户怎么刷新,也不会给服务器造成压力。

    3.秒杀一旦开始,会有很多请求出现,但是一般我们只允许比如前100个有效请求,这个100个请求进行订单处理,其他请求都进入缓存好的,秒杀结束页面。

    4.实际上我们仅仅对有效请求进行处理,这里的处理办法可以对请求加入队列,当数目达到100,就不在添加,然后可以依次从队列里面提取信息,处理我们需要的结果,不会出现超标的情况。

    5.对于数据库的设计,一般情况下,如果量比较少,可以用专门的服务器来处理有效订单,其实请求就不会太多,压力不会太大了。

    6.在你分布式集群里面,假设你有N台服务器,那么你可以规定每台服务器仅仅处理100/N g个订单,同时你也可以做一个全局计数器,利用分布式缓存框架。

    7.因此你说的数据库压力,以及分布式数据同步的问题,可以得到很好的解决。关于分布式集群之间的通讯这些,可以靠消息中间件,或者延缓等等各种手段处理。

    8.上面仅仅是个人想法, 提供一些参考,有问题请指出~。~

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog