高并发环境下的限时抢购服务器性能优化方案

2016-03-24 02:43:56谢昭阳
现代计算机 2016年8期
关键词:保证数据响应速度限时

谢昭阳

(四川大学计算机学院,成都 610065)

高并发环境下的限时抢购服务器性能优化方案

谢昭阳

(四川大学计算机学院,成都 610065)

电商平台中的限时抢购类活动需要处理瞬时高并发的大量请求,给服务器后台架构的设计带来一些新的问题和挑战。如何在保证数据一致性的情况下提高服务器的响应速度,是该问题的难点所在。提出一套基于消息队列的方案,并实现整套系统,在真实服务器中测试,得到良好的结果。

高并发;性能优化;限时抢购;电商平台

1 问题描述

越来越多的电商平台为了吸引用户消费,推出各种不同形式的促销活动,其中“限时抢购”是一种比较常见的方式。但是限时抢购类活动需要处理短时间内高并发的大批量请求,给服务器后台架构的设计带来了一些新的问题和挑战。

“限时抢购”服务器架构设计需要解决的问题主要有两点:响应速度和数据一致性[1]。提高响应速度是优化的目标,然而,同一时刻的读和写的请求可能存在冲突,如果没有处理好,就会导致数据不一致,产生不良后果。如何在保证数据一致性的情况下提高服务器的响应速度,是该问题的难点所在。

本文提出一套方案,采用Go语言[2]实现HTTP服务器,后端访问Redis数据库[3],使用消息队列来缓冲请求,分配多worker进行数据分发。实验表明,该方案部署在3台服务器上时,可以在保证100%数据一致的情况下,达到4842(单/秒)的稳定峰值。

2 方案设计

整个系统主要分为三个部分:HTTP响应worker池、消息队列、Redis访问worker池。当客户端发起请求时,系统将从HTTP响应worker池中取出一个空闲的worker,用于处理该HTTP请求。如果该请求不需要访问数据库,则直接返回结果;否则,将数据库查询任务和自身worker_id打包在一起,加入消息队列中,并阻塞以等待查询结果的返回。Redis访问worker池中的worker在系统运行开始时,就连接并保持了一个和Re-dis服务器的连接,然后阻塞在消息队列上。若消息队列上加入了新的查询任务,就会触发系统从池中调度一个空闲的worker到队列中取走任务。worker拿到任务后,从已保持的Redis连接向数据库发出操作指令,然后阻塞在该连接上。数据库操作完成并返回后,Re-dis访问worker被唤醒,它把结果交给消息中指定的HTTP响应worker,然后继续阻塞在消息队列上,等待下一次被系统调度。当系统遇到瞬时高并发的访问时,大量没有涉及数据库操作的请求可以直接响应。涉及数据库操作的请求会按请求的先后顺序依次进入消息队列等待处理。Redis访问worker可以持续不断地处理队列中的任务,不必为每一个任务单独建立和销毁连接。根据实际硬件和网络环境适当地控制Redis访问worker的数量,平衡系统开销和队列等待时间,以达到最佳性能。

3 具体实现

本方案主要采用Go语言实现整个系统。Go语言的标准库包含一个基础的HTTP服务器。为了提高URL解析速度,本文采用基于Trie树的httprouter作为URL路由器。

Go语言支持一种轻量级线程goroutine,它类似于协程,在goroutine之间切换成本非常低。此外,为了支持goroutine之间的通信,Go语言提供channel作为内置的数据类型,并为其配备一些语法层面上的操作。其中一个比较典型的是select关键字,使用时,类似于switch一样指定若干个case子表达式,也可以指定de-fault语句,其中每个case的条件通常是一个等待chan-nel读或写的表达式。当执行到select语句时,系统会从就绪的case中不确定地选择一个执行。若此时所有case都未就绪,且没有指明default,则该select语句所在的goroutine就会阻塞,并交出控制权,系统就会调度其他goroutine执行。当一个select语句指明default时,则遇到没有任何case就绪的情况就会直接执行de-fault。

本文在实现所提出的方案时,以两种不同的方式使用channel:一种是用来阻塞HTTP响应worker的单值channel,实现信号量的功能;另一种是用来缓冲Re-dis访问的多值channel,实现消息队列的功能。当HTTP响应worker要请求数据库时,它先会创建一个单值channel,将其和数据库查询参数打包,放入消息队列中,然后等待这个channel传出数据的时候再继续执行。Redis访问worker从初始化开始,就尝试从消息队列channel中读取消息。由于一开始消息队列为空,所以所有Redis访问worker都阻塞。当队列channel可以读取消息时,空闲的worker就会迅速将消息取走。抢到消息的worker执行Redis访问,其余的继续阻塞等待。如果Redis查询结束,Redis访问worker就会把结果通过消息中的单值channel传递给相应的HTTP响应worker,使其继续执行。

