APP下载

基于Redis缓存数据库和Nginx负载均衡技术的购物网站性能优化

2022-08-25邓秀辉余开朝

软件导刊 2022年8期
关键词:购物架构框架

王 欢,李 民,邓秀辉,焦 宇,余开朝

(1.昆明理工大学机电工程学院,云南昆明 650500;2.华信咨询设计研究院,浙江杭州 310000)

0 引言

随着信息时代的到来,人们的生活已经越来越离不开互联网。据第47 次《中国互联网络发展状况报告》显示,截至2020 年12 月,我国网购用户规模已达7.82 亿,较2020年3 月增长7 215 万,占整体网民的79.1%。2020 年,我国网上零售额高达11.76 万亿元,较2019 年增长10.9%[1]。人们购物习惯的转变极大地促进了线上经济的发展,对网络购物平台提出了更高要求。开展对现有电商平台系统的研究与优化至关重要,不仅能够使购物系统性能得到提升,改善消费者的购物体验,还能满足企业长期发展的需求,促进社会经济良好发展。

1 相关研究

传统的网上商城系统大多采用垂直应用框架,在面对某一具体时刻众多并发访问请求时,存在因难以承受巨大访问量而发生系统崩溃、用户等待时间过长、用户体验差等问题。随着企业规模的扩张以及业务种类和业务量的增加,传统电商系统架构早已不能满足现代消费需求。微服务架构可以帮助解决企业面临的种种开发难题,许多学者进行了相关研究。例如,Fowler 等[2]提出微服务的概念;Lewis 等[3]基于微服务的概念首次提出微服务架构体系,并指出通过该架构可以更好地降低服务模块间的耦合度。目前主流的微服务框架主要包括阿里的Dubbo 框架[4]和Spring社区的Spring Cloud 框架[5]。

针对高并发环境下数据查询时间变长,在实际项目中数据查询效率低、系统运行效能不佳的问题,许多学者提出了解决办法。例如,聂小雄[6]通过优化传统遗传算法对数据库进行分库分表与资源优化,并重构了系统架构,有效提高了系统数据查询性能;Peng 等[7]基于Redis 缓存数据库的高可用性建立Dynamic cuckoo filter 系统,大大提高了海量数据的检索速度。

为保证系统具有更高的并发性和可用性,面对请求同一服务的多个实例,如何缩短等待时间是一个亟需解决的问题。负载均衡技术为解决这一难题提供了新的思路。例如,Alakeel[8]采用动态负载均衡方法,对服务器集群中服务器节点的工作负载进行重新分配,避免其他服务器节点出现空闲状态,缩短了服务节点的工作响应时间;张宇星[9]从Nginx 源码着手,深入研究了其信号机制、反向代理功能和负载均衡,将C++、标准程序库和模板转变为对Nginx 的负载转发并进行优化改进,测试证明改进后的负载分发性能优于改进前;吴宝花[10]提出一种基于Nginx 加权轮询负载均衡算法的后端服务器动态负载均衡算法,可有效实现服务器资源分配的合理化。

在购物商城系统优化方面,也有不少学者进行了研究。例如,王珂[11]针对某公司委托的电子商城开发项目,运用Spring、SpringMVC、Mybatis 框架,加入Nginx 轮询技术提高了原购物系统的并发性,数据库采用一主一从的设计;徐光耀[12]针对拥有大规模用户的电商企业面临的问题,设计了基于Dubbo 架构的网上商城,与王珂的不同之处是其采用的是Dubbo 整合Spring、SpringMVC、Mybatis 框架,数据库没有主从设计;郭志伟[13]与徐光耀采用了同样的系统架构,但研究重点放在了以动态调节权重的Nginx作为反向代理为基础的系统性能优化方面。

本文设计的购物网站系统主要针对小型电商企业,尤其是创业初期资金有限、技术要求不高、顾客量较小的电商企业,与上述学者设计的不同点在于将Spring 框架替换为SpringBoot 框架,优点是SpringBoot 框架不需要考虑版本兼容和框架整合问题。本文系统采用Dubbo 整合Spring-Boot、SpringMVC、Mybatis 框架,采用“二主二从”的数据库高可用性设计,同时采用Redis 数据缓存技术和Nginx 轮询负载均衡技术提高系统并发性。

