携程大数据实践:高并发应用架构及推荐系统案例

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 本文来自携程技术中心基础业务研发部的《应用架构涅槃》系列分享。据基础业务研发部负责人李小林介绍,互联网二次革命的移动互联网时代,如何吸引用户、留住用户并深入挖掘用户价值,在激烈的竞争中脱颖而出,是各大电商的重要课题。

本文来自携程技术中心基础业务研发部的《应用架构涅槃》系列分享。据基础业务研发部负责人李小林介绍,互联网二次革命的移动互联网时代,如何吸引用户、留住用户并深入挖掘用户价值,在激烈的竞争中脱颖而出,是各大电商的重要课题。通过各类大数据对用户进行研究,以数据驱动产品是解决这个课题的主要手段,携程的大数据团队也由此应运而生;经过几年的努力,大数据的相关技术为业务带来了惊人的提升与帮助。以基础大数据的用户意图服务为例,通过将广告和栏位的“千人一面”变为“千人千面”,在提升用户便捷性,可用性,降低费力度的同时,其转化率也得到了数倍的提升,体现了大数据服务的真正价值。

在李小林看来,大数据是互联网行业发展的趋势,互联网的从业人员需要高度关注大数据相关的技术及应用,也希望通过这一系列大数据相关的讲座,让各位同学有所收获。

首场《应用架构涅磐》分享来自基础业务研发部的董锐,包括业务高速发展带来的应用架构挑战、应对挑战的架构涅磐、应用系统整体架构和推荐系统案例等四个部分。


一、业务高速发展带来的应用架构挑战

公司业务高速发展带来哪些主要的变化,以及给我们的系统带来了哪些挑战?

1.业务需求的急速增长,访问请求的并发量激增,2016年1月份以来,业务部门的服务日均请求量激增了5.5倍。

2.业务逻辑日益复杂化,基础业务研发部需要支撑起OTA数十个业务线,业务逻辑日趋复杂和繁多。

3.业务数据源多样化,异构化,接入的业务线、合作公司的数据源越来越多;接入的数据结构由以前的数据库结构化数据整合转为Hive表、评论文本数据、日志数据、天气数据、网页数据等多元化异构数据整合。

4.业务的高速发展和迭代,部门一直以追求以最少的开发人力,以架构和系统的技术优化,支撑起携程各业务线高速发展和迭代的需要。

在这种新形势下,传统应用架构不得不变,做为工程师也必然要自我涅槃,改为大数据及新的高并发架构,来应对业务需求激增及高速迭代的需要。计算分层分解、去SQL、去数据库化、模块化拆解的相关技改工作已经刻不容缓。


img_8bb94d69c43616b74b0c7e3bbaa1deb8.jpg


以用户意图(AI 点金杖)的个性化服务为例, 面对BU业务线的全面支持的迫切需要,其应用架构必须解决如下技术难点:

1.高访问并发:每天近亿次的访问请求;

2.数据量大:每天TB级的增量数据,近百亿条的用户数据,上百万的产品数据;

3.业务逻辑复杂:复杂个性化算法和LBS算法;例如:满足一个复杂用户请求需要大量计算和30次左右的SQL数据查询,服务延时越来越长;

4.高速迭代上线:面对OTA多业务线的个性化、Cross-saling、Up-saling、需满足提升转化率的迫切需求,迭代栏位或场景要快速,同时减少研发成本。

二、应对挑战的架构涅磐

面对这些挑战,我们的应用系统架构应该如何涅磐?主要分如下三大方面系统详解:

?存储的涅磐,这一点对于整个系统的吞吐量和并发量的提升起到最关键的作用,需要结合数据存储模型和具体应用的场景。

?计算的涅磐,可以从横向和纵向考虑:横向主要是增加并发度,首先想到的是分布式。纵向拆分就是要求我们找到计算的结合点从而进行分层,针对不同的层次选择不同的计算地点。然后再将各层次计算完后的结果相结合,尽可能最大化系统整体的处理能力。

?业务层架构的涅磐,要求系统的良好的模块化设计,清楚的定义模块的边界,模块自升级和可配置化。

三、应用系统的整体架构

认识到需要应对的挑战,我们应该如何设计我们的系统呢,下面将全面的介绍下我们的应用系统整体架构。

下图就是我们应用系统整体架构以及系统层次的模块构成。


img_df849bea2212cf9785a33e001ad75935.jpg


数据源部分,Hermes是携程框架部门提供的消息队列,基于Kafka和MySQL做为底层实现的封装,应用于系统间实时数据传输交互通道。Hive和HDFS是携程海量数据的主要存储,两者来自Hadoop生态体系。Hadoop大家已经很熟悉,如果不熟悉的同学只要知道Hadoop主要用于大数据量存储和并行计算批处理工作。

