《电子技术应用》
您所在的位置:首页 > 通信与网络 > 设计应用 > 面向电子商务的秒杀系统设计与实现
面向电子商务的秒杀系统设计与实现
2015年微型机与应用第6期
邵 斐
(上海清算所,上海 200002)
摘要: 根据互联网服务的特色,从可靠性、可扩展性和安全性的角度着手,提出了一套面向电子商务领域的网络秒杀系统的架构设计方案。同时分析了秒杀系统的业务特点,设计了一套相应的业务体系,并给出了主要业务流程的具体实现方法。基于该解决方案的秒杀系统可以达到高并发、高可靠、易扩展以及高安全性的设计目标。
Abstract:
Key words :

  摘  要: 根据互联网服务的特色,从可靠性、可扩展性和安全性的角度着手,提出了一套面向电子商务领域的网络秒杀系统的架构设计方案。同时分析了秒杀系统的业务特点,设计了一套相应的业务体系,并给出了主要业务流程的具体实现方法。基于该解决方案的秒杀系统可以达到高并发、高可靠、易扩展以及高安全性的设计目标。

  关键词: 秒杀;电子商务;高并发

0 引言

  CNNIC第33次中国互联网络发展状况统计报告[1]显示,我国网络购物用户规模已达3.02亿人。随着网购人群的不断增长,闪购、抢拍、整点购等新兴的秒杀类促销形式正逐步受到热捧。然而目前学术界专门论述如何建设电商领域的秒杀类应用系统的相关文献较少,因此本文针对此领域进行了一定研究。

  在电子商务领域,秒杀特指网络卖家在某个时间点发布一些价格超低于平时市场价格的商品,所有买家在同一时间在网上进行抢购的销售方式。由于网络买家对于超低价商品的好奇心、好胜心,使得商品往往一上架就被抢购一空,有时只用一秒钟,因此被形象地称为“秒杀”[2]。正是买家的这种博彩心理决定了秒杀应用的最大特点就是瞬时性的超高并发,往往秒杀开始的最初几秒至几十秒内,网站的访问量就迅速达到峰值,从而引起服务器响应延迟、服务异常甚至服务器瘫痪等诸多问题。

  在这种高并发的情况下,如何使网站能够持续稳定地服务是需要重点研究和解决的课题。本文提出的解决方案主要包含两方面内容:一方面在架构层面上在考虑服务器成本的情况下通过负载均衡和CDN技术构建一套具有较高鲁棒性的系统架构;另一方面在业务层面上针对秒杀应用的特点,配合缓存技术[3]设计一套稳定可行的业务处理流程。

1 秒杀系统的架构设计

  1.1 架构分析

  秒杀系统的特点包含两个要素:一是高并发,因此系统架构上应充分考虑整体系统的高可靠性[4];二是瞬时,即高并发的情况并非时刻存在,应从系统整体效费比考虑,使得系统具有一定伸缩性。

  1.2 架构设计

001.jpg


  基于以上设计理念,本文将整个系统划分为内容展示层、应用服务层和数据访问层3个层次,如图1所示。从硬件设备角度,系统主要由WWW服务器集群、Web应用服务器集群、文件服务器集群、缓存服务器集群、数据库服务器集群以及相关的负载均衡等设备组成。

  1.2.1 内容展示层设计

  内容展示层是与终端用户直接交互的前端系统。考虑到秒杀系统中出售的商品信息多数内容还是以静态的网页文字和图片格式进行呈现的,为了实现系统的高可用性,可以在用户和服务器之间构建一个网络缓存层,比较常用的做法就是用CDN,即内容分发网络。其目的是使用户可就近取得所需内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。

  1.2.2 应用服务层设计

  应用服务层是整合系统的核心层,其作用是连接前端用户的服务请求和后台系统的服务响应,所有的业务处理都在本层中实现。为了保障系统的高并发性和可靠性,应当将服务器按集群模式[5]进行部署,这样做既可以避免因为单点故障而导致的系统瘫痪,同时也可以保证对所有服务器硬件设备的集中管理和统一配置。WWW服务器集群主要用于接收和响应用户的访问请求。应用服务器集群则是对从WWW服务器集群中转发的各类业务请求进行及时的处理。通过负载均衡系统将各个业务集群进行串联,将大量的并发访问数据分配到多台节点设备上分别进行处理,构成完整的系统体系。通常采用专门的硬件设备(如F5、A10等)实现负载均衡。负载均衡策略应采取动态的自适应负载均衡策略[6],使得整个系统能够根据当前应用的实际访问量情况调整服务器节点数量,在保证客户网络服务质量的前提下尽可能减少资源浪费,降低系统费用。

  对于一个拥有大量用户真实数据的电子商务系统[7],必须充分考虑到系统的安全性[8]。为了保证系统不被非法用户入侵或恶意攻击,防火墙作为整个系统的桥头堡必须被部署在整个系统的入口处,设备应当尽量选取性能优秀、稳定可靠的硬件产品。除此之外,还应部署专门的安全服务器以进行系统的漏洞扫描、入侵检测分析和安全审计工作,辅助防火墙保证系统的安全。

  1.2.3 数据访问层设计

  数据访问层的任务是为应用服务层提供所需的数据支持。为了降低对于数据库I/O操作的压力,必须在应用服务与数据库之间建立一个数据缓存层[9]。图片、视频等静态信息都从专门的文件服务器集群上获取;对于秒杀系统相关的产品数据,应在产品售卖之前将相关信息采用内存缓存的方式存放在缓存服务器集群[10]中;而数据库本身也应以集群模式构建,以MySQL为例,可采用主从结构,并在程序层实现读写分离,然后通过负载均衡进行分布式调用。