2 关键技术

2.1 Dubbo框架

Dubbo 是采用Java 编写的开源分布式框架[12],其主要功能是使用高性能远程调用技术进行服务的发布与应用。该框架通过统一标准将复杂的网状结构梳理成便于管理的星型结构,当某一个服务节点出现问题时,整个系统仍然可以正常运行,较好地解决了各个服务器之间的通信问题。Dubbo 框架作为微服务架构之一,其每个服务都可以运行在独立的进程中,具有高度的隔离性、自治性,这是传统架构模式不能实现的,也是本文采用Dubbo 框架降低系统耦合度、提高并发性的重要原因。

图1 为Dubbo 框架的工作原理,其执行流程简洁清晰[14]。第一步先启动加载配置文件,同时将自身所能提供的服务代码调入内存;第二步启动服务消费者,向注册中心提交所需服务信息,注册中心返回服务提供者IP 和端口号给服务消费者。监控中心会监控服务提供者和服务消费者在一段时间内在内存中的调用次数和时间[15]。

Fig.1 Working principle of Dubbo framework图1 Dubbo框架工作原理

2.2 Redis缓存技术

互联网中的数据存储和访问规模逐渐增大,缓存技术作为一种既经济又高效的解决方式被广泛运用于互联网数据中心等系统中[16]。Redis 是当前应用最为广泛的外部缓存产品,具有可使用数据类型丰富、运行性能高、可扩展性好、配置简单等特点。Redis 是基于内存存储的,所有操作均直接在内存中进行,可加快数据读写速度,有效缓解关系型数据库的访问压力,大大缩短访问和请求的响应时间[17]。Redis 是单线程的,在收到任务后仅按照顺序性、排他性、一次性的原则执行某一队列的一系列命令。Redis可实现一主机一从机或一主机多从机的主从复制机制,在进行主从搭建时,常采用“哨兵”机制实现缓存数据的高可用性。Redis 缓存技术的持久化策略也是其被广泛应用的主要原因之一。Redis 按照指定配置,可定期将内存中的数据以ROB 或AOF 的模式持久化到磁盘中,当重新启动时,Redis 会首先根据文件中的配置读取持久化文件实现数据恢复,可很好地避免因服务器崩溃给商城带来的经济损失。

目前Redis 缓存技术应用十分广泛,例如蔡宇等[16]研究了运行数据缓存的高效存储模型、高可用管理等关键技术,提出了基于Redis 的数据平台分布式缓存框架,经实验证明该框架在可靠性、可扩展性、读写性等方面满足各类业务对数据的管理与访问要求;刘明[18]采用面对服务架构的思想设计并实现了Yogo 电子商务系统,在服务器与数据库之间采用Redis 缓存技术,大大提高了系统对请求的响应效率;詹利群等[19]基于内存Key-Value 结构搭建Redis 数据库集群,提出适合自动气象站资料调用的数据存储结构模型,并通过实验证实了Redis 缓存技术具有较高的资料检索效率。

2.3 Nginx负载均衡

Nginx 是一个具有强大性能的Web 和反向代理服务器,具有对网络依赖性小、安装和配置比较简单、可以承担很高的负载压力且性能稳定等多种优势。Nginx 服务器最大的特点是可以提供负载均衡技术,即当服务器接收到具体的服务请求时,可以按照既定策略将请求转发至不同服务器,防止出现一台服务器过载而其他服务器闲置的情况。既定策略包括轮询、权重、ip_hash、url_hash 等[20],其中轮询即按照配置文件的顺序依次访问服务器;权重即“能者多劳”,安排性能较优的服务器处理较多的服务请求;ip_hash 即将用户和某个特定的服务器进行绑定,客服端请求ip 进行hash,再通过hash 值选择后端服务器,用于某些特定场景;url_hash 即通过请求url 进行hash,再通过hash 值选择后端服务器,可以提高后端缓存服务器的使用效率。ip_hash 和url_hash 具有使用局限性,当后端服务器发生宕机时,不会自动跳转至其他服务器,严重影响用户体验感。