Hive是基于Hadoop平台的数据仓库,沿用了关系型数据库的很多概念。比如说数据库和表,还有一套近似于SQL的查询接口的支持,在Hive里叫做HQL,但是其底层的实现细节和关系型数据库完全不一样,Hive底层所有的计算都是基于MR来完成,我们的数据工程师90%都数据处理工作都基于它来完成。

离线部分,包含的模块有MR、Hive、Mahout、SparkQL/MLLib。Hive上面已经介绍过,Mahout简单理解提供基于Hadoop平台进行数据挖掘的一些机器学习的算法包。Spark类似hadoop也是提供大数据并行批量处理平台,但是它是基于内存的。SparkQL 和Spark MLLib是基于Spark平台的SQL查询引擎和数据挖掘相关算法框架。我们主要用Mahout和Spark MLLib进行数据挖掘工作。

调度系统zeus,是淘宝开源大数据平台调度系统,于2015年引进到携程,之后我们进行了重构和功能升级,做为携程大数据平台的作业调度平台。

近线部分,是基于Muise来实现我们的近实时的计算场景,Muise是也是携程OPS提供的实时计算流处理平台,内部是基于Storm实现与HERMES消息队列搭配起来使用。例如,我们使用MUSIE通过消费来自消息队列里的用户实时行为,订单记录,结合画像等一起基础数据,经一系列复杂的规则和算法,实时的识别出用户的行程意图。

后台/线上应用部分,MySQL用于支撑后台系统的数据库。ElasticSearch是基于Lucene实现的分布式搜索引擎,用于索引用户画像的数据,支持离线精准营销的用户筛选,同时支持线上应用推荐系统的选品功能。HBase 基于Hadoop的HDFS 上的列存储NoSQL数据库,用于后台报表可视化系统和线上服务的数据存储。

这里说明一下, 在线和后台应用使用的ElasticSearch和HBase集群是分开的,互不影响。Redis支持在线服务的高速缓存,用于缓存统计分析出来的热点数据。

四、推荐系统案例

介绍完我们应用系统的整体构成,接下来分享基于这套系统架构实现的一个实例——携程个性化推荐系统。

推荐系统的架构图:


img_974cafe9d05f7cda1216b8a893aa4b6c.jpg


1、存储的涅磐

1)NoSQL (HBase+Redis)


img_60deb27506759628b4bd00fb6907b754.jpg


我们之前存储使用的是MySQL,一般关系型数据库会做为应用系统存储的首选。大家知道MySQL非商业版对分布式支持不够,在存储数据量不高,查询量和计算复杂度不是很大的情况下,可以满足应用系统绝大部分的功能需求。

我们现状是需要安全存储海量的数据,高吞吐,并发能力强,同时随着数据量和请求量的快速增加,能够通过加节点来扩容。另外还需要支持故障转移,自动恢复,无需额外的运维成本。综上几个主要因素,我们进行了大量的调研和测试,最终我们选用HBase和Redis两个NoSQL数据库来取代以往使用的MySQL。我们把用户意图以及推荐产品数据以KV的形式存储在HBase中,我对操作HBase进行一些优化,其中包括rowkey的设计,预分配,数据压缩等,同时针对我们的使用场景对HBase本身配置方面的也进行了调优。目前存储的数据量已经达到TB级别,支持每天千万次请求,同时保证99%在50毫秒内返回。


img_e757749846676d21b0f19184202576f7.jpg


Redis和多数应用系统使用方式一样,主要用于缓存热点数据,这里就不多说了。


img_f3046685d6e1716e1da0c7b5912cee8d.jpg


2)搜索引擎 (ElasticSearch)


img_d5defda48db45c5dce2e0f484a81d5cf.jpg


ES索引各业务线产品特征数据,提供基于用户的意图特征和产品特征复杂的多维检索和排序功能,当前集群由4台大内存物理机器构成,采用全内存索引。对比某一个复杂的查询场景,之前用MySQL将近需要30次查询,使用ES只需要一次组合查询且在100毫秒内返回。目前每天千万次搜索,99%以上在300毫秒以内返回。


img_b05e943a0a6508c78d3a0a59752e7772.jpg


2、计算的涅磐

1)数据源,我们的数据源分结构化和半结构化数据以及非结构化数据。


img_dc36db0f5d0f7c1b0f1edcb56ddecbde.jpg


结构化数据主要是指携程各产线的产品维表和订单数据,有酒店、景酒、团队游、门票、景点等,还有一些基础数据,比如城市表、车站等,这类数据基本上都是T+1,每天会有流程去各BU的生产表拉取数据。