2 秒杀系统的业务应用设计

  2.1 秒杀系统业务分析

  秒杀系统与典型的高并发Web系统的最大区别就在于并发访问的发生场景。一般支持高并发的在线购物平台(如淘宝、京东、一号店等)每时每刻都会存在大量的并发访问,是一种常态化的高并发;而秒杀系统本身通常都不是作为一个独立平台而往往是以这些电商平台中的一个子系统的形式出现,同时秒杀产品的发售也有极强的时间限制,因此导致了秒杀系统的并发访问是一种突发的高并发。另外,秒杀归根到底是电商的一种促销手段,这种以超低价吸引买家的性质决定了对应的秒杀产品的库存数绝不会是无限大的,相反往往会控制在一个相对很少的量级单位。通过以上分析可以得出,要构建一套实用合理的秒杀业务系统,主要是解决两个问题:一是如何提供稳定可靠的产品基本信息查询服务;二是如何保证产品库存的及时更新及订单处理。

  2.2 秒杀系统业务设计

  2.2.1 产品查询服务流程设计

  对于如何提供稳定可靠的产品基本信息查询服务的问题,主要通过页面缓存[11]来解决。当用户访问相关页面时,预先判断产品页面是否存在缓存,如果存在则直接调用静态页面,否则从数据库中读取动态数据信息,这样做可以加快系统反应时间,提高整个网站的性能[12]。另外,对于网页中的图片、视频等文件,则从独立的文件服务器中读取,由于此类信息本身并不影响具体业务,因此通常采用异步方式进行加载。产品查询服务的业务流程图如图2所示。

002.jpg

  由图2可见,当缓存不存在时将不得不调用API从数据库中直接获取数据,而此操作将会成为整个系统的性能瓶颈。为尽量避免对数据库的操作,需要在系统中单独部署一个Job服务,在秒杀活动开始前遍历相关产品预先生成页面缓存信息。如果在某些特殊情况下依旧需要对数据库进行直接读取操作,则在读取完成后需要将当次读取到的信息同步入缓存中,以此保证下次再有对相同产品的访问请求时可直接读取缓存,从而避免对数据库的二次访问。同时为保证缓存中产品信息的时效性[13],引入时间戳概念,时间戳维护的业务流程图如图3所示。

003.jpg

  当后台维护人员修改产品信息后,产品对应的时间戳就会同步到数据库的产品时间戳信息表中,此时后台监控服务发现某个产品的时间戳信息发生变化后则会即时刷新缓存数据,以此确保前台用户取到的数据是最新的。缓存同步Job部署在独立的内部应用服务器上,由于服务需要从产品时间戳信息表中获取产品及其时间戳数据,为了尽量降低每次从数据库获取的数据量,除了第一次数据初始化外,之后每次仅获取上次运行完成的时间点之后的数据,同时考虑到性能因素,将“产品-时间戳”的字典维护在服务器的本地缓存中。现实环境中,产品基本信息的更新频率一般都会以小时甚至天为单位。Job运行的频率可人为控制,正常情况下控制在分钟级即可,经过实际测试,当产品数量为十万级时,由于字典本身维护的数据量并不大,即使单台服务器的负载也足以能够承受。由于整体系统架构采取集群模式,即使发生当前服务器集群无法承受的情况,也可通过增加服务器数量,然后将所有产品重新平均分配到各个服务器上来解决。

  2.2.2 产品库存及订单处理流程设计

  考虑到秒杀产品通常都以实物产品为主,其固有的成本压力以及超低价吸引买家的营销模式决定了产品库存数都是有限的,真正能够成功下单的操作数相对有限,数据库的写操作压力相比读操作要小很多。因此解决库存更新以及订单处理的基本思路是:先将库存信息维护在缓存中,同时维护一个订单队列,通过单独的服务处理此队列中的订单请求并完成最终的数据入库操作[14]。库存刷新及订单处理的业务流程图如图4所示。