目前Nginx 负载均衡技术应用也十分广泛,例如伍春生[21]应用加权Nginx 负载均衡技术处理高速公路视频云联网平台应用层的请求,解决了该平台访问能力较差的问题;张博等[22]将Nginx 反向代理与负载均衡技术以及多级缓存、水平拓展服务器等技术引入到中小型电商网站中,通过测试工具检验出优化后的网站系统并发访问能力显著提升。

3 购物网站系统设计与实现

3.1 购物网站系统工程搭建

3.1.1 开发环境

本文设计的购物网站在MacOS 环境下开发,商城集群服务器、MySQL 数据库、Redis 缓存、Zookeeper 等部署在VMware 虚拟机的Linux系统中。开发工具如表1所示。

Table 1 Introduction to development tools表1 开发工具介绍

3.1.2 网站系统搭建

购物网站系统基于Dubbo 框架,同时整合SSM(Spring-Boot-SpringMVC-Mybatis)进行架构设计,主要由服务消费者、服务提供者、缓存层和数据层4 层组成。架构如图2所示。

Fig.2 System architecture of a shopping website after reconstruction图2 购物网站系统架构

网站中,服务消费者负责页面展示并与用户进行信息交互;服务提供者负责接收并处理服务消费者传来的用户请求参数。为解决该购物网站在某一时刻因并发量大而导致数据读取速度慢的问题,采用Redis 缓存技术设置缓存层,在服务层和数据层之间对热点数据进行缓存处理,以提高数据存储速率和数据库的可用性;数据层的数据库设计采用开源MyCat 数据库消息中间件,对外统一提供数据服务。为缓解数据库读写压力,提高数据库可用性,MySQL 数据库采用两主两从设计,同时采用MyCat 对MySQL 进行读写分离和双机热备。

该购物网站系统主要通过Redis 的哨兵机制实现缓存数据的高可用性,同时对Redis 服务器集群节点进行主从复制,从节点对主节点进行复制备份,以实现数据同步。图3 为Redis 数据库集群的架构示意图,其分别由3 个主节点和3 个从节点构成。为避免Redis 服务器出现宕机情况,哨兵通过心跳检测机制向主机实时发出心跳检测,连续3 次未收到主机回执,则判断该主机宕机,哨兵则通过推选机制选择另一台从机为新的主机,并将其他服务器改为当前主机的从机。

在服务治理与监控方面,本系统采用Dubbo+Zookeeper 应用协调服务设计。以购物车功能为例,当服务提供者启动时,会将{服务名称:IP 端口}写入到Zookeeper 注册中心,注册中心收到消息后动态维护服务列表数据。当消费者启动时,首先链接到注册中心获取到所有服务列表数据,并将该数据保存到消费者本地中心用于后续访问。Zookeeper 注册中心利用心跳检测机制对后台服务进行监控,判断是否出现宕机。若出现宕机情况,注册中心会及时更新服务列表消息,并将更新后的数据发送给消费者。

Fig.3 Architecture of Redis database cluster图3 Redis数据库集群架构

本文采用分布式搭建方式对该购物网站系统进行垂直拆分和水平拆分。垂直拆分是将购物网站具体的服务模块根据服务功能的不同拆分到不同服务器中,以提高整个系统的并发能力,具体拆分情况如图4 所示。水平拆分是根据业务代码的层级进行项目功能的拆分,以便于后期系统的维护和升级,具体拆分情况如图5所示。

3.2 Nginx负载均衡实现

为满足购物网站业务量和数据量不断增多、系统功能不断扩展的需求,本文采用Nginx 负载均衡技术进行服务器节点的水平扩展,将海量访问请求分配到不同服务器节点上,使每台服务器节点都能发挥作用,减少单节点服务器的访问压力,提高系统吞吐量。采用轮询方法将访问请求分配到商品管理系统服务器的3 个节点中。Nginx 负载均衡配置信息如图6所示。