半结构化数据是指,携程用户的访问行为数据,例如浏览、搜索、预订、反馈等,这边顺便提一下,这些数据这些是由前端采集框架实时采集,然后下发到后端的收集服务,由收集服务在写入到Hermes消息队列,一路会落地到Hadoop上面做长期存储,另一路近线层可以通过订阅Hermes此类数据Topic进行近实时的计算工作。

我们还用到外部合作渠道的数据,还有一些评论数据,评论属于非结构化的,也是T+1更新。

2)离线计算,主要分三个处理阶段。


img_cdcef58d8351c18ff57f7538e8d9ce0b.jpg


预处理阶段,这块主要为后续数据挖掘做一些数据的准备工作,数据去重,过滤,对缺失信息的补足。举例来说采集下来的用户行为数据,所含有的产品信息很少,我们会使用产品表的数据进行一些补足,确保给后续的数据挖掘使用时候尽量完整的。

数据挖掘阶段,主要运用一些常用的数据挖掘算法进行模型训练和推荐数据的输出(分类、聚类、回归、CF等)。

结果导入阶段,我们通过可配置的数据导入工具将推荐数据,进行一系列转换后,导入到HBase、Redis以及建立ES索引,Redis存储的是经统计计算出的热点数据。

3)近线计算(用户意图、产品缓存)

当用户没有明确的目的性情况下,很难找到满足兴趣的产品,我们不仅需要了解用户的历史兴趣,用户实时行为特征的抽取和理解更加重要,以便快速的推荐出符合用户当前兴趣的产品,这就是用户意图服务需要实现的功能。

一般来说用户特征分成两大类:一种是稳定的特征(用户画像),如用户性别、常住地、主题偏好等特征;另一类是根据用户行为计算获取的特征,如用户对酒店星级的偏好、目的地偏好、跟团游/自由行偏好等。基于前面所述的计算的特点,我们使用近在线计算来获取第二类用户特征,整体框图如下。从图中可以看出它的输入数据源包括两大类:第一类是实时的用户行为;第二类是用户画像,历史交易以及情景等离线模块提供的数据。结合这两类数据,经一些列复杂的近线学习算法和规则引擎,计算得出用户当前实时意图列表存储到HBase和Redis中。


img_85afd2686ea275484b1f04b36cb45f0c.jpg


携程用户意图框架

近线另一个工作是产品数据缓存,携程的业务线很多,而我们的推荐系统会推各个业务线的产品,因此我们需要调用所有业务线的产品服务接口,但随着我们上线的场景的增加,这样无形的增加了对业务方接口的调用压力。而且业务线产品接口服务主要应用于业务的主流程或关键型应用,比较重,且SLA服务等级层次不齐,可能会影响到整个推荐系统的响应时间。

为了解决这两个问题,我们设计了近在线计算来进行业务的产品信息异步缓存策略,具体的流程如下。

我们会将待推荐的产品Id全部通过Kafka异步下发,在Storm中我们会对各业务方的产品首先进行聚合,达到批处理个数或者时间gap时,再调用各业务方的接口,这样减少对业务方接口的压力。通过调用业务方接口更新的产品状态临时缓存起来(根据各业务产品信息更新周期分别设置缓存失效时间),在线计算的时候直接先读取临时缓存数据,缓存不存在的情况下,再击穿到业务的接口服务。


img_c3e8b8d96b83c01e1f4564e031902b44.jpg


产品异步缓存框架

4)在线计算(2个关键业务层架构模块介绍)

①业务层架构-数据治理和访问模块,支持的存储介质,目前支持的存储介质有Localcache、Redis、HBase、MySQL可以支持横向扩展。统一配置,对同一份数据,采用统一配置,可以随意存储在任意介质,根据id查询返回统一格式的数据,对查询接口完全透明。

穿透策略和容灾策略,Redis只存储了热数据,当需要查询冷数据则可以自动到下一级存储如HBase查询,避免缓存资源浪费。当Redis出现故障时或请求数异常上涨,超过整体承受能力,此时服务降级自动生效,并可配置化。


img_891a68ce93e55b5b0cec2926bf48d139.jpg


②业务层架构-推荐策略模块,整个流程是先将用户意图、用户浏览,相关推荐策略生成的产品集合等做为数据输入,接着按照场景规则,业务逻辑重新过滤,聚合、排序。最后验证和拼装业务线产品信息后输出推荐结果;