004.jpg

  用户在打开产品页面时首先从缓存中获取产品的基本信息,包括产品售卖时间以及可售标识,这里的可售标识仅表示当前产品是否可以进行销售,并不维护实际的产品库存数。当秒杀活动开始后,用户可以通过点击“预订”按钮进行抢购。如果当前产品库存大于0,则用户可以进行后续预订操作并更新库存数;若产品库存数减为0后,需要额外刷新缓存中存储的产品信息,将可售标识置为False,以此表示产品不可继续出售。如果用户成功抢购到产品,系统并不直接将用户的预订单写入数据库中,而是先统一保存入一个订单队列之中,此订单队列本身也是存储在缓存之中。产品下单Job的任务就是轮询此订单队列,依次处理队列中的预订请求,将预订信息写入数据库中。由于秒杀产品数量是有限的,因此订单队列中的记录数不能大于产品库存数量,故通过独立的Job服务进行此类集中的数据处理在性能上是可以保证的。当用户的订单被同步入数据库中之后,用户可在专门的个人订单页面中看到自己的预订信息并进行最终的支付操作,至此整个秒杀过程全部完成。

  在以上流程中,最关键的是维护产品的库存信息,目前有些秒杀系统的做法是直接维护一个“产品ID-库存”的键值对字典,并将数据存放在MemCached中,这种设计很可能导致性能瓶颈。因为直接使用产品ID作为Key,使得MemCached通过Key来计算Hash值得到目标存储服务器时每次都是相同的结果,即指定产品一定会被存放在固定的一台服务器上,当此产品出现高并发访问时,存放该产品库存键值对的缓存服务器必将承受极大负载。为了避免类似的单点服务可能造成的系统瓶颈,本文对于秒杀产品的库存信息维护做了适当的优化,在设计键值对时采用“服务器标识+产品”作为Key,这样即使是同一个产品由于Key不同最终可以得到不同的Hash值,使得数据会被存储到不同的缓存服务器上,以此达到分布式存储的目的。

3 系统测试

  基于本方案的秒杀系统无论在对产品内容展示还是库存及订单处理上,都具有较强的可靠性。为验证该解决方案的具体性能特进行以下实验。

005.jpg

  测试样本为10个秒杀产品,每个产品库存数为1 000;测试缓存包含4台WWW服务器,2台应用服务器,2台缓存服务器和1台数据库服务器。为测试方便,本测试中所有服务器采用相同配置,均为4核CPU,内存为16 GB。服务器事务操作性能对比如图5所示。由图可见,在高并发情况下系统的压力瓶颈主要来自于WWW服务器,在达到10万个并发数的情况下WWW服务器的CPU占用率已经达到了90%以上,而此时应用服务器和缓存服务器仍有空闲资源;同时由于绝大部分操作均在前端服务实现,数据库服务器的CPU占用率始终保持平缓,不随并发数增加而暴增。通过长期测试,在系统实际部署中推荐将WWW服务器与应用服务器数量按照3:1比例进行配置,可以使得整个系统达到最大的并发访问承受力。

4 结论

  身处互联网时代,网上购物已经逐步成为亿万网民主流的购物方式,而秒杀、抢购类的网络营销模式也越来越受到电商和网民共同的关注和推崇。本文正是基于此类应用的巨大市场发展潜力,专门针对秒杀系统的特点,从系统架构和业务流程两大方面分析和设计了一套具有高并发性、高可靠性和安全性的互联网秒杀应用系统,基本满足了电商平台对于秒杀应用的实际需求。同时对高并发性系统中的缓存技术的实际应用以及秒杀系统的公平性等进行了探讨,实际上这两点都是秒杀系统设计中的重点和难点,目前尚未有完美的解决方案,还需要进一步研究。

参考文献

  [1] 中国互联网络信息中心.中文互联网数据资讯中心[EB/OL].[2014-01-16].http://www.199it.com/archives/187745.html.

  [2] 张小红.电子商务营销策略之秒杀[J].机械管理开发,2011(2):150-151.

  [3] 甘桂梅.基于Web应用的缓存技术概述[J].中国科技信息,2010(17):95-96.

  [4] 薛质,彭海平.电子商务平台的性能优化和高可靠性研究与实现[D].上海:上海交通大学,2007.

  [5] 赖建峰,林永怡.服务器集群技术在数字化校园中的应用[J].硅谷,2011(9):136.

  [6] 段赵磊,黄艳.弹性Web Cache集群的自适应负载均衡策略[J].小型微型计算机系统,2013,34(7):1527-1530.

  [7] 裴丽丽.基于B2C模式的电子商务平台系统设计和实现[D].上海:同济大学,2009.

  [8] 包立辉,黄彦飞.高并发网站的架构研究及解决方案[J].计算机科学,2012,39(10):184-187.

  [9] 程春蕊,刘万军.基于数据库缓存的Web应用性能优化解决方案[J].世界科技研究与发展,2009,31(4):603-604,640.

  [10] 王鑫.基于动态缓存的电子商务平台优化研究[D].青岛:山东科技大学,2004.

  [11] 蔡志珂,阎洁.基于缓存框架的Web缓存研究[J].电脑知识与技术,2009,5(31):8737-8739.

  [12] 王春娟.基于缓存技术的Web应用性能优化研究[J].电脑知识与技术,2008,1(3):438-440.

  [13] 张旺俊.Web缓存替换策略与预取技术的研究[D].合肥:中国科学技术大学,2011.

  [14] 郭世亮.一种高并发竞争库存的订单处理系统及其处理方法[P].中国:CN201310301455.2,2013-12-04.


此内容为AET网站原创,未经授权禁止转载。