Fig.4 Project split vertically图4 系统垂直拆分

Fig.5 Project level split图5 系统水平拆分

Fig.6 Nginx load balancing configuration information图6 Nginx负载均衡配置信息

4 性能测试

将该购物商城系统部署在VMware 虚拟机的Linux 系统中,IP 地址分别为192.168.182.161,192.168.182.162,192.168.182.163,192.168.182.164,对应的端口号为8081、8082、8083、8084。实验测试环境为MacOS10.15.5 系统、JDK1.8、MySQL8.0、Redis5.0、Tomcat8.5。

4.1 数据缓存性能

为验证该购物网站系统的缓存性能,本文利用Post-Man 工具发出Get 请求,请求链接为http://localhost:8091/item/cat/list。通过比较加入Redis 缓存数据库前后该购物网站系统的信息回显速度,发现加入Redis 缓存数据的系统查询时间为13ms,比原有系统直接从MySQL 数据库中查询快了63ms。具体结果如图7所示。

Fig.7 Query time comparison图7 查询时间比较

4.2 并发性能

为验证加入Nginx 负载均衡技术后购物网站系统的并发处理能力,运用JMeter 工具进行测试。设置用户请求量分别为200、300、400、500,Ramp-Up Period(in seconds)为0,Loop Count 为1,通过比较系统响应时间、吞吐量、错误率等指标衡量系统性能。由于网络连接问题会导致在实际测试过程中的数据出现波动,本文采用3 次测试取平均值的方式处理数据结果。表2 为Samples(用户请求数)分别为200、300、400、500 时,未搭载Nginx 负载均衡单节点服务器与搭载Nginx 负载均衡3 节点服务器的系统测试结果比较,评价项目包括平均响应时间、50%用户响应时间、90%用户响应时间、错误率、吞吐量等。如表2 所示,no 表示无Nginx 负载均衡单节点服务器系统,yes 表示Nginx 负载均衡3 节点服务器系统。通过分析发现,随着并发量的增大,搭载Nginx 负载均衡3 节点服务器的系统平均响应时间明显缩短,二者吞吐量随并发量的增加均开始减小,但有Nginx 负载均衡的系统吞吐量仍高于无Nginx 负载均衡系统。当用户请求量分别为300、400、500 时,系统平均响应时间分别缩短了47%、26%、11%,吞吐量分别提高了74%、23%、32%。在错误率方面,在并发量较小时,二者的错误率均为0,当并发量为500 时,搭载Nginx 负载均衡的系统平均错误率小于无Nginx负载均衡系统。

5 结语

本文针对传统购物网站系统存在的不足,设计并实现了以微服务技术为架构,加入Redis 缓存技术、Nginx 负载均衡技术的购物网站。通过实验证明了Redis 缓存数据库可以提升数据的读取速度,Ngnix 负载均衡技术可以缓解服务器的访问压力,提高系统并发能力,以便企业更好地应对未来业务量增大带来的问题,提升经济效益。由于实验条件限制,数据库主备设计仅扩展到“二主二从”,距离满足现实情况还有一定差距,但设计思想有一定的参考价值。由于本文研究重点为提升购物网站系统的整体并发性,未考虑到大型促销活动,如“双十一”等瞬间高并发请求给系统带来的访问压力,后续需在流量削峰方面作进一步研究,扩大该系统的应用范围。

Table 2 Multi node server test result with or without Nginx load balancing表2 有无Nginx负载均衡的多节点服务器测试结果

猜你喜欢

购物架构框架
基于FPGA的RNN硬件加速架构
框架
功能架构在电子电气架构开发中的应用和实践
广义框架的不相交性
我们为什么选择网上购物?
圣诞购物季
LSN DCI EVPN VxLAN组网架构研究及实现
WTO框架下
不可错过的“购物”APP
一种基于OpenStack的云应用开发框架