我们对此流程每一步进行了一些模块化的抽象,将重排序逻辑按步骤抽象解耦,抽象如右图所示的多个组件,开发新接口时仅需要将内部DSL拼装便可以得到满足业务需求的推荐服务;提高了代码的复用率和可读性,减少了超过50%的开发时间;对于充分验证的模块的复用,有效保证了服务的质量。


相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
2天前
|
运维 监控 API
深入浅出:微服务架构的设计与实践
在软件开发的世界中,微服务架构如同一股清新的风,吹散了单体应用带来的沉重与复杂。本文将带你走进微服务的世界,一探究竟,从理念到实践,我们一同领略微服务的魅力所在。
|
3天前
|
运维 持续交付 开发者
深入浅出:微服务架构的设计与实践
在数字化浪潮的推动下,微服务架构以其独特的优势成为软件开发领域的新宠。本文将通过浅显易懂的语言,带领读者从理论到实践,一探微服务架构的奥秘。我们将一起学习如何设计一个高效、可扩展且易于维护的微服务系统,并探讨实施过程中可能遇到的挑战及解决方案。无论你是软件架构的初学者,还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和指导。
17 3
|
1天前
|
搜索推荐 API 开发者
深入浅出:微服务架构的设计与实践
在数字化时代的浪潮下,微服务架构以其灵活性、可扩展性和独立部署的特点,成为众多企业技术选型的宠儿。本文将通过浅显易懂的语言和生动的比喻,带领读者一探微服务世界的奥秘,从基础概念到实际案例,逐步揭示如何设计并实施一个高效、稳定的微服务系统。无论你是技术小白还是资深开发者,这篇文章都将为你打开一扇了解和应用微服务的大门。
|
1天前
|
消息中间件 API 持续交付
深入浅出:微服务架构的设计与实践
在软件开发的广阔海洋中,微服务架构如同一艘灵活的帆船,它以模块化的方式切割复杂的单体应用,让服务独立、轻盈且易于管理。本文将带你从理论到实践,一步步揭开微服务的神秘面纱,探讨如何设计并实现一个高效、可扩展的微服务系统。无论你是架构新手还是资深开发者,这篇文章都将为你提供新的视角和实用的技巧。
16 6
|
1天前
|
设计模式 消息中间件 监控
深入浅出微服务架构:从理论到实践
探索微服务,不仅是技术的革新,也是思维的革命。本文将带你走进微服务的世界,了解其核心理念、设计模式及实际应用案例,让你对微服务有更深入的认识和理解。
13 3
|
3天前
|
监控 负载均衡 应用服务中间件
探索微服务架构下的API网关设计与实践
在数字化浪潮中,微服务架构以其灵活性和可扩展性成为企业IT架构的宠儿。本文将深入浅出地介绍微服务架构下API网关的关键作用,探讨其设计原则与实践要点,旨在帮助读者更好地理解和应用API网关,优化微服务间的通信效率和安全性,实现服务的高可用性和伸缩性。
13 3
|
4天前
|
监控 Cloud Native 安全
云原生时代的微服务架构实践
【9月更文挑战第6天】在数字化转型的浪潮中,云原生技术以其灵活性、可扩展性成为企业架构升级的首选。本文将通过浅显易懂的语言和生动的比喻,带你一探微服务架构的世界,从理论到实践,逐步揭示如何利用云原生技术构建高效、可靠的微服务系统,同时穿插代码示例,为有志于云原生领域发展的技术人员提供一份实操指南。
20 2
|
14天前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。
|
6天前
|
存储 Java Maven
从零到微服务专家:用Micronaut框架轻松构建未来架构
【9月更文挑战第5天】在现代软件开发中,微服务架构因提升应用的可伸缩性和灵活性而广受欢迎。Micronaut 是一个轻量级的 Java 框架,适合构建微服务。本文介绍如何从零开始使用 Micronaut 搭建微服务架构,包括设置开发环境、创建 Maven 项目并添加 Micronaut 依赖,编写主类启动应用,以及添加控制器处理 HTTP 请求。通过示例代码展示如何实现简单的 “Hello, World!” 功能,并介绍如何通过添加更多依赖来扩展应用功能,如数据访问、验证和安全性等。Micronaut 的强大和灵活性使你能够快速构建复杂的微服务系统。
26 5
|
14天前
|
消息中间件 Java 网络架构
AMQP与微服务架构的集成策略
【8月更文第28天】在微服务架构中,各个服务通常通过HTTP/REST、gRPC等协议进行交互。虽然这些方法在很多场景下工作得很好,但在需要高并发、低延迟或需要处理大量消息的情况下,传统的同步调用方式可能无法满足需求。此时,AMQP作为异步通信的一种标准协议,可以提供一种更为灵活和高效的消息传递机制。
18 1