邵阳阳,徐子良,姜玉波,李成龙,田 甜
(山东建筑大学 计算机科学与技术学院,山东 济南 250101)
互联网技术的迅速发展使得人类获得信息的途径更加广泛,推荐算法是从繁杂信息中快速获取个性化需求数据的有力工具[1],以机器学习为代表的新一代人工智能技术已得到了广泛应用[2]。隐语义模型(Latent Factor Model,LFM)算法是一种典型的推荐算法,常被用在推荐系统和文本分类中。利用推荐算法实现用户数据个性化推荐是开发在线购物平台首要考虑的问题。同时,缓解无意义流量产生的冗余访问压力,降低后期代码维护难度也是在线购物平台需要解决的核心问题。
针对在线购物平台的个性化数据推荐、无意义流量和代码维护等问题,本文给出了相应的解决方案。
首先,系统通过数据实时同步工具Maxwell[3]实时读取MySQL二进制日志文件binlog,采集用户浏览数据和购买数据,并推送至开源消息代理软件RabbitMQ[4]中;由日志收集系统Flume[5]接收RabbitMQ中的数据并存储至分布式架构Hadoop[6]中;利用推荐服务读取Hadoop中的数据,实现用户喜爱商品的预测和推荐。其次,针对无意义流量对子系统产生冗余压力的问题,系统利用微服务网关Zuul[7],限制窗口期时间内同一IP地址对相同子系统路由的访问量,在网关服务器处拦截流量,以减少子系统的流量压力。最后,为了降低代码维护难度,系统使用微服务网关Zuul和Nacos注册中心[8]实现动态路由代理,使得在增加服务器时,由动态路由代理自动将流量分发至新增服务器已注册的子系统中,Web端无需修改任何路由代码。
本文结构如下:第2节综述相关工作,第3节阐述基于LFM的协同过滤推荐算法,第4节介绍基于Spring Cloud的分布式平台,第5节是基于LFM算法的SpringCloud分布式购物系统的功能实现,第6节总结全文并展望下一步工作。
本节从协同过滤推荐算法和分布式架构两方面综述相关工作。协同过滤是最经典且目前应用最为广泛的推荐算法之一[9],该算法无需特定领域知识,主要包括在线协同和离线过滤两部分。所谓在线协同,即通过在线数据寻找用户可能的偏好内容;而离线过滤,则是过滤掉推荐值低或推荐值高但已使用过的数据。基本的协同过滤推荐算法主要分为基于用户的协同过滤(User-Based Collaborative Filtering)[10]、基于物品的协同过滤(Item-Based Collaborative Filtering)[11],以及基于模型的协同过滤(Model-Based Collaborative Filtering)[12]三 种。
本文采用的LFM推荐算法,是一种隐含语义分析技术,最早在文本挖掘领域被提出,用于表示文本的潜在语义[13]。LFM推荐算法不依赖于共同评分矩阵,基本思想如下:将用户和商品的内容分别映射到真实含义未知的特征向量中,通过发掘用户与其所关注的商品间的隐含联系,判断两者之间潜在的关注关系并做出推荐。例如,在推荐系统中能够基于用户的行为对商品进行自动聚类,即将商品划分为不同类别,该类别就可以理解为用户感兴趣的商品。近些年,该技术被不断应用到其它领域中,并得到不错的应用效果,但其性能容易受到数据稀疏和冷启动问题的制约[14]。
冷启动是指系统刚开始运行时,由于后台整合的数据不足,无法合理地分析数据,从而无法给客户提供精准的推荐服务[14]。为解决该问题,郑鹏等提出一种用户隐式信任计算方法,建立用户间接信任,在一定程度上改善了冷启动问题[15]。Kai等通过融合用户评分项目和其类型计算用户相似度, 并设计相应的协同过滤算法,实现了推荐结果的高准确性[16]。Duricic等将网络科学中的一种度量方法,正则等价,应用到信任网络中生成一个相似度矩阵,用于选k最近邻进行推荐,在一定程度上解决了冷启动问题[17]。
用户量的激增给系统的负载能力带来了极大的挑战。对单一应用架构而言,由于应用程序中的所有功能在同一系统内实现,巨大访问量易导致服务崩溃,同时,各种问题也会随着需求迭代接踵而来[18]。作为一种关注全局的分布式框架,SpringCloud是解决上述问题的有力工具。基于SpringCloud架构,蔡勋玮等实现了新型供电系统数据挖掘方法的应用,更好地掌握了供电负荷量的实际变化规律[19];王蓉等设计并实现医疗信息共享平台,进一步提高医疗信息的共享和交换能力[20];Yang等设计在线点餐系统,在准确判断食品配料量的同时满足不同居民的就餐需求[21]。
基于上述工作,本文利用SpringCloud以及LFM算法,实现了基于LFM算法的SpringCloud分布式购物系统。针对所有微服务接口,系统采用Spring Security框架进行统一鉴权;使用微服务网关Zuul进行全局路由代理,配合Nacos注册中心和Zuul实现动态路由;利用数据实时同步工具Maxwell采集用户浏览信息,由Maxwell推送信息至开源消息代理软件RabbitMQ;由日志收集系统Flume主动接收RabbitMQ中的数据并下沉至分布式架构Hadoop中。在该分布式购物系统中,数据采集模块通过模块初始化以保持日常应用中稳定的采集与输出,经过数据预处理后由推荐模块执行推荐算法获得推荐数据。
近些年,企业对个性化推荐系统的需求在不断增长,其主要原因是,可以帮助用户过滤信息,进而发掘用户所需内容。无论是影视推荐、电子商务,还是社交平台,推荐算法都扮演着重要角色[22]。
LFM作为一种常用的推荐算法,其基本思想为:根据用户的历史行为数据分析其偏好特征,并基于偏好特征为用户u推荐相应的商品i[22,23]。事实上,我们只能获得用户的行为数据共现矩阵R。LFM算法通过引入潜在因子表示用户和商品,最终将共现矩阵R分解为两个低维度的矩阵:潜在因子-用户矩阵pu和潜在因子-商品矩阵qi。LFM原理的矩阵表示如图1所示。
潜在因子-用户矩阵pu表述为pu=m×k,潜在因子-商品矩阵qi表述为qi=k×n,其中,m表示用户的数量,n表示商品的数量,k表示潜在因子,即影响用户u对商品i偏好程度的隐藏特征。
共现矩阵R和低维矩阵pu和qi的关系如
(1)
式中K表示潜在因子的数量;puk表示用户u与第k个潜在因子的关系;qik表示商品i与第k个潜在因子的关系;puk和qik作为参数用于模型训练。 LFM算法通过计算式(1)获得用户对商品的偏好程度。
采用的损失函数为平方误差损失函数loss1,如
(2)
式中r(u,i)表示共现矩阵中的值,即训练样本中的标签,点击时值为1,否则为0;rLFM(u,i)表示模型预估用户对商品喜爱程度的值;D表示所有训练样本集合;当r(u,i)和rLFM(u,i)越接近时,损失函数越小。
在式(2)中,为防止模型过拟合,加入正则化表达式λ(‖pu‖+‖qi‖)2限制模型参数,以增强其泛化能力。由此得到新的损失函数loss2,如
(3)
式中λ表示正则化系数,基于不同场景的重复试验得到。
此外,使用随机梯度下降 (Stochastic Gradient Descent, SGD) 算法[24]进一步优化求解最小化损失函数,当经过足够次数的迭代时,SGD可收敛至局部最优解。具体地说,首先,获取未知数puk和qik的偏导值,如式(4)和式(5)所示
(4)
(5)
然后,基于SGD进行迭代计算,puk和qik沿梯度的负方向不断更新,对应参数更新公式如式(6)和式(7)所示,达到预期目标时,可停止训练。
puk=puk+α[qik(r(u,i)-rLFM(u,i))]-λpuk,
(6)
qik=qik+α[puk(r(u,i)-rLFM(u,i))]-λqik,
(7)
式中α为学习率,学习率随迭代次数不断变化。
LFM推荐算法实现如算法1所示。第2~3行定义并初始化矩阵pu、qi以及潜在因子个数K,迭代次数N,学习率α,正则化系数λ;第4~11行是模型训练过程,其中,从第4行开始迭代;第5~6行通过从数据集中抽取u及i样本实现优化计算;第7行用于获取用户对商品的偏好程度;第8行基于当前参数值计算误差值E(u,i);第9~11行基于式(6)和式(7)实现参数优化。
基于SpringCloud的分布式平台利用LFM的协同过滤推荐算法实现用户推荐,提供了包括前端应用、后台服务、算法实现和平台部署等多方位的闭环业务实现方案,其业务实现流程如图2所示。基于SpringCloud的分布式平台分为综合业务、数据存储和日志服务三大部分。
图2 业务实现方案
综合业务主要包括3部分:(1) 用户可视化:实现用户交互和业务数据展示,主体采用VUE框架实现并部署在Nginx服务上; (2) 业务服务:通过Spring进行构建,对接业务需求,并部署在应用服务器Tomcat上,以实现JavaEE层面业务逻辑; (3) 推荐服务:利用Hadoop中存储的数据,使用推荐算法为用户进行个性化推荐。
数据存储主要包括3部分:(1) 业务数据库:采用MySQL作为主数据库,负责平台业务逻辑数据的存储; (2) 缓存数据库:采用Redis[25]作为缓存数据库,为推荐系统实时高速获取需求数据提供支撑; (3) 浏览数据存储服务:使用Hadoop利用集群进行高速运算和存储,实现分布式文件存储系统。
日志服务主要包括2部分:(1) 日志采集服务:通过数据采集系统Flume-NG采集业务平台中用户的评分行为,实时发送到RabbitMQ中; (2) 消息缓冲服务:采用RabbitMQ作为流式数据的缓存组件,接受来自Flume的数据采集及业务请求,将数据推送到Hadoop存储系统部分。基于此,实现基于SpringCloud框架,兼顾数据存储、日志采集和系统推荐功能的高可用分布式平台架构。
本节是基于LFM算法的SpringCloud分布式购物系统的功能实现,主要包括系统架构和主要功能。
本系统中服务端包括用户端、商家端、管理端和运维端四个部分,内部系统包括Web服务器、商品服务、订单服务、用户管理服务、推荐服务、统一鉴权中心服务以及数据库服务器。
用户通过Web服务器域名进行访问,由Nginx路由代理分散用户访问流量至不同服务器,从而实现Web端负载均衡;再由Web端通过统一鉴权中心进行权限验证,以配合Zuul和Nacos注册中心将流量分配至不同服务器上的微服务模块,由此实现服务端的负载均衡。系统中各模块均与数据库服务器进行数据交互,产生的部分数据由Maxwell实时读取并推送至RabbitMQ,由Flume采集数据下沉至Hadoop中存储。推荐服务模块基于LFM算法实现采集推荐,推荐服务会将产生的推荐信息存储至数据库服务器中,由前端调用接口实现数据交互,完成前后端交互。系统架构及交互方式如图3所示。
图3 系统总体架构
在推荐服务中,使用LFM算法的主要优势包括两方面:一是无需关心分类角度问题,结果均基于用户行为统计自动聚类;二是无需关心分类粒度问题,粒度的大小取决于潜在因子数量K。SpringCloud架构耦合性小,在系统开发过程中,服务器端的多个模块不会相互影响。
5.2.1 路由代理配置。(1) Zuul+Nacos动态路由代理。实现动态路由代理需要配置两个中心:配置和注册中心,其中,配置中心总结各个微服务模块的配置文件,通过路径映射完成配置;注册中心注册各个微服务模块的功能和端口号;系统采用Nacos集成注册中心和配置中心。
Zuul+Nacos动态路由代理服务在Nacos注册中心被发现,Zuul通过读取对应路由实现API网关,新增服务在Nacos中完成注册,由微服务网关Zuul实现服务的动态代理,对应流程如图4所示。
图4 动态路由代理流程
(2) Nginx路由代理配置。Nginx实现客户端的负载均衡,正常情况下,其处理单次请求响应速度更快;高并发请求情况下,Nginx的响应请求速度也快于其它Web服务器。Nginx单机支持10 万以上的并发连接,利用Nginx的特性,将用户URL代理到指定页面,统一管理上传文件位置,实现Nginx路由代理配置,对应流程如图5所示。
图5 Nginx路由代理配置
5.2.2 RabbitMQ数据源配置。系统通过Maxwell采集MySQL中用户产生的数据信息,主动推送至RabbitMQ,再由RabbitMQ推送至Flume,最终下沉至Hadoop中。鉴于Flume无法直接接收来自RabbitMQ的数据,需要针对Flume单独开发插件,以允许Flume获取RabbitMQ中的数据。Flume采集RabbitMQ数据推送至Hadoop中。实现流程如图6所示。
图6 Flume采集RabbitMQ数据推送至Hadoop中实现流程
5.2.3 推荐服务实现。推荐服务实现是从Hadoop中读取数据并进行数据清洗,即删除无效信息,并将期望数据信息存储至本地文件。推荐服务模块采用LFM算法,通过奇异值矩阵分解(Singular Value Decomposition,SVD)[26]处理评分矩阵,基于用户的潜在特征评价缺失项目。系统通过定时任务每日执行一次,执行过程中推荐程序读取本地文件信息,LFM算法设置迭代次数为50,通过迭代后的数据,系统为每个用户推荐4 条数据,并实例化到数据库中。推荐服务流程如图7所示,实现逻辑如图8所示。
图7 推荐服务流程
5.2.4 用户购买商品实现。当用户购买商品时,由商品服务先对用户购买的商品加分布式锁,并核验库存信息。当库存容量足够时,商品服务将购买数据发送至RabbitMQ中并使库存减1,消息队列获取数据后等待订单服务消费,消费完成后将数据存入数据库中,对应流程如图9所示。
图9 用户购买商品流程
5.2.5 服务上传部署。首先,后台管理端获取并读取用户上传的文件信息,基于文件名创建对应文件夹,文件路径为“Linux服务器/opt”,并将用户上传的文件存储至该文件夹下,使用SSH协议包连接至Linux服务,通过执行对应Linux语句运行jar包,对应流程如图10所示。
图10 服务上传部署
本系统基于Java语言、SpringCloud后端开发框架、Hadoop分布式架构、Flume日志收集系统、Maxwell数据实时同步工具、MySQL数据库和Redis临时数据库,实现了基于LFM算法的分布式购物系统。系统采用LFM算法,综合考虑用户与历史浏览商品特征间的相似性,实现了用户偏好数据的个性化推荐。为应对高并发情况,采用分布式系统,使用微服务网关进行限流处理,减少了高并发环境下无意义流量对系统的压力。当微服务系统压力过大时,系统主动为响应过慢的服务降级,从而减少访问压力,当该服务响应时间恢复正常时,系统通过提高服务级别的方式降低服务宕机的可能性。此外,系统还使用微服务网关Zuul和Nacos注册中心实现动态路由代理,自动将流量分发至新增服务器已注册的子系统中,改善了后期系统维护中代码修改困难的问题。在未来的研究工作中,我们将对基于LFM算法的分布式购物系统做进一步优化。