程序中的关键代码如下:

Redis是一种NoSQL内存数据库,存取速度非常快。Redis中的数据主要以“Key-Value”的方式存储,Key限定为字符串,Value则有不同数据结构可选,例如字符串String、集合Set、哈希表Hash、链表List、有序集合Sorted Set等。Redis服务器内嵌Lua脚本解释器,可以编写Lua脚本代码作为预定义批处理操作,由客户端提供参数,发起调用命令“EVAL”或“EVALSHA”以执行指定的Lua代码。Redis保证每个Lua调用都和内置操作一样具有原子性,当一段Lua脚本代码在执行,不会有其他操作同时运行。基于Redis提供的这个特性,我们把Redis访问worker的数据读写操作都封装到一个Lua脚本中,这样实现,一方面可以保证数据的一致性,另一方面又可以使得多次操作合并成一个操作,减少网络传输开销和来回传输的网络延迟。

4 测试结果

由于本文所提出的方案没有横向依赖,即各个HTTP服务器之间不存在直接通信,所以在真实环境中,可以设置一台负载均衡服务器,并横向增加HTTP服务器,以提高整个系统的并发量。

我们将HTTP服务器代码镜像地部署在3台双核CPU、4GB内存的服务器上。另外配置了一台Redis服务器,独立于HTTP服务器,只负责数据存储与管理。配置额外的服务器运行测试脚本,模拟1000个客户端同时请求,以round robin的负载均衡策略[4]均衡地请求3台HTTP服务器。

经测试,所有请求都能正确地返回,并且当Redis访问worker数量为250时,平均峰值达到了4842(单/秒)。

5 结语

本文针对高并发环境中的限时抢购服务器后台设计面临的问题,分析其中的关键点和难点,提出了一个解决方案。为了验证这套方案的可行性和性能,本文实现整套系统,并部署在服务器中进行测试,得到了良好的结果。本文所提供的方案可以为现有电商平台优化服务器性能时提供参考。

[1]Terry D.Replicated Data Consistency Explained Through Baseball[J].Communications of the ACM,2013,56(12):82-89.

[2]Zawodny J.Redis:Lightweight Key/Value Store That Goes the Extra Mile[J].Linux Magazine,2009,79.

[3]Schmager F,Cameron N,Noble J.GoHotDraw:Evaluating the go Programming Language with Design Patterns[C].Evaluation and Usability of Programming Languages and Tools.ACM,2010:10.

[4]Shreedhar M,Varghese G.Efficient Fair Queuing Using Deficit Round-Robin[J].Networking,IEEE/ACM Transactions on,1996,4(3): 375-385.

Performance Optimization for Highly Concurrent Flash Sale Server

XIE Zhao-yang

(College of Computer Science,Sichuan University,Chengdu 610065)

Flash sale in e-commerce platform needs to deal with a large number of transient high concurrent requests,which brings some new chal-lenges and problems to back-end server architectural design.The difficulty of the problem lies in improving the response speed of the server while keeping data consistency.Presents a solution based on message queue,and implements the whole system.Tested on real hard-ware,the proposed solution shows a good performance.

High Concurrency;Performance Optimization;Flash Sale;E-Commerce

1007-1423(2016)08-0051-03

10.3969/j.issn.1007-1423.2016.08.010

谢昭阳(1992-),男,福建泉州人,在读硕士研究生,研究方向为程序设计语言理论

2016-02-23

2016-03-03

猜你喜欢
保证数据响应速度限时
Kubernetes容器集群环境下新型供电系统响应速度优化
Debye-screening effect on electron-impact excitation of helium-like Al11+and Fe24+ions
日本船级社(NK)发布《数据质量指南》
提前预登记,免费参观
生活用纸(2021年3期)2021-03-14 06:57:28
基于高速相位调制器的超快偏振控制
光通信研究(2020年2期)2020-06-15 07:42:58
限时写作,由“扶”到“放”
备份与恢复vSphere 虚拟化环境
电磁阀响应速度的影响因素
找茬儿
Excel也玩协